Java HSQLDB+;junit:间歇性;连接异常:关闭";

Java HSQLDB+;junit:间歇性;连接异常:关闭";,java,unit-testing,junit,hsqldb,maven-surefire-plugin,Java,Unit Testing,Junit,Hsqldb,Maven Surefire Plugin,在单元测试中使用HSQLDB时,我发现了一个奇怪的问题 我有一个使用内存中HSQLDB的单元测试,该测试在以下情况下间歇性失败: org.hsqldb.HsqlException: connection exception: closed 连同 org.hsqldb.HsqlException: connection exception: connection does not exist 我怀疑内存中的数据库在不同的测试运行之间以某种方式保持不变 我的测试如下所示: private sta

在单元测试中使用HSQLDB时,我发现了一个奇怪的问题

我有一个使用内存中HSQLDB的单元测试,该测试在以下情况下间歇性失败:

org.hsqldb.HsqlException: connection exception: closed
连同

org.hsqldb.HsqlException: connection exception: connection does not exist
我怀疑内存中的数据库在不同的测试运行之间以某种方式保持不变

我的测试如下所示:

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();
    }
}
错误是不一致的这一事实表明,在测试运行之间内存中有一些东西挂起,这很奇怪

我试过:

  • 将“shutdown=true”选项添加到destroy方法
  • 使URL中的DB名称在每个类中不同
  • 使用@After和@AfterClass清理连接
  • 每次运行测试时更改hsqldb的名称
注意,测试应该在内存中创建一个DB,然后将凭据传递给被测试的类,该类使用这些凭据通过
DriverManager
进行连接。测试结束后,我们删除表,然后基本上希望清空并销毁数据库


我正在使用
mvn clean install
从命令行运行这些测试

代码的语义;shutdown=true添加到URL的内容如下:

  • 它在第一次连接到数据库时有效,而不是在后续连接时有效

  • 当最后一个连接关闭时(通过调用close()方法),数据库也将关闭

您可以在destroy()方法中以SQL语句的形式执行
SHUTDOWN
,而不是指望所有连接都关闭