页面缓存
Pager部分与PCache部分紧密相连,虽然我本次分到的代码并未包含PCache,但是还是简单介绍一下。</br> SQLite将页内存分配系统实现为两层:</br> 1、PCache结构为页内存分配系统的上层接口结构,与具体的实现无关。</br> 2、用户定义缓冲区模块,PCache1结构为页内存分配系统的默认实现,直接对页空间的分配与回收,上层使用者无需关心其内部实现。</br> Pcache.c这个文件实现的是页面缓存。</br> 一个完整的页面缓存是这种结构的一个实例。</br>
struct PCache {
PgHdr *pDirty, *pDirtyTail; /* 按LRU顺序的脏数据页列表 */
PgHdr *pSynced; /* 在脏数据列表中最后同步的页*/
int nRef; /* 引用页的数量 */
int szCache; /* 配置的缓存的大小 */
int szPage; /* 缓存中每个页的大小 */
int szExtra; /* 每个页面的额外空间大小 */
int bPurgeable; /* 如果页面是在后备存储器则为真 */
int (*xStress)(void*,PgHdr*); /* Call to try make a page clean */
void *pStress; /* xStress的参数 */
sqlite3_pcache *pCache; /* Pluggable cache module */
PgHdr *pPage1; /* 指向第一页的指针 */
};
涉及到关于Cache的函数:</br>
1.sqlite3PagerClearCache()</br>
除非这是一个内存或者临时数据库,清除页面缓存</br>
2.sqlite3PagerCacheStat()</br>
参数eStat一定是SQLITE_DBSTATUS_CACHE_HIT或者SQLITE_DBSTATUS_CACHE_MISS。在返回之前,*pnVal是通过当前缓存命中或者未命中计数来增加,通过eStat的值。如果重置参数是非零,缓存命中或者未命中在返回前都是0.</br>
3.sqlite3PagerSetCachesize()</br>
改变所允许的内存页面的最大页数