2

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

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

我没有看到很多并发更新操作。将有 5-10 个客户端尝试读取和更新同一个数据库。在这种情况下,使用企业级数据库(MySQL、Postgres)会更好吗?

4

2 回答 2

3

引用之前的常见问题段落:

SQLite uses reader/writer locks to control access to the database. (Under Win95/98/ME which lacks support for reader/writer locks, a probabilistic simulation is used instead.) But use caution: this locking mechanism might not work correctly if the database file is kept on an NFS filesystem. This is because fcntl() file locking is broken on many NFS implementations. You should avoid putting SQLite database files on NFS if multiple processes might try to access the file at the same time. On Windows, Microsoft's documentation says that locking may not work under FAT filesystems if you are not running the Share.exe daemon. People who have a lot of experience with Windows tell me that file locking of network files is very buggy and is not dependable. If what they say is true, sharing an SQLite database between two or more Windows machines might cause unexpected problems.

I would not network share a SQLite database file as it appears you will be buying yourself nasty synchronization problems yielding hard to reproduce data corruption.

Put another way, you are using a general file sharing mechanism to substitute for the server capabilities of another DBMS. These other DBMS are tested specifically and field-hardened for multiple client access, though SQLite has great merits, this isn't one of them.

于 2011-08-21T11:58:03.450 回答
0

这是一个常见问题解答

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

另请阅读SQLite is serverless

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

于 2011-08-21T11:45:22.393 回答