我在创建内存表、使用 H2 数据库以及在创建和运行它的 JVM 之外访问它时遇到问题。
文档将 url 构造为jdbc:h2:tcp://<host>/mem:<databasename>
我尝试了许多组合,但根本无法使远程连接正常工作。这个功能是否有效,谁能给我他们如何使用它的详细信息。
我在创建内存表、使用 H2 数据库以及在创建和运行它的 JVM 之外访问它时遇到问题。
文档将 url 构造为jdbc:h2:tcp://<host>/mem:<databasename>
我尝试了许多组合,但根本无法使远程连接正常工作。这个功能是否有效,谁能给我他们如何使用它的详细信息。
到目前为止提到的解决方案都没有对我有用。远程部分无法连接。
根据H2的官方文档:
要从另一个进程或另一台计算机访问内存数据库,您需要在创建内存数据库的同一进程中启动 TCP 服务器。然后其他进程需要通过 TCP/IP 或 TLS 访问数据库,使用数据库 URL,例如:jdbc:h2:tcp://localhost/mem:db1。
我用粗体标记了文本的关键部分。
我在这个人的博客上找到了一个可行的解决方案:
第一个过程将使用以下 URL 创建数据库:
jdbc:h2:mem:db1
它需要启动一个 tcp 服务器:
org.h2.tools.Server server = org.h2.tools.Server.createTcpServer().start();
然后其他进程可以使用以下 URL 访问您的数据库:
"jdbc:h2:tcp://localhost/mem:db1"
就是这样!像魅力一样工作!
您可能会查看In-Memory Databases。对于网络连接,您需要主机名和数据库名。看起来你想要这些:
jdbc:h2:tcp://localhost/mem:db1
jdbc:h2:tcp://127.0.0.1/mem:db1
刚刚遇到这个问题后,我发现我需要为tcp 连接DB_CLOSE_DELAY=-1
附加到 JDBC URL 。所以我的网址是:
jdbc:h2:mem:dbname
jdbc:h2:tcp://localhost:9092/dbname;DB_CLOSE_DELAY=-1
默认情况下,关闭与数据库的最后一个连接会关闭数据库。对于内存数据库,这意味着内容丢失。要保持数据库打开,请添加
;DB_CLOSE_DELAY=-1
到数据库 URL。
不包括DB_CLOSE_DELAY=-1
意味着我无法通过 TCP 连接到正确的数据库。已建立连接,但它使用与在内存中创建的版本不同的版本(使用IFEXISTS=true
参数验证)
在 SpringBoot 中:https ://www.baeldung.com/spring-boot-access-h2-database-multiple-apps
@Bean(initMethod = "start", destroyMethod = "stop")
public Server inMemoryH2DatabaseaServer() throws SQLException {
return Server.createTcpServer(
"-tcp", "-tcpAllowOthers", "-tcpPort", "9090");
}