我们在基于Windows桌面的Java应用程序上使用SQLite(Xerial JDBC驱动程序)。现在我们转到同一应用程序的客户端 - 服务器版本,其中多个基于Java的Swing客户端将连接到指定服务器Windows PC上的相同SQLite db文件。如果我错了,请纠正我:
我没有看到很多并发更新操作。将有5-10个客户试图阅读&更新相同的数据库。在这种情况下,使用entperise grade DB(MySQL,Postgres)会更好吗?
答案 0 :(得分:2)
来自one quoted之前的常见问题解答段落:
SQLite使用读取器/写入器锁来控制对数据库的访问。 (在Win95 / 98 / ME下,缺少对读写器锁的支持,a 改为使用概率模拟。)但要谨慎:这个 如果数据库文件是,锁定机制可能无法正常工作 保存在NFS文件系统上。这是因为fcntl()文件锁定是 在许多NFS实现上打破了。你应该避免使用SQLite NFS上的数据库文件,如果多个进程可能尝试访问 同时提交文件。在Windows上,微软的文档说明了这一点 如果您没有运行,则锁定在FAT文件系统下可能无法正常工作 Share.exe守护程序。对Windows有很多经验的人 告诉我,网络文件的文件锁定是非常错误的,而不是 可信。如果他们说的是真的,那就共享一个SQLite数据库 两台或多台Windows机器之间可能会出现意外问题。
我不会在网络上共享一个SQLite数据库文件,因为看起来你会自己购买令人讨厌的同步问题而难以重现数据损坏。
换句话说,您正在使用通用文件共享机制来替换另一个DBMS的服务器功能。这些其他DBMS经过专门测试和现场强化,可以进行多个客户端访问,尽管SQLite有很多优点,但这不是其中之一。
答案 1 :(得分:0)
这是FAQ:
[...]我们知道没有其他嵌入式SQL数据库引擎 支持与SQLite一样多的并发性。 SQLite允许多个 使数据库文件立即打开的进程,以及多个数据库文件 进程一次读取数据库。当任何过程想要 写,它必须锁定整个数据库文件的持续时间 更新。但这通常只需要几毫秒。其他 进程只是等待作者完成然后继续他们的 商业。其他嵌入式SQL数据库引擎通常只允许使用 单个进程一次连接到数据库。 [...]
另请阅读SQLite is serverless。
SQLite是否足以满足您的需求是不可能的。如果您有长时间运行的更新事务,则锁定整个数据库可能是一个严重的问题。由于您使用JDBC来访问它,因此在必要时切换到另一个数据库引擎应该没有太多问题。