SQLite和并发

jro*_*roy 23 sqlite

我需要在我们的一个产品中集成一个数据库,我想知道哪一个更适合我们的需求(简单的自动部署,没有管理,良好的性能),而sqlite似乎是一个很好的解决方案.问题是数据库可能面临高并发问题:每次客户端连接到运行数据库的服务器时,都会通过PHP(Apache)访问它.一个客户端大约每10秒钟连接(并执行一次INSERT查询)到服务器,并且可能有超过100个客户端在运行.

执行INSERT查询时,sqlite会在特定时间锁定整个数据库一段时间.有没有办法计算持续时间?如果这是不可能的,你认为sqlite(v3.3.7)仍然适应上述条件吗?

ven*_*zen 63

我试图避免情绪化的回复和夸张,但我对这页上显示的sqlite缺乏知识感到非常惊讶.不同的数据库实现满足不同的需求,并且根据您提供的操作规范,sqlite3似乎非常适合您的需求.详细说明:

sqlite3完全符合ACID,这意味着它可以确保原子提交,这既不是MySQL(也不是很好),也不是Oracle可以吹嘘的.在这里查看更多

此外,sqlite3具有一种看似简单的机制,可确保最大并发性(也是线程安全的),如文件锁定和并发文档中所述.

通过他们(sqlite3开发者)自己的估计,sqlite3每秒最多可以有50,000个INSERT - 理论上的最大值受磁盘旋转速度的限制.ACID合规性要求sqlite3确认数据库提交已写入磁盘,因此INSERT,UPDATE或DELETE事务需要两个完整的磁盘轮换,从而有效地将7200rpm磁盘驱动器上的事务数减少到60/s.在另一个答案中链接的sqlite FAQ中概述了这一点,并且该事实提供了生产中引擎的数据吞吐量能力的一些概念.但是并发阅读和写作呢?

前面链接的文件锁定和并发文档解释了sqlite3如何避免"编写器启动" - 这种情况下,大量数据库读取访问会阻止寻求写入数据库的进程/线程获取锁定.锁定状态从SHARED升级到PENDING升级为EXCLUSIVE,因为sqlite3遇到INSERT(或UPDATE或DELETE)语句,然后再次遇到COMMIT,这意味着完整数据库锁定会延迟到执行实际写入之前的最后一刻.sqlite处理文件锁定的聪明机制的结果意味着如果编写器加入队列(PENDING锁定),现有读取(SHARED锁定)将完成,向写入器进程授予EXCLUSIVE锁定,然后继续读取.这只需几毫秒,

我认为EXCLUSIVE锁上的默认sqlite3 WAIT是3秒,所以假设每秒60个事务是一个合理的期望,并且你平均每10秒寻求写一次数据库 - 我会说sqlite3很好完成任务,只需要在流量增加500倍后引入群集.

不错,完美符合您的要求.

  • 如果正在进行冗长的选择查询(例如15秒持续时间),并且INSERT应该在第十秒发生,会发生什么?那个插入会失败吗? (4认同)
  • 在默认的 sqlite3 安装和设置(以及多线程数据库访问)中,它会失败,是的,因为等待释放锁的默认超时是 5 秒。但是,您可以通过 1) 在 sqlite3 连接代码中设置更长的超时和/或 2) 在代码中捕获 SQLITE_BUSY 超时错误并重新执行事务来处理这种极端情况(15 秒事务)。 (2认同)
  • 好的,富有成效的研究时间:来自sqlite网站的两个非常有用的文档:http://www.sqlite.org/speed.html和http://www.sqlite.org/whentouse.html.调查结果:sqlite为了速度和简单性而牺牲了复杂的功能.在大多数情况下,sqlite3比企业级数据库引擎更快.sqlite可以驱动高达140TB的数据库,允许多个同时读取,并像其他数据库一样将数据存储在磁盘上的文件中.sqlite3可以集群到db场中.并发不是它的优点.链接的文档包含有关哪些上下文最适合sqlite并值得阅读的有价值的信息. (2认同)

gab*_*sch 5

我认为SQLite不能满足这些要求。SQLite仅设计用于本地和轻量级用途,不能满足数百个请求。

我会推荐其他解决方案,例如MySQLPostgreSQL,都可以很好地编写脚本。因此,如果您是我,我会全力投入设置脚本中。

为了避免SQLite信奉者与仇恨者之间的激烈争论,让我提请您注意经常引用的SQLite使用时文档(我认为它被认为是可靠的消息来源)。他们在这里声明以下内容:

客户端/服务器RDBMS可能会更好地工作的情况

高并发

SQLite支持无限数量的同时读取器,但是它只能在任何时刻允许一个写入器。在许多情况下,这不是问题。作家排队。每个应用程序都会快速完成其数据库的工作并继续运行,并且锁定不会持续超过几十毫秒。但是有些应用程序需要更多的并发性,而这些应用程序可能需要寻求不同的解决方案。

我认为所提到的问题涉及许多写入操作,并且如果OP将用于SQLite,将导致无法扩展的解决方案。

  • @mvp 1每10秒写一次=“这样的负载”?如果您不花钱在投票上,我会以为您是在开玩笑。 (4认同)