Derby インメモリデータベースを適切にシャットダウンする方法
-
22-09-2019 - |
質問
組み込みデータベースとして derby を使用しています。さらに、単体テストにはインメモリ データベース オプションを使用しています。
理解できないのは、適切にシャットダウンする方法です (コードをざっと見てみましょう) ダービーデータベース。標準データベースでは機能していると信じていますが、インメモリデータベースで同様のコードを試行すると、別の例外が発生します。
詳細は省略しますが、他の感覚が必要な場合は追加します。
基本的に、メモリ内のデータベースが一貫して「えー」と呼ばれる次の 2 つの方法でデータベースをシャットダウンしようとしています。
DriverManager.getConnection("jdbc:derby:memory:eh;shutdown=true");
それから:
DriverManager.getConnection("jdbc:derby:eh;shutdown=true");
前者の結果は次のようになります 例外だが予期したものではない. 。詳細は次のとおりです。
java.sql.SQLNonTransientConnectionException:データベース「memory:eh」がシャットダウンされました。
後者の結果は次のようになります
java.sql.SQL例外:データベース「えー」が見つかりません。
私が理解できたことに基づいて、私たちが望んでいるのは、 SQLException
しかし、私たちが受け取るものではありません。一方、 SQLNonTransientConnectionException
error のほうが適切だと思われますが、正しいタイプではありません (ただし、これは次から派生したものです) SQLException
)また、正しい状態コードもありません。状態コードは最終的に次のようになります。 08006
.
私が持っているサンプルコードは、 SQLException
SQL 状態は「XJ015」です。
注記:私が参照している例は次のとおりです。 WwdEmbedded プログラム (Javaコード).
解決
XJ015(SQLCODE
50000とは)完全なシステムのシャットダウンのための予想(成功)SQLSTATE
です。 08006(SQLCODE
45000を有する)、一方、唯一の個々のデータベースのシャットダウンの予想SQLSTATE
である。
DriverManager.getConnection("jdbc:derby:;shutdown=true");
システム全体のシャットダウンとXJ015
をもたらすはずである。
他のヒント
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 を使用して、メモリ内データベースを実際に削除することが可能です。を参照してください。 リリースノート そしてページ インメモリデータベースの使用.
私はあなたの最初のコード例は大丈夫であると信じています。あなたは組み込みDerbyを実行しているが、あなたは(SQL状態XJ015で)見たことのコード例では、クライアント・サーバー構成で実行されていたので、あなたが見ていることをSQL状態の違いは、私は信じている。
あなたが述べたように、私はあなたが例外の右の種類を取得されていませんだと思う理由として混乱していますので、は、SQLNonTransientConnectionExceptionは、のSQLExceptionのサブクラスです。