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

时间:2014-08-10 10:43:30

标签: c++ unix sqlite

keeping sqlite3 database opened VS的开销是多少open database only when need

应用程序高负载

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

VS

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

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

1 个答案:

答案 0 :(得分:3)

你应该保持开放。

打开和关闭文件比较贵,然后打开一个文件处理程序。

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

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

编辑:同步写入数据库可以由TRANSACTION完成。在sqlite中,您使用BEGIN TRANSACTIONEND TRANSACTION sqls(或仅BEGIN& END)。 BEGIN可以在循环中用作互斥锁,END可以用作解锁。它可以保护您免于更改其他进程的数据库。

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

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

<强> EDIT4: 我认为分开阅读&amp;写不是那么好主意,因为写入应该优先于读取。问题是在sqlite中你不能锁定一个表,你就锁定了整个数据库。

当我使用sqlite时,我使用了一个包含DB的单个句柄的包装类,所有通过高级函数从/向DB读取和写入,我有一个写入队列,并且还为每个表保持跟踪有未写入的更改待定,因此对于每个读取函数,我可以测试我是否有更新的数据或应该等待。