作成中のアプリケーションの開発データベースとして H2 を使用しています。アプリは Jetty を使用してデプロイされ、接続は Hibernate を介して処理されます。テーブルを作成するために、接続 URL で INIT パラメーターを使用してステートメントを実行しています。
問題は、この接続が頻繁にリセットされ、そのスクリプトが再実行されるように見えることです (したがって、最後の起動以降にデータベースに保存されたすべてが消去されます)。これは、起動直後に発生するようです。
スクリプトの最後に次のコードを追加しました。これにより、アプリケーションの最初の起動後にこのスクリプトが実行されることを確認できます。
DROP TABLE IF EXISTS system_msg;
CREATE TABLE system_msg (
id int AUTO_INCREMENT NOT NULL,
msg_date timestamp NULL,
msg text NULL,
PRIMARY KEY(id)
);
INSERT INTO system_msg(msg_date, msg)
VALUES (NOW(), 'Database schema created from DDL script');
アプリケーションの起動時に、Hibernate を使用してアプリケーションにいくつかのコア データを入力します。Web ページのメニュー構造は、起動時に生成されるエンティティの 1 つであり、通常はページを 1 回しかロードできません。ページを 2 回目に読み込むと、次のような結果が得られます。
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.example.web.model.front.Menu#1]
これは、キャッシュされたエンティティがデータベースで見つからなかったことを示しています。Web コンソールを使用して H2 データベースを確認すると、実際に init スクリプトが再度実行されていることがわかります (system_msg テーブルの投稿のタイムスタンプを調べます)。
- これは私の jetty-env.xml ファイルです: http://pastebin.com/N5184L6d
- これは私の hibernate.cfg.xml ファイルです: http://pastebin.com/bgsCVg0q
Ehcache と第 2 レベルのキャッシュを使用していますが、これが問題に関連しているかどうかはわかりません。その場合、現在の構成ファイルは次のとおりです: http://pastebin.com/nGG3eENf
Maven(組み込み)を使用して、Eclipse(Indigo)で開発しています。最初は、Jetty インスタンスのバックグラウンド リセットをトリガーするコード変更を行うたびに H2 データベース サーバーがリセットされると思っていましたが、コードに触れなくても発生します。
その他の仕様:
- ウィンドウズ7
- H2 v1.3.168
- Hibernate (および Ehcache) v4.1.7.Final
- Jetty Maven プラグイン (関連する場合) v8.1.3.v20120416
見逃した設定や、H2 データベースがリセットし続ける理由について他に考えられる説明はありますか?