Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何跨多个Spring引导应用程序共享内存中的H2数据库?_Java_Spring_Spring Boot_H2 - Fatal编程技术网

Java 如何跨多个Spring引导应用程序共享内存中的H2数据库?

Java 如何跨多个Spring引导应用程序共享内存中的H2数据库?,java,spring,spring-boot,h2,Java,Spring,Spring Boot,H2,这与其他回答的问题不同。我有一个Spring引导应用程序(app#1),它使用内存中的嵌入式H2数据库,并将其作为服务器公开。我的第二个Spring引导应用程序(app#2)从app#1连接到H2服务器,并且工作正常。我可以从H2中存储和检索数据。现在问题来了。我有第三个Spring启动(应用程序3),它从应用程序1连接到H2服务器。连接正常,但它(问题1)清除了应用程序2之前存储的所有数据。在此之后,现在应用程序2和3都可以存储和检索其数据以及彼此的数据。现在我终止应用程序2或应用程序3,并且

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

在此处的文档中找到:

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

因此,我认为如果您只需将app#1的application.properties文件中的db行设置为:


请让我知道这是否解决了你的问题,因为我很好奇。您的描述似乎表明它比这复杂一点…从涉及的两个应用程序重复访问…但这听起来确实像是您缺少的参数。

我这样做的,在您的spring配置中注册多个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
url=jdbc:h2:tcp://localhost:9081/
用户名=sa
密码=sa
对于内存中的H2数据库

url=jdbc:h2:tcp://localhost:9081/<H2 database name>
username=sa
password=sa
url=jdbc:h2:tcp://localhost:9081/
用户名=sa
密码=sa

H2服务器和其他两个应用程序之间的“连接”是什么?它们是否涉及某种上下文,将数据库关闭时发生的数据库清理行为附加到该上下文例如,如果您正在进行Spring MVC REST调用以访问H2数据库,那么这些连接的进出(无论如何,它们都是无状态的)完全没有理由影响数据库上下文。重要的是您为响应每个REST调用而运行的代码。@Steve对于应用程序1,这里是“application.properties”行spring.datasource.url=jdbc:h2:mem:mydb,对于应用程序2和应用程序3,这行代码是:spring.datasource.url=jdbc:h2:tcp://localhost:9090/mem:mydb 下面是我遵循的示例:@Steve这是应用程序#1的服务器代码:@Bean(initMethod=“start”,destromethod=“stop”)MemoryH2DatabaseAserver()中的公共服务器抛出SQLException{return server.createTcpServer(“-tcp”,“-tcpAllowOthers”,“-tcpPort”,“9090”);}哇!你每天都学到了一些东西。我从来没有想过要做这样的事情,甚至不知道这是可能的。我会认为内存中的数据库对托管它的进程是私有的。根据你的提问,我怀疑这样的事情。因为我没有这样做,我不知道它的行为是什么vior你应该期待这样做。也许有人真的这样做了。否则,我会说,看看可用的文档,也许谷歌在其他地方的答案。我想你已经明白,你可以实现一个耦合较少的REST API,避免你的问题。我明白如果你想让这个方法工作-我一直在谷歌上搜索。我没有看到任何迹象表明你不会得到你期望的行为……只是共享数据库。奇怪。
url=jdbc:h2:tcp://localhost:9081/<H2 database name>
username=sa
password=sa