16

組み込みデータベースとして derby を使用しています。さらに、単体テストにはメモリ内データベース オプションを使用しています。

私が理解できないのは、Derby データベースを適切にシャットダウンする方法(コードをざっと見てみる)です。標準データベースでは機能していると思いますが、インメモリ データベースで同様のコードを実行しようとすると、別の例外が発生します。

詳細は割愛しますが、他の感触が必要な場合は追加します.

基本的に、インメモリ データベースが一貫して "eh" と呼ばれる次の 2 つの方法でデータベースをシャットダウンしようとしています。

DriverManager.getConnection("jdbc:derby:memory:eh;shutdown=true");

それから:

DriverManager.getConnection("jdbc:derby:eh;shutdown=true");

前者では例外が発生しますが、予期されたものではありません。詳細は次のとおりです。

java.sql.SQLNonTransientConnectionException: データベース 'memory:eh' がシャットダウンされました。

後者の結果は

java.sql.SQLException: データベース 'eh' が見つかりません。

私が把握できたことに基づいて、私たちは を望んでSQLExceptionいますが、受け取ったものは望んでいません。一方、SQLNonTransientConnectionExceptionエラーはより適切に見えますが、適切なタイプではなく (から派生しSQLExceptionていますが)、適切な状態コードもありません。州コードは次のようになります08006

私が持っているコード例はSQLException、SQL 状態が「XJ015」であることを示しています。

注: 私が参照している例は次のとおりです: WwdEmbedded Program ( Java Code )。

4

3 に答える 3

21

XJ015 ( SQLCODE50000 の場合) は、SQLSTATEシステムの完全なシャットダウンに期待される (成功する) ものです。一方、 08006 (45000 を含む) は、個々のデータベースのみのシャットダウンにSQLCODE予想されます。SQLSTATE

DriverManager.getConnection("jdbc:derby:;shutdown=true");

システム全体をシャットダウンし、XJ015.

于 2010-04-06T23:25:11.570 に答える
14

URL "jdbc:derby:memory:eh;shutdown=true" は、予想される 08006 エラー コードになりますが、実際にはメモリから DB を削除しません。後で「jdbc:derby:memory:eh;create=true」で新しいデータベースを作成しようとすると、データベースが既に存在するというエラーが表示されます。

幸いなことに、Derby 10.6.1.0 (2010 年 5 月 17 日にリリース) の時点で、「jdbc:derby:memory:eh;drop=true」という形式の URL を使用して、実際にメモリ内データベースを削除することができます。リリース ノートとページ内メモリ データベースの使用を参照してください。

于 2010-08-15T22:13:19.003 に答える