在5.7中,Innodb引入了一个pool结构来专门做对象缓存重用。这可能会提升短连接场景的性能。本文的目的主要是理清其代码结构。当然主要是作为一个C++小白,学习下C++的一些代码STYLE。
代码版本:MySQL 5.7.5
我们这里以事务对象池为例
1.初始化的过程如下:
trx_pools = UT_NEW_NOKEY(trx_pools_t(MAX_TRX_BLOCK_SIZE));
trx_pools 全局变量,也是操作trx pool的接口,类型为trx_pools_t
其定义如下:
typedef Pool<trx_t, TrxFactory, TrxPoolLock> trx_pool_t;
对应:
template <typename Type, typename Factory, typename LockStrategy>
其中,trx_t表示事务对象类型,TrxFactory封装了事务的初始化和,TrxPoolLock封装了POOL锁的创建,销毁,加锁,解锁。
typedef PoolManager<trx_pool_t, TrxPoolManagerLock >;
PoolManager封装了池的管理方法
显然,这里涉及到多个类:
Pool 及 PoolManager 是共用的类
TrxFactory 和 TrxPoolLock, TrxPoolManagerLock是trx pool私有的类。
–TrxFactory用于定义池中事务对象的初始化和销毁动作;
–TrxPoolLock用于定义每个池中对象的互斥锁操作
–由于POOL的管理结构支持多个POOL对象, TrxPoolManagerLock用于互斥操作增POOL对象。支持多个POOL对象的目的是分拆单个POOL对象的锁开销,因为从POOL中获取和返还对象,都是需要排他锁的。
相关类的关系如下图所示:
#获取一个事务对象:trx_pools->get();
#释放一个事务对象:trx_pools->free(trx);通过trx指针计算出element的起始地址,然后将element放回Pool
2.除了事务对象外,为每个事务对象也缓存了一部分记录锁对象,表锁对象
new(&trx->lock.rec_pool) lock_pool_t();
new(&trx->lock.table_pool) lock_pool_t();
每个事务对象缓存8个记录锁对象(REC_LOCK_CACHE)和 8个表级锁对象(TABLE_LOCK_CACHE),不过这些结构相对上面的就简单多了,只是简单的vector