H2内存表,远程连接

18

我在使用H2数据库创建内存表并在JVM之外访问时遇到了问题。

文档将URL结构化为jdbc:h2:tcp://<host>/mem:<databasename>

我尝试了许多组合,但无法使远程连接正常工作。这个特性是否有效?有人可以告诉我他们如何使用它的详细信息吗?


1
如果您列出您尝试过的组合,那将是很好的。 - Robert Munteanu
你是在设置服务器(以便监听某个TCP端口)还是客户端(以连接到服务器)方面遇到了问题? - Grzegorz Oledzki
请参阅 https://stackoverflow.com/questions/24528160/remote-connection-to-a-h2-database-in-server-mode-with-dbcp-pooling。它提到了 -tcpAllowOthers 开关,可以使数据库不仅在本地主机上可见。 - Vadzim
4个回答

20

迄今为止提到的解决方案都不适用于我。远程部分无法连接。

根据 H2 的官方文档

要从另一个进程或另一台计算机访问内存中的数据库,您需要在与内存中创建数据库相同的进程中启动 TCP 服务器。然后,其他进程需要使用如下数据库 URL 通过 TCP/IP 或 TLS 访问数据库:jdbc:h2:tcp://localhost/mem:db1。

我用粗体标出了文本的关键部分。

我在这个人的博客上找到了一个可行的解决方案:

第一个进程将创建 DB,其 URL 如下:

jdbc:h2:mem:db1

并且它需要启动一个 tcp 服务器:

org.h2.tools.Server server = org.h2.tools.Server.createTcpServer().start();

其他进程可以使用以下 URL 访问您的 DB:

"jdbc:h2:tcp://localhost/mem:db1"

就是这样!像魔法一样解决了问题!


你的回答提出了一个有趣的问题:如果没有createTcpServer()调用,H2数据库是否在进程内运行,就像SQLite数据库一样?这可以解释H2的速度比SQLite还要快的原因。 - undefined

11

你可以看一下内存数据库。对于网络连接,你需要一个主机和数据库名称。看起来你想要其中的一个:

jdbc:h2:tcp://localhost/mem:db1
jdbc:h2:tcp://127.0.0.1/mem:db1

完整的示例可以在这里这里这里找到;相关示例在这里进行了讨论。


3
刚刚遇到这个问题,我发现在 JDBC URL 中需要添加 DB_CLOSE_DELAY=-1 以便于对 tcp 连接 进行操作。因此我的 URL 如下:
  • 内存数据库:jdbc:h2:mem:dbname
  • TCP 连接:jdbc:h2:tcp://localhost:9092/dbname;DB_CLOSE_DELAY=-1
根据h2文档的描述:

默认情况下,关闭最后一个连接也会关闭数据库。对于内存数据库,这意味着内容将丢失。为了保持数据库开启状态,请在数据库 URL 中添加 ;DB_CLOSE_DELAY=-1

如果不包括 DB_CLOSE_DELAY=-1,则无法通过 TCP 连接到正确的数据库。虽然连接已经建立,但使用的版本与内存中创建的版本不同(可以使用 IFEXISTS=true 参数进行验证)。

我认为DB_CLOSE_DELAY=-1应该在内存连接字符串上,而不是TCP连接字符串上,这样创建数据库的命令就负责控制其生命周期。理想情况下,外部连接应该对H2的实现细节一无所知,并且只需请求数据即可。 - tomfumb
我已经很久没有使用H2了,但是我的回答的其余部分表明我指的是TCP连接。 - tddmonkey

0

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