H2数据库多连接

20
我遇到以下问题: 两个系统上的应用程序实例需要共享一个小型数据库,但是两个系统只能通过网络文件夹交换数据。我没有在其他地方设置数据库服务器的可能性。
是否可以将H2数据库放置在网络文件夹上,并让两个实例连接到该数据库(同时连接)?
如果我禁用文件锁定,则可以使用嵌入式模式将两个实例连接到数据库,对于数据库的读/写操作是否会有数据损坏风险?
2个回答

58

正如文档所述; (http://h2database.com/html/features.html#auto_mixed_mode)

多个进程可以访问同一数据库,而无需手动启动服务器。为此,请将“;AUTO_SERVER=TRUE”附加到数据库URL末尾。您可以使用相同的数据库URL,无论数据库是否已打开。此功能不适用于内存数据库。

// Application 1:
DriverManager.getConnection("jdbc:h2:/data/test;AUTO_SERVER=TRUE");

// Application 2:
DriverManager.getConnection("jdbc:h2:/data/test;AUTO_SERVER=TRUE");

2

来自H2文档

也可以在不使用文件锁的情况下打开数据库;在这种情况下,由应用程序保护数据库文件。 未能这样做将导致数据库损坏。

我认为如果您的应用程序始终使用相同的配置(共享文件数据库位于网络文件夹中),则需要创建一个应用程序层来管理并发。


我已经阅读了这篇内容,但我也看到关于表级锁定支持的一些内容。我的理解是,表锁仅在客户端/服务器模式下使用?对于多个嵌入式连接,实现自己的锁定机制是唯一的选择吗? - D-rk
如果您可以运行服务器,它会管理表级锁定。但是如果没有它,您必须实现自己的机制。 - vincenzo iafelice
1
实际上,即使在嵌入式和内存模式下,如果您在同一进程中打开多个与数据库的连接,则默认情况下会使用表级锁。 - Thomas Mueller
6
我对这个答案进行了负评,因为我认为正确答案是:是的,可以将H2数据库放在网络文件夹上,并使用h2数据库的“auto_server”选项让两个实例连接到数据库。 - dendini

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