加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Sqlite事务模型、性能优化Tips、常见误区

发布时间:2019-09-26 16:58:31 所属栏目:优化 来源:hamsongliu
导读:副标题#e# 0.前言 本文主要介绍sqlite的事务模型,以及基于事务模型的一些性能优化tips,包括事务封装、WAL+读写分离、分库分表、page size优化等。并基于手淘sqlite的使用现状总结了部分常见问题及误区,主要集中在多线程的设置、多线程下性能优化的误区等

如果CoreMutex打开,则会设置全局的锁控制函数

  1. /* If the xMutexAlloc method has not been set, then the user did not 
  2.     ** install a mutex implementation via sqlite3_config() prior to  
  3.     ** sqlite3_initialize() being called. This block copies pointers to 
  4.     ** the default implementation into the sqlite3GlobalConfig structure. 
  5.     */ 
  6.     sqlite3_mutex_methods const *pFrom; 
  7.     sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex; 
  8.  
  9.     if( sqlite3GlobalConfig.bCoreMutex ){ 
  10.       pFrom = sqlite3DefaultMutex(); 
  11.     }else{ 
  12.       pFrom = sqlite3NoopMutex(); 
  13.     } 
  14.     pTo->xMutexInit = pFrom->xMutexInit; 
  15.     pTo->xMutexEnd = pFrom->xMutexEnd; 
  16.     pTo->xMutexFree = pFrom->xMutexFree; 
  17.     pTo->xMutexEnter = pFrom->xMutexEnter; 
  18.     pTo->xMutexTry = pFrom->xMutexTry; 
  19.     pTo->xMutexLeave = pFrom->xMutexLeave; 
  20.     pTo->xMutexHeld = pFrom->xMutexHeld; 
  21.     pTo->xMutexNotheld = pFrom->xMutexNotheld; 
  22.     sqlite3MemoryBarrier(); 
  23.     pTo->xMutexAlloc = pFrom->xMutexAlloc; 
  • 而CoreMutext未打开的话,sqlite3NoopMutex()的实现如下(CoreMutext未打开的话,对应使用的锁函数均为空实现):
  1. sqlite3_mutex_methods const *sqlite3NoopMutex(void){ 
  2.   static const sqlite3_mutex_methods sMutex = { 
  3.     noopMutexInit, 
  4.     noopMutexEnd, 
  5.     noopMutexAlloc, 
  6.     noopMutexFree, 
  7.     noopMutexEnter, 
  8.     noopMutexTry, 
  9.     noopMutexLeave, 
  10.     0, 
  11.     0, 
  12.   }; 
  13.  
  14.   return &sMutex; 
  15.  
  16. // CoreMutext未打开的话,对应使用的锁函数均为空实现 
  17. static int noopMutexInit(void){ return SQLITE_OK; } 
  18. static int noopMutexEnd(void){ return SQLITE_OK; } 
  19. static sqlite3_mutex *noopMutexAlloc(int id){  
  20.   UNUSED_PARAMETER(id); 
  21.   return (sqlite3_mutex*)8;  
  22. static void noopMutexFree(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } 
  23. static void noopMutexEnter(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } 
  24. static int noopMutexTry(sqlite3_mutex *p){ 
  25.   UNUSED_PARAMETER(p); 
  26.   return SQLITE_OK; 
  27. static void noopMutexLeave(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } 
  • FullMutex保护了什么?

粗略看了一下,通过db->mutex(sqlite3_mutex_enter(db->mutex);)保护的逻辑块和函数主要如下列表:

  1. sqlite3_db_status、sqlite3_finalize、sqlite3_reset、sqlite3_step、sqlite3_exec、 
  2. sqlite3_preppare_v2、column_name、blob操作、sqlite3Close、sqlite3_errmsg... 

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读