MySQL 5.7: Innodb事务对象缓存

在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_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

原创文章,转载请注明: 转载自Simple Life

本文链接地址: MySQL 5.7: Innodb事务对象缓存

Post Footer automatically generated by wp-posturl plugin for wordpress.


Comments

Leave a Reply

Your email address will not be published. Name and email are required


Current month ye@r day *