我在使用H2数据库创建内存表并在JVM之外访问时遇到了问题。
文档将URL结构化为jdbc:h2:tcp://<host>/mem:<databasename>
我尝试了许多组合,但无法使远程连接正常工作。这个特性是否有效?有人可以告诉我他们如何使用它的详细信息吗?
我在使用H2数据库创建内存表并在JVM之外访问时遇到了问题。
文档将URL结构化为jdbc:h2:tcp://<host>/mem:<databasename>
我尝试了许多组合,但无法使远程连接正常工作。这个特性是否有效?有人可以告诉我他们如何使用它的详细信息吗?
迄今为止提到的解决方案都不适用于我。远程部分无法连接。
根据 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还要快的原因。 - undefinedDB_CLOSE_DELAY=-1
以便于对 tcp 连接 进行操作。因此我的 URL 如下:
jdbc:h2:mem:dbname
jdbc:h2:tcp://localhost:9092/dbname;DB_CLOSE_DELAY=-1
如果不包括默认情况下,关闭最后一个连接也会关闭数据库。对于内存数据库,这意味着内容将丢失。为了保持数据库开启状态,请在数据库 URL 中添加
;DB_CLOSE_DELAY=-1
。
DB_CLOSE_DELAY=-1
,则无法通过 TCP 连接到正确的数据库。虽然连接已经建立,但使用的版本与内存中创建的版本不同(可以使用 IFEXISTS=true
参数进行验证)。@Bean(initMethod = "start", destroyMethod = "stop")
public Server inMemoryH2DatabaseaServer() throws SQLException {
return Server.createTcpServer(
"-tcp", "-tcpAllowOthers", "-tcpPort", "9090");
}
-tcpAllowOthers
开关,可以使数据库不仅在本地主机上可见。 - Vadzim