16

我在创建内存表、使用 H2 数据库以及在创建和运行它的 JVM 之外访问它时遇到问题。

文档将 url 构造为jdbc:h2:tcp://<host>/mem:<databasename>

我尝试了许多组合,但根本无法使远程连接正常工作。这个功能是否有效,谁能给我他们如何使用它的详细信息。

4

4 回答 4

17

到目前为止提到的解决方案都没有对我有用。远程部分无法连接。

根据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"

就是这样!像魅力一样工作!

于 2017-06-23T16:41:28.863 回答
11

您可能会查看In-Memory Databases。对于网络连接,您需要主机名和数据库名。看起来你想要这些:

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

完整的例子可以在这里这里这里找到;相关示例在这里进行检查。

于 2010-05-04T21:29:13.430 回答
2

刚刚遇到这个问题后,我发现我需要为tcp 连接DB_CLOSE_DELAY=-1附加到 JDBC URL 。所以我的网址是:

  • 在记忆中 :jdbc:h2:mem:dbname
  • TCP 连接:jdbc:h2:tcp://localhost:9092/dbname;DB_CLOSE_DELAY=-1

来自 h2 文档

默认情况下,关闭与数据库的最后一个连接会关闭数据库。对于内存数据库,这意味着内容丢失。要保持数据库打开,请添加;DB_CLOSE_DELAY=-1到数据库 URL。

不包括DB_CLOSE_DELAY=-1意味着我无法通过 TCP 连接到正确的数据库。已建立连接,但它使用与在内存中创建的版本不同的版本(使用IFEXISTS=true参数验证)

于 2014-12-18T15:34:03.030 回答
0

在 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");
}
于 2021-03-17T22:03:21.193 回答