在网络共享上使用 sqlite

发布于 2024-11-30 15:54:41 字数 361 浏览 1 评论 0原文

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

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

我没有看到很多并发更新操作。将有 5-10 名客户尝试阅读和阅读。更新相同的数据库。在这种情况下,使用企业级数据库(MySQL、Postgres)是否更好?

We are using SQLite (Xerial JDBC driver) on a windows desktop based Java application. Now we are moving on to a client-server version of the same application where multiple Java based Swing clients will be connecting to the same SQLite db file on the designated server Windows PC. Please correct me if I'm wrong:

  1. Is keeping the SQLite database file over network share the only option to use SQLite in this mode? or is there some other solution that I am missing ?
  2. Will using SQLite increase the chances of DB corruption ?

I don't see lot of concurrent update operations. There will be 5-10 clients trying to read & update the same DB. In that case, is it better to use an entperise grade DB (MySQL, Postgres)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

熟人话多 2024-12-07 15:54:41

引用的内容之前的常见问题解答段落中:

SQLite 使用读/写锁来控制对数据库的访问。
(在Win95/98/ME下缺乏对读/写锁的支持,
而是使用概率模拟。)但要小心:这
如果数据库文件被锁定,锁定机制可能无法正常工作
保存在 NFS 文件系统上。这是因为 fcntl() 文件锁定是
在许多 NFS 实现上都出现问题。你应该避免将 SQLite
如果多个进程可能尝试访问 NFS 上的数据库文件
同时归档。在 Windows 上,微软的文档说
如果您没有运行 FAT 文件系统,锁定可能不起作用
Share.exe 守护进程。拥有丰富 Windows 经验的人
告诉我网络文件的文件锁定有很多错误,但不是
可靠。如果他们说的是真的,共享 SQLite 数据库
两台或多台 Windows 计算机之间可能会导致意外问题。

我不会通过网络共享 SQLite 数据库文件,因为看起来您将为自己购买令人讨厌的同步问题,从而导致难以重现数据损坏。

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

From the FAQ paragraph before the one quoted:

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.

强辩 2024-12-07 15:54:41

这是常见问题解答

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

另请阅读SQLite 是无服务器的

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

This is a FAQ:

[...] We are aware of no other embedded SQL database engine that
supports as much concurrency as SQLite. SQLite allows multiple
processes to have the database file open at once, and for multiple
processes to read the database at once. When any process wants to
write, it must lock the entire database file for the duration of its
update. But that normally only takes a few milliseconds. Other
processes just wait on the writer to finish then continue about their
business. Other embedded SQL database engines typically only allow a
single process to connect to the database at once. [...]

Also read SQLite is serverless.

Whether SQLite is sufficient for your needs is impossible to tell. If you have long-running update transactions, locking the whole database might be a serious issue. Since you're using JDBC to access it, there shouldn't be many problems switching to another database engine if necessary.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文