如何跨多个Spring Boot应用程序共享H2内存数据库?

时间:2019-03-21 03:23:51

标签: java spring spring-boot h2

这是与其他回答问题不同的情况。我有一个Spring Boot应用程序(应用程序1),该应用程序使用嵌入式H2内存数据库并将其作为服务器公开。我的第二个Spring Boot应用程序(应用程序2)从应用程序1连接到H2服务器,并且可以正常工作。我可以从H2存储和检索数据。现在这是问题所在。我有第三个Spring Boot(应用程序3),它从应用程序1连接到H2服务器。该连接有效,但它(问题1)清除了应用程序2之前存储的所有数据。此后,现在应用程序2和3都可以存储和检索其数据以及彼此的数据。现在,我终止了应用程序2或应用程序3,并且(问题2)剩余的应用程序无法继续使用H2内存数据库。问题#1和#2是否正常?如果没有,我该如何解决?我希望我的H2数据在应用程序#1(H2服务器)运行期间保持不变,即使其他应用程序已断开连接,我也不希望新应用程序连接到H2服务器时清除我的数据。

2 个答案:

答案 0 :(得分:1)

在以下文档中找到了此内容:https://h2database.com/html/features.html

  

默认情况下,关闭与数据库的最后一个连接会关闭   数据库。对于内存数据库,这意味着内容丢失。   要保持数据库打开状态,请在数据库URL上添加; DB_CLOSE_DELAY = -1。   保持内存数据库的内容与虚拟的一样长   机器还活着,请使用jdbc:h2:mem:test; DB_CLOSE_DELAY = -1。

所以我认为,只要将应用程序#1的application.properties文件中的db行设置为:

spring.datasource.url=jdbc:h2:mem:mydb;DB_CLOSE_DELAY=-1

由于我很好奇,请告诉我这是否可以解决您的问题。您的描述似乎暗示它要比这复杂一些……涉及的两个应用程序之间的访问重叠……但这听起来确实像您所缺少的那种参数。

答案 1 :(得分:0)

我这样做,在您的春季配置中注册了多个H2服务器

@Bean(initMethod = "start", destroyMethod = "stop")
public Server h2Server1() throws SQLException {
    return Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9080");
}

// Second App
@Bean(initMethod = "start", destroyMethod = "stop")
public Server h2Server2() throws SQLException {
    return Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9081");
}

然后连接到配置下方使用的H2

基于文件的H2

url=jdbc:h2:tcp://localhost:9081/<path to H2>
username=sa
password=sa

用于内存中的H2数据库

url=jdbc:h2:tcp://localhost:9081/<H2 database name>
username=sa
password=sa