アプリケーションに埋め込まれたH2データベース(永続的)を使用しています。
テーブルを削除した後でも、h2.dbファイルは増え続けます。
トランザクション分離の無効化(LOCK_MODE = 0)、クエリログの無効化(TRACE_LEVE_FILE = 0)、取り消しログの無効化を試みましたが、何も役に立ちません。
圧縮が唯一のオプションですか?圧縮にはDBの再起動が必要になりますが、これはできません。
使用TRACE_LEVE_FILE=0
するとファイルにのみ影響します{databaseName}.trace.db
。トレースの無効化は使用しないことをお勧めします。このファイル{databaseName}.trace.db
には、人間が読める形式のエラーメッセージと警告が含まれており、通常は空である必要があります。空でない場合は、アプリケーションにバグがある可能性があります。
データベースファイルが大きくなる最も一般的な原因は、コミットされていないトランザクションです。すべてのトランザクションをコミットしましたか?最新バージョンのH2(1.3.168)では、「トランザクションログを切り捨てることができませんでした」というメッセージがファイルに書き込まれ{databaseName}.trace.db
ます。ただし、これにはを使用しないでくださいTRACE_LEVE_FILE=0
。
ファイルの空きスペースは再利用されますが、データベースが開いている間、ファイルは縮小されないことに注意してください。
この問題は解決されました。問題は、サーブレットコンテキストに格納されている接続を使用していたことでした。この接続は決して閉じられませんでした。コードを変更して、自分で接続を管理し、テーブルが削除された後(および再度開いた後)に接続を閉じます。
H2データベースを縮小することができた最も効率的で最も簡単な方法は、次のステートメントSHUTDOWNCOMPACTを実行してからSHUTDOWNDEFRAGを実行することです。削除されたレコードの後に残った未使用のスペースをクリーンアップします。
DatasourceConfig datasourceConfig = springContext.getBean(DatasourceConfig.class);
System.out.println("H2 DB shutdown hook");
Connection con = null;
try {
con = DriverManager.getConnection(datasourceConfig.getDatasourceUrl(), datasourceConfig.getUsername(), "");
con.createStatement().execute("SHUTDOWN DEFRAG");
} catch (SQLException var13) {
System.out.println("Could not shut down embedded database" + var13);
} finally {
if(con != null) {
try {
con.close();
} catch (Throwable var12) {
System.out.println("Could not close JDBC Connection on shutdown" + var12);
}
}
}
SHUTDOWNステートメントの詳細を確認できます。https://www.h2database.com/html/commands.html#shutdown