以下给我:
org.h2.jdbc.JdbcSQLException:表“FOO”已经存在; SQL 声明
让我感到困惑,希望能有一些澄清。
H2服务器何时启动/关闭,getConnection
和close
?
already exists
为什么会出现?当H2服务器启动时,架构是否会保留以前的会话?
有关在H2中设置测试模式和数据集以用于数据库单元测试的最佳实践建议吗?
public class MyTest {
@Before
public void setUp() throws ClassNotFoundException, SQLException {
try {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:~/test;MODE=Oracle", "sa", "");
// add application code here
Statement statement =conn.createStatement();
statement.execute("create table foo (id integer)");
conn.commit();
ResultSet rs = statement.executeQuery("select * from foo");
if (rs.next()) {
System.out.println(rs.getString("id"));
}
statement.execute("insert into foo (id) values (5)");
conn.commit();
rs = statement.executeQuery("select * from foo");
if (rs.next()) {
System.out.println(rs.getString("id"));
}
conn.close();
} catch (Throwable t) {
t.printStackTrace();
}
}
@Test
public void test() {
}
}
答案 0 :(得分:4)
问题出在这里:
DriverManager.getConnection("jdbc:h2:~/test;MODE=Oracle", "sa", "");
你的连接字符串告诉H2在$HOME/test
下使用文件系统作为存储,所以毫不奇怪,它会在测试中持续存在。
来自doc:
嵌入式:
- jdbc:h2:~/test
:'测试'在用户主目录中
- jdbc:h2:/data/test
:'测试'在目录/data
在内存:
- jdbc:h2:mem:test
一个流程中的多个连接
- jdbc:h2:mem:
未命名的私人;一个连接
还有一种服务器模式,但你没有使用它,无论如何它对于单元测试毫无意义。对于单元测试,根据您的测试设计,您可能需要两种内存模式中的一种。
答案 1 :(得分:-1)