SQLite用于客户端-服务器

9
我在Stackoverflow上看到了一些关于SQLite性能的问题,但重点是网站方面的,而我正在考虑在客户端-服务器方案中使用此数据库:
  • 目前预计每个服务器有1-10个客户端,未来可能增加到50个或更多。
  • 读取操作略多于写入操作。
  • 数据库将位于服务器进程后面(即不通过网络直接访问数据库)。

与使用PostgreSQL相比,使用SQLite是否会使应用程序响应速度变慢?我的直觉告诉我,对于这些负载应该是可以的,但也许有人在这种情况下有实际经验。


2
既然网站是一个客户端-服务器应用程序,我不明白这有什么不同。你认为有何不同?你为什么说客户端服务器应用程序与Web服务器应用程序本质上不同? - S.Lott
基本上它是一样的,但SQLite的可扩展性问题是一个Stackoverflow声望计数器,所以我想它有完全不同的访问模式。另一个重要的区别是,我可以严格控制整个技术栈,而在浏览器中,有些选择是预先确定的。 - rpg
1
@rpg:是的,当您拥有自己的客户端/服务器设置时,您可以更好地控制整个网站设置。在我看来,这就是SQLite的优势所在——既然它在网站设置中可扩展,那么在您的设置中为什么不能呢?当然,访问模式可能会成为一个问题。许多写操作(与读操作交织在一起)会对数据库引擎造成更大的压力,而只读设置则不会。当然!我认为这取决于您在一次往返中通常更改的数据量(行数、列数和表格数等)。您能否将这些写操作放入一个事务中...等等。 - Juergen
3个回答

14

我曾在一个主要的客户/服务器产品中使用SQLite,而我深深地后悔做出了这个决定。在我看来,对于客户/服务器场景,PostgreSQL比SQLite更适合,因为它具有更好的锁定粒度。

当需要写入某些内容时,整个数据库被锁定,你根本无法进展...

我非常喜欢SQLite(我甚至编写了一个用于比较SQLite数据库的商业实用程序——SQLite Compare),但我认为在客户/服务器场景下它并不适用。

即使是SQLite的作者也说,它应该作为自定义文件格式的替代品使用,而不是作为完整的数据库服务器。我希望我更严肃地听从了他的建议...


在我看来,只有在多个服务器进程访问一个DB文件或客户端直接访问DB时,您才会遇到细粒度锁定问题。当您只有一个服务器进程时,您如何遇到锁定问题(好吧,我必须补充一下,您不使用线程...)? - Juergen
2
实际上,我有一个单一的服务器,代表多个客户端进程访问数据库。那又怎样呢?在我的情况下,每个客户端都由服务器中的工作线程表示,当您有多个客户端在服务器上工作时,您也会有多个线程同时在数据库引擎上工作。由于很难预测数据库访问实际上将如何执行(即读取与写入访问模式),我强烈建议不要从一开始就做出这样的限制性决定(使用SQLite而不是PostgreSQL)。 - Liron Levi
1
你的SQLite比较工具有新的归属地吗? - Jonathan Hall

3
您没有提及使用的操作系统和Postgres版本。但是,在考虑更改数据库引擎之前,请尝试记录并基于典型用法对当前数据库进行基准测试,然后优化“最重”的问题。也许您的后端处理负载使得DB问题时间无关紧要?由于SQLite是基于文件的DBMS,当客户端数量增加时,多个进程的并发访问将降低性能。以下问题可能有帮助: SQLite的可扩展性如何?

性能下降只会在直接并发访问时发生 - 但正如OP所说,访问是间接的,有一个服务器进程介于其中...这可能会稍微减慢速度,但不会导致性能下降。 - Juergen
1
没错,我忘记了一个服务器可以服务多个客户端这一部分。无论如何,如果数据库的构建非常简单,可以迁移到SQLite(没有数据库端处理、触发器等),我认为只要数据库合理索引,DBMS的性能不会成为严重问题。 - tomash
还没有编写任何代码。 我正在处理项目的风险清单,而可扩展性是其中之一。 没有使用任何Postgres,但最初可能会使用XP,Vista等操作系统,稍后会转向Linux。 - rpg
1
正如我在回答中所说,一切都取决于数据库的实际负载。我还会说,当您可以排除并发访问时,SQLite的性能范围与PostgreSQL相似,因此对于您描述的设置,我会声称(不太了解Postgress)差异将很小。可扩展性取决于您实际编码的依赖性可能会更高。当您不需要所有更高的DB功能(例如触发器)时,我建议使用SQLite - 对我来说,50个用户/客户端并不多! - Juergen
@Juergen:也许对你来说50个用户/客户不算多,但你需要考虑到他们每个人都有可能生成多个SQL语句,这些语句需要与其他客户端运行的查询同时并发运行。根据我的经验,即使只有大约10个用户同时工作,SQLite锁定也会导致严重的延迟和GUI超时。确实,SQLite是非常快速的数据库(当只有一个用户在使用它时)。它也非常容易管理。然而,SQLite绝对不是可扩展的数据库解决方案(我已经从中吸取了教训)... - Liron Levi

1

我会确认S.Lott的答案。

我不知道SQLite相比PostgreSQL表现如何,因为我不知道有任何更新的测量数据,但我在一个相似的环境中使用SQLite的经验相当好。

在我看来,唯一可能会引起麻烦的是你有相当多的写入。但这完全取决于每秒的总数,我想。

而且我认为,你将一个服务器进程设置为最佳,这样你就可以规避它在多任务处理方面的弱点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接