2017-11-24 13 views
0

ユニットテストでHSQLDBを使用しているときに奇妙な問題が発生しています。HSQLDB + junit:断続的な「接続例外:閉じ」

Iは、以下で間欠的に失敗しているメモリー内HSQLDBを使用してユニットテストを持っている:

org.hsqldb.HsqlException: connection exception: closed 

org.hsqldb.HsqlException: connection exception: connection does not exist 

と共にマイ疑いがインメモリDBを何とか持続されることです異なるテストランの間。

私のテストでは、次のようになります。

private static final String DRIVER = "org.hsqldb.jdbc.JDBCDriver"; 
private static final String URL = "jdbc:hsqldb:mem:test2"; 

@BeforeClass 
public static void init() throws SQLException, ClassNotFoundException, IOException { 
    Class.forName(DRIVER); 
    populateDatabase(); 
} 

private static Connection getConnection() throws SQLException { 
    return DriverManager.getConnection(URL, user, user); 
} 

private static void populateDatabase() throws SQLException { 
    try (Connection connection = getConnection(); Statement statement = connection 
      .createStatement()) { 
     statement.execute(
       "CREATE TABLE employee (name VARCHAR(50) NOT NULL, " 
         + " age INT NOT NULL, outputcol FLOAT)"); 
     connection.commit(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@AfterClass 
public static void destroy() throws SQLException, ClassNotFoundException, IOException { 
    try (Connection connection = DriverManager 
      .getConnection(URL + ";shutdown=true", user, user); 
      Statement statement = connection.createStatement()) { 
     statement.executeUpdate("DROP TABLE employee"); 
     connection.commit(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

エラーが奇妙であるテスト実行の間メモリにぶらぶら何か、に矛盾点にあるという事実を。

私が試してみました:

  • がため@Afterと@AfterClassを使用して
  • 各クラスの異なるURLにDB名を作る破壊する方法
  • に「シャットダウン= true」のオプションを追加しますHSQLDBのテストが

注意を実行するたびに名前を変更し、接続

  • をクリーンアップすることテスト寿メモリにDBを作成し、テスト対象のクラスに資格情報を渡します。このクラスは、これらの資格情報を使用してDriverManagerで接続します。テストが終了したら、テーブルを削除して基本的にDBを空にして破棄したい。

    私はこれらのテストをコマンドラインからmvn clean installで実行しています。次のようにURLに付加;shutdown=true

  • 答えて

    0

    セマンティクスは次のとおり

    • 最後の接続が閉じているとき、それはしない後続の接続

    • に、データベースへの最初の接続に有効です( close()メソッドを呼び出すことによって)データベースもシャットダウンされます

    SHUTDOWNをSQL文として実行できますあなたのdestroy()メソッドで、すべての接続が閉じているかどうかを調べるのではなく、

    関連する問題