我在单元测试中使用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();
}
}
错误不一致的事实表明测试运行之间存在于内存中的事情,这很奇怪。
我试过了:
请注意,测试应在内存中创建数据库,然后将凭据传递给测试中的类,该类使用这些凭据通过DriverManager
进行连接。测试结束后,我们放弃表格,基本上想要清空并销毁数据库。
我正在使用mvn clean install
从命令行运行这些测试。
答案 0 :(得分:0)
添加到URL的;shutdown=true
语义如下:
它在第一次连接数据库时有效,而不是在后续连接上有效
当最后一个连接关闭时(通过调用close()方法),数据库也会关闭
您可以在destroy()方法中执行SHUTDOWN
作为SQL语句,而不是依赖于所有关闭的连接。