簡體   English   中英

如何在多個 Spring Boot 應用程序之間共享 H2 內存數據庫?

[英]How do I share H2 in-memory database across multiple Spring boot applications?

這是與其他已回答問題不同的場景。 我有一個 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 服務器時清除我的數據。

在這里的文檔中找到了這個: https : //h2database.com/html/features.html

默認情況下,關閉與數據庫的最后一個連接將關閉該數據庫。 對於內存數據庫,這意味着內容丟失。 要保持數據庫打開,請將 ;DB_CLOSE_DELAY=-1 添加到數據庫 URL。 要在虛擬機處於活動狀態時保留內存數據庫的內容,請使用 jdbc:h2:mem:test;DB_CLOSE_DELAY=-1。

因此,我認為如果您將 application.properties 文件中應用程序 #1 的 db 行設置為:

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

請讓我知道這是否能解決您的問題,因為我很好奇。 您的描述似乎表明它比這更復雜...涉及兩個應用程序的重疊訪問...但這聽起來確實像是您缺少的那種參數。

我是這樣做的,在你的 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

用於內存 H2 數據庫

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM