在网络共享上使用sqlite

问题描述:

我们在基于Windows桌面的Java应用程序上使用SQLite(Xerial JDBC驱动程序)。现在我们转到同一应用程序的客户端 - 服务器版本,其中多个基于Java的Swing客户端将连接到指定服务器Windows PC上的相同SQLite数据库文件。请纠正我,如果我错了:在网络共享上使用sqlite

  1. 是保持SQLite数据库文件通过网络共享唯一的选择在这种模式下使用SQLite?还是有一些其他的解决方案,我失踪了?
  2. 使用SQLite会增加数据库损坏的几率吗?

我没有看到很多并发更新操作。将有5-10个客户端尝试读取&更新相同的数据库。在那种情况下,使用entperise grade DB(MySQL,Postgres)更好吗?

+0

看看这个问题的答案(http://stackoverflow.com/questions/1321493/sqlite-for-client-server)。你使用什么版本的SQLite? –

从FAQ款前one quoted

的SQLite使用读/写锁来控制对数据库的访问。 (在Win95/98/ME中,缺少对读写器锁定的支持,而是使用概率模拟代替 )。但请注意:如果数据库文件保留在NFS文件系统上,则此锁定机制可能无法正常工作。这是因为fcntl()文件锁定在许多NFS实现上破坏了 。如果多个进程可能尝试同时访问 文件,则应避免将SQLite 数据库文件放在NFS上。在Windows上,Microsoft的文档说如果您没有运行 Share.exe守护进程, 锁定可能无法在FAT文件系统下工作。对Windows 有很多经验的人告诉我,网络文件的文件锁定非常麻烦,并且不是 可靠的。如果他们说的是真的,在两台或多台Windows机器之间共享SQLite数据库 可能会导致意外问题。

我不会网络共享一个SQLite数据库文件,因为它看起来你会买自己讨厌的同步问题,很难再现数据损坏。

换言之,您正在使用通用文件共享机制来替代另一个DBMS的服务器功能。对于多个客户端访问,这些其他DBMS经过专门测试和现场强化,尽管SQLite具有很大优点,但这不是其中之一。

这是一个FAQ

[...]我们都知道, 能支持的并发性SQLite的任何其他嵌入式SQL数据库引擎的。 SQLite允许多个 进程一次打开数据库文件,并允许多个进程一次读取数据库。当任何进程想要写入 时,它必须锁定整个数据库文件的更新期限为 。但通常只需要几毫秒。其他 进程只是等待作家完成,然后继续他们的 业务。其他嵌入式SQL数据库引擎通常只允许单个进程同时连接到数据库。 [...]

也读SQLite is serverless

SQLite是否足以满足您的需求是不可能的。如果您有长时间运行的更新事务,则锁定整个数据库可能是一个严重问题。由于您使用JDBC来访问它,所以如果有必要,切换到另一个数据库引擎时应该不会有太多问题。