在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