Java HSQLDB+;junit:间歇性;连接异常:关闭";
在单元测试中使用HSQLDB时,我发现了一个奇怪的问题 我有一个使用内存中HSQLDB的单元测试,该测试在以下情况下间歇性失败: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
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的名称
DriverManager
进行连接。测试结束后,我们删除表,然后基本上希望清空并销毁数据库
我正在使用
mvn clean install
从命令行运行这些测试 代码的语义;shutdown=true添加到URL的内容如下:
- 它在第一次连接到数据库时有效,而不是在后续连接时有效
- 当最后一个连接关闭时(通过调用close()方法),数据库也将关闭
SHUTDOWN
,而不是指望所有连接都关闭