哥,qt的2个客户端连接访问SQLite - 一个是只读的,第二个是写和读。 这个只读连接阻止了从第二个连接写入。 最后,导致数据库被阻止写入

报错databse is locked unable to fetch row

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt: 这个问题是由于SQLite数据库在同一时间只能有一个写入连接,因此只读连接会阻止写入连接引起的。为了解决这个问题,我们可以考虑以下几个方案: 1. 禁用读写操作的同步 我们可以在数据库打开时,禁用同步,使得只有第一个写入连接锁住数据库时才会阻止其他进程的写入操作。在读取数据时也可以设置为非同步模式。这样可以有效减少锁定时间,提高并发性能。 示例代码: ```cpp QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("database.sqlite"); db.setConnectOptions("QSQLITE_OPEN_URI;SYNC=OFF;ASYNC=NORMAL"); ``` 2. 使用多个库文件 我们可以使用多个数据库文件实现不同客户端之间的独立,这样就不会出现锁定问题。只需在代码中指定不同的数据库文件名即可。 示例代码: ```cpp QSqlDatabase ro_db = QSqlDatabase::addDatabase("QSQLITE", "readonly_connection"); ro_db.setDatabaseName("readonly_db.sqlite"); QSqlDatabase rw_db = QSqlDatabase::addDatabase("QSQLITE", "readwrite_connection"); rw_db.setDatabaseName("readwrite_db.sqlite"); ``` 3. 使用数据库连接池 使用数据库连接池可以避免频繁打开关闭数据库连接,提高数据库连接的利用率。我们可以使用Qt提供的QSqlDatabase连接池来实现。 示例代码: ```cpp QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); db.setDatabaseName("database.sqlite"); QSqlDatabasePool pool(db); QSqlDatabase ro_conn = pool.acquire(); QSqlDatabase rw_conn = pool.acquire(); // 在使用完之后释放连接 pool.release(ro_conn); pool.release(rw_conn); ``` 以上是三种解决方案的示例代码,根据具体情况选取一种最适合的方案即可。希望对您有所帮助。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^