SQLite指南-处理databaseislocked的方法.doc

上传人:自*** 文档编号:126244533 上传时间:2020-03-23 格式:DOC 页数:3 大小:52.45KB
返回 下载 相关 举报
SQLite指南-处理databaseislocked的方法.doc_第1页
第1页 / 共3页
SQLite指南-处理databaseislocked的方法.doc_第2页
第2页 / 共3页
SQLite指南-处理databaseislocked的方法.doc_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《SQLite指南-处理databaseislocked的方法.doc》由会员分享,可在线阅读,更多相关《SQLite指南-处理databaseislocked的方法.doc(3页珍藏版)》请在金锄头文库上搜索。

1、SQLite指南(6)-处理database is locked的方法 博客分类: DB2|PostgreSQL|SQLite|Others解决方法有: 1。使用进程或线程间的同步机制以避免同时操作;如用信号量,互斥锁等(pthread_mutex_lock,pthread_mutex_unlock),如果你的项目工程较大要求较高的话建议用此方法自行封装函数处理同步 2。使用sqlite提供的两个busy handler函数,但对于一个连接来说,只能有一个busy handle,两个函数会相互影响,设置一个的同时会清除另一个,应根据需要来选择。 int sqlite3_busy_handler

2、(sqlite3 *, int (*)(void *, int), void *) 不注册此函数时默认回调函数为NULL,清除busy handle,申请不到锁直接返回; 函数可以定义一个回调函数,当出现数据库忙时sqlite会调用该函数进行延时并返回非0会重试本次操作,回调函数的第二个参数会被传递为此次因BUSY忙事件而调用该函数的次数,因此你完全可以自行控制多少次后(也就是延时多少后)才真正返回BUSY; 回调函数返回非,数据库会重试当前操作,返回则当前操作返回SQLITE_BUSY; int sqlite3_busy_timeout(sqlite3*, int ms); 不注册此函数时默

3、认超时等待为0,当msbusyTimeout; 15. intdelay,prior; 16. assert(count=0); 17. if(counttimeout) 25. delay=timeout-prior; 26. if(delaypVfs,delay*1000); 29. return1; 30. #else31. sqlite3*db=(sqlite3*)ptr; 32. inttimeout=(sqlite3*)ptr)-busyTimeout; 33. if(count+1)*1000timeout) 34. return0;/1000timeout,sotimeoutm

4、ustbiggerthan1000 35. 36. sqlite3OsSleep(db-pVfs,1000000);/1000ms 37. return1; 38. #endif 39. 40. 41. intsqlite3_busy_timeout(sqlite3*db,intms) 42. if(ms0) 43. db-busyTimeout=ms; 44. sqlite3_busy_handler(db,sqliteDefaultBusyCallback,(void*)db); 45. else 46. sqlite3_busy_handler(db,0,0); 47. 48. retu

5、rnSQLITE_OK; 49. 附:=static int sqliteDefaultBusyCallback( void *ptr, /* Database connection */ int count /* Number of times table has been busy */)#if SQLITE_OS_WIN | (defined(HAVE_USLEEP) & HAVE_USLEEP) static const u8 delays = 1, 2, 5, 10, 15, 20, 25, 25, 25, 50, 50, 100 ; static const u8 totals =

6、 0, 1, 3, 8, 18, 33, 53, 78, 103, 128, 178, 228 ;# define NDELAY (sizeof(delays)/sizeof(delays0) sqlite3 *db = (sqlite3 *)ptr; int timeout = db-busyTimeout; int delay, prior; assert( count=0 ); if( count timeout ) delay = timeout - prior; if( delaypVfs, delay*1000); return 1;#else sqlite3 *db = (sql

7、ite3 *)ptr; int timeout = (sqlite3 *)ptr)-busyTimeout; if( (count+1)*1000 timeout ) return 0;/1000timeout,so timeout must bigger than 1000 sqlite3OsSleep(db-pVfs, 1000000);/1000ms return 1;#endif int sqlite3_busy_timeout(sqlite3 *db, int ms) if( ms0 ) db-busyTimeout = ms; sqlite3_busy_handler(db, sq

8、liteDefaultBusyCallback, (void*)db); else sqlite3_busy_handler(db, 0, 0); return SQLITE_OK;3、解决方法二 加上一个循环判断。 Java代码 1. while(1) 2. 3. if(SQLITE_OK!=sqlite3_exec(myconn,sql,0,0,&m_sqlerr_msg) 4. 5. if(strstr(m_sqlerr_msg,databaseislocked) 6. 7. sleep(1); 8. continue; 9. 10. break; 11. 12. while( 1 ) if( SQLITE_OK != sqlite3_exec( myconn, sql, 0, 0, &m_sqlerr_msg) ) if( strstr(m_sqlerr_msg, database is locked) ) sleep(1); continue; break; 4、解决方法三 用信号量做PV操作 sem_p(semid,0); sqlite3_exec( myconn, sql, 0, 0, &m_sqlerr_msg); sem_v(semid,0); 上述4个方法是从别处转来。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号