sqlite3_wal_checkpoint_v2始终返回SQL_BUSY
sqlite3_wal_checkpoint_v2 always returns SQL_BUSY
上下文
我在Windows C++程序中使用sqlite 3.7.7.1版本,我正在创建一个只有一个与sqlite_OPEN_READWRITE|sqlite_OPEN_CREATE|sqlite_OPEN_NOMUTEX连接的数据库。
我使用SQLite是因为我需要非常快速的ACID事务。数据库存储在Windows XP sp3上的NTFS固态驱动器上。
这个数据库有3个表,每个事务包含3个表。最大的事务在其中一个表中插入12行,在另一个表插入1行,并更新第三个表。
我的应用程序有一个400ms的周期,数据库用于在每个周期开始时发生的9个事务。我知道我的平均事务需要15毫秒(60毫秒是非常罕见的峰值(大约60万个事务中有1个在Windows FlushFileBuffers函数中浪费了时间(,所以数据库只用于400毫秒周期的前150毫秒。
基准测试之后,WAL日志为我的应用程序提供了最佳性能。
但是,我对WAL日志有一个问题:xxx-WAL文件正在不停地增长(在500k事务之后,WAL文件为8GB!(。激活auto_checkpoint没有帮助。
当试图通过使用SQLITE_checkpoint_RESTART选项调用sqlite3_wal_checkpoint_v2手动执行检查点时,sqlite3一直返回SQLITE_LOCKED。
我发现,当我使用sqlite3_exec创建一个表时,连接将永远锁定怎么解释?有办法避免这种情况吗
因此,关闭连接并重新打开它,我尝试调用sqlite3_wal_checkpoint_v2,但这次它返回了SQLITE_BUSY。即使我用1秒调用sqlite3_busy_timeout,它仍然返回SQLITE_busy。
问题
知道数据库上只使用了一个连接,这个连接由几个线程使用,但通过我的应用程序端的互斥体序列化,是什么导致数据库繁忙
更多信息:
- 我使用了几个准备好的语句,这些语句是我在整个周期中保存的(甚至有一个用于TRANSACTION BEGIN和TRANSACTION COMMIT(
- 提交第一个事务后,DB似乎很忙
尽管我在sqlite网站上阅读过,但我很难理解sqlite的锁定和繁忙方案。有人在这方面有好的链接吗?
我找到了问题的原因,这是我这边的两件愚蠢的事情:
用"PRAGMA page_size"查询页面大小时,我只是在读取行,而不是用"sqlite3_reset"或sqlite3_finalize重置或完成语句(它被我测试的C++包装程序隐藏了(。
这导致数据库被锁定。然后,我在关闭数据库之前没有完成这个查询,这导致数据库在重新打开后返回繁忙状态
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- Qt SQL LIKE语句返回错误
- C++ Poco SQL 查询不返回具有'between'和'and'日期时间绑定的结果
- 在大型数据集上执行时不返回 SQL
- SQL 查询返回DB_E_NOTABLE
- SQL 空返回 "stops" 使用 odbc 的 c++ 返回
- 从SQL Server返回C++本机客户端中的NULL数据类型
- 通过ODBC将SQL结果集作为blob返回
- SQLExecute 始终以超过 8k 大小的参数返回"[Microsoft][SQL Server Native Client 10.0]String data, right truncation"