c++ - sqlite3 - 保持打开处理程序 VS,在需要时打开数据库

标签 c++ unix sqlite

保持 sqlite3 数据库打开 VS. 有多少开销。 仅在需要时打开数据库

应用高负载

1) 但是很难编写每个线程使用一个处理程序的版本,但我可以编写类似 driver 的东西来保持 ie. 3-5 个处理程序打开并准备好读取,1 个处理程序准备写入。按请求为线程驱动它们,保持互斥量等(不容易实现的解决方案)

对比

2) 仅当我需要某个线程时才打开 sqlite 数据库并让 sqlite 完成所有工作,但每次打开数据库都会有额外的开销。 (易于实现)

更新: 3)还有其他选择:我可以让每个数据库打开一个处理程序,并使用简单的互斥锁来锁定对数据库的访问。这样做的缺点是我松散了并发读取。因此,只有一个线程能够读取或写入,而根据选项 3,concurrency free reading(同时可以读取 1 个以上的读取器)

最佳答案

你应该保持打开状态。

打开和关闭文件比保持一个文件处理程序打开的代价更高。

您可以通过在循环中运行 1000 个相同的查询来模拟成本,第一次当打开和关闭在循环内时,然后当您将它们移出时。

通常多线程应用程序应该使用连接池。应计算池的大小。

编辑可以通过TRANSACTION 同步写入数据库。在 sqlite 中,您使用 BEGIN TRANSACTIONEND TRANSACTION sql(或只是 BEGIN & END)。 BEGIN 可用作循环中的互斥锁,END 可用作解锁。它可以保护您免受其他进程更改数据库的影响。

EDIT2:更多的解决方案是按线程连接。

EDIT3:您还可以实现或使用消息队列来写入数据库。

编辑 4: 我认为分离读写不是一个好主意,因为写应该比读有更高的优先级。问题是在 sqlite 中你不能锁定单个表,你锁定整个数据库。

当我使用 sqlite 时,我使用了一个包装类,它具有一个数据库句柄,所有从数据库读取和写入的高级函数,我都有一个写入队列,并且如果它存在,也会跟踪每个表有待处理的未写入更改,因此对于每个读取函数,我都可以测试我是否有更新的数据或应该等待。

关于c++ - sqlite3 - 保持打开处理程序 VS,在需要时打开数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25227782/

相关文章:

android - 警告 : Do not hardcode "/data/"; use Context. getFilesDir().getPath() 代替

android - OpenCL 释放缓冲区对象

c++ - Qt 错误 : After running the code, 在 qt 中获取 protobuf 错误

c++ - 如何检查按钮是否被按下并在 C++ 中的 LPT 端口上工作

linux - 从 Mac 终端终止/删除远程 ssh shell

java - INSERT INTO 在 Java 中使用 INNER JOIN

c++ - acm问题。我的代码有什么问题?

linux - UNIX 中两个文件的基于字段的连接

linux - 如何仅使用 grep 提取模式

database - sqlite内存模式支持持久化到本地吗?