TrinityCore框架_数据库模块实现分析
最近更新:2024-09-23
|
字数总计:736
|
阅读估时:2分钟
|
阅读量:次
- 连接池
- 为什么需要复用连接
- 为什么是固定数量
- 主要使用场景
- 线程模型
- 同步连接池
- 异步连接池
- 主线程模型
- 接口封装
- 使用
- 事务处理
- 事务操作
- 事务封装
连接池
为什么需要复用连接
- 复用连接资源
- 避免频繁创建和销毁
为什么是固定数量
- 并发执行sql语句的条数
- 服务端需求决定
- Mysql处理能力
主要使用场景
- 同步(阻塞当前线程)获取执行结果
- 异步(另起线程阻塞,使用回调函数)获取执行结果
线程模型
- TrinityCore中使用的是同步阻塞接口的mysql驱动(意味着即使是异步操作,仍然有一个第三方线程需要阻塞住去等待mysql的结果)
同步连接池
- 意味着该池中,每拿出来的一个连接都可能阻塞住当前的线程
- 当前最多允许几个线程使用连接(意味着即使主线程因为使用同步连接池阻塞住,其余辅助线程仍然可以使用连接池中的连接访问数据库,这就是同步连接池的需求)
异步连接池
- 一个线程可以(并发)投递多个sql执行请求
- 当前最多允许几个连接同时执行sql语句(意味着每有一个异步连接,就会多一个第三方线程去负责处理该连接投递的sql语句)
主线程模型
- 初始化时使用同步连接池中的连接
- 运行期间使用异步连接池中的连接
接口封装
1 2 3 4 5 6 7 8
| DatabaseEnv.h DatabaseEnv.cpp DatabaseWorkerPool.h DatabaseWorkerPool.cpp MySQLConnection.h MySQLConnection.cpp DatabaseWorker.h DatabaseWorker.cpp QueryCallback.h QueryCallback.cpp QueryHandler.h QueryHandler.cpp QueryResult.h QueryResult.cpp Transaction.h Transaction.cpp
|
使用
- 同步接口使用
- 异步接口使用
1 2 3 4 5 6
| Execute AysncQuery DelayQueryHandler AsyncCallbackProcessor.h 调用异步接口的是AddCllback 主循环检测是否收到数据库返回ProcessReadyCallbacks
|
事务处理
- 事务:用户定义的一些系列操作,这些操作要么都做,要么都不做,是不可分割的整体
- 事务讨论场景:并发连接(多条连接操作相关联的数据)
- MySQL网络原型:主线程负责监听新加入的连接,每一个新连接创建一个新的连接线程,而每个线程内部是死循环,不断执行该连接的sql操作。(并发的执行必不可少会有事务问题)
事务操作
1 2 3 4
| begin/start transaction ... rollback commit
|
事务封装
1 2 3 4 5 6 7 8 9
| BeginTransation ExecuteOrAppend DirectCommitTransaction
BeginTransation ExecuteOrAppend CommitTransaction AsyncCommitTransaction
|
2024-06-10
该篇文章被 Cleofwine
归为分类:
Game