Java

在連接之間保持 H2 記憶體數據庫

  • October 20, 2019

我在 Java 中使用以下程式碼創建並使用 H2 記憶體數據庫(不寫入儲存)進行展示和快速測試:

Connection conn = DriverManager.getConnection( "jdbc:h2:mem:example_db" ) ;

這是第一次工作,但隨後數據庫似乎消失了,無法進行進一步的工作。隨著時間的推移,如何使用相同的記憶體數據庫?

DB_CLOSE_DELAY=-1

預設情況下,H2 中的記憶體數據庫在連接關閉後被丟棄。

要覆蓋此預設行為,請**設置DB_CLOSE_DELAY為負值。**您可以這樣做:

  • 與 JDBC 路徑建立連接時
  • 通過呼叫 SQL 命令

JDBC 路徑

要在連接關閉的情況下保持數據庫存在,請在 JDBC 路徑中添加一個元素。數據庫將繼續存在於記憶體中,直到您的應用程序退出。因此,您可以連續連接到同一個連續數據庫。

提示:注意數據庫名稱和此元素之間的分號(不是冒號)。

Connection conn = 
   DriverManager.getConnection( 
       "jdbc:h2:mem:example_db;DB_CLOSE_DELAY=-1"  // Set `DB_CLOSE_DELAY` to `-1` to keep in-memory database in existence after connection closes.
   ) 
; 

如果要顯式呼叫預設行為,請設置0. 在最後一個連接關閉後丟棄數據庫之前的幾秒鐘內,傳遞一個正整數 ( >=1 )。

此功能在手冊最後一段的記憶體數據庫部分中進行了介紹。

預設情況下,關閉與數據庫的最後一個連接會關閉數據庫。對於記憶體數據庫,這意味著內容失去。要保持數據庫打開,請將 ;DB_CLOSE_DELAY=-1 添加到數據庫 URL。要在虛擬機處於活動狀態時保留記憶體數據庫的內容,請使用 jdbc:h2:mem:test;DB_CLOSE_DELAY=-1。

SQL 命令

此設置也可以在執行時通過SET DB_CLOSE_DELAY命令進行操作,傳遞一個整數。

引用該文件:

SET DB_CLOSE_DELAY 整數

如果所有連接都關閉,則設置關閉數據庫的延遲。該值-1意味著數據庫永遠不會關閉,直到關閉延遲設置為其他值或被SHUTDOWN呼叫。該值0表示無延遲(預設值;如果與數據庫的最後一個連接關閉,則數據庫將關閉)。值1和更大的值表示關閉最後一個連接後數據庫保持打開狀態的秒數。

如果應用程序正常退出或呼叫 System.exit,則數據庫會立即關閉,即使設置了延遲也是如此。

執行此命令需要管理員權限,因為它會影響所有連接。此命令在此連接中送出一個打開的事務。此設置是持久的。可以將此設置附加到數據庫 URL:jdbc:h2:test;DB_CLOSE_DELAY=-1

例子:

SET DB_CLOSE_DELAY -1

引用自:https://dba.stackexchange.com/questions/224338