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个读者可以读取)
答案 0 :(得分:3)
你应该保持开放。
打开和关闭文件比较贵,然后打开一个文件处理程序。
您可以通过在循环中运行1000个相同的查询来模拟成本,第一个在打开和关闭时在循环内部然后将它们移出时进行模拟。
通常多线程应用程序应该使用连接拉取。应计算池的大小。
编辑:同步写入数据库可以由TRANSACTION
完成。在sqlite中,您使用BEGIN TRANSACTION
和END TRANSACTION
sqls(或仅BEGIN
& END
)。 BEGIN
可以在循环中用作互斥锁,END
可以用作解锁。它可以保护您免于更改其他进程的数据库。
EDIT2:更多解决方案是每个线程的连接。
EDIT3:您还可以实现或使用消息队列来写入数据库。
<强> EDIT4:强> 我认为分开阅读&amp;写不是那么好主意,因为写入应该优先于读取。问题是在sqlite中你不能锁定一个表,你就锁定了整个数据库。
当我使用sqlite时,我使用了一个包含DB的单个句柄的包装类,所有通过高级函数从/向DB读取和写入,我有一个写入队列,并且还为每个表保持跟踪有未写入的更改待定,因此对于每个读取函数,我可以测试我是否有更新的数据或应该等待。