问题
我有一个带有URL"jdbc:h2:test"
的H2数据库。我使用466619280创建了一个表。然后我使用SELECT * FROM PERSON
从这个(空)表中选择所有内容。到现在为止还挺好。
但是,如果我将URL更改为"jdbc:h2:mem:test"
,唯一的区别是数据库现在只在内存中,这给了我org.h2.jdbc.JdbcSQLException: Table "PERSON" not found; SQL statement: SELECT * FROM PERSON [42102-154]
。我可能在这里遗漏了一些简单的东西,但任何帮助都会受到赞赏。
#1 热门回答(247 赞)
hbm2ddl在创建表后关闭连接,因此h2将其丢弃。
如果你的connection-url配置如下
jdbc:h2:mem:test
在最后一次连接关闭时,数据库的内容将丢失。
如果你想保留你的内容,你必须像这样配置网址
jdbc:h2:mem:test;DB_CLOSE_DELAY=-1
如果这样做,h2将保留其内容,只要vmlives。
#2 热门回答(69 赞)
我知道这不是你的情况,但我遇到了同样的问题,因为H2正在创建具有大写名称的表,然后表现区分大小写,即使在所有脚本(包括创建脚本)中我使用小写。
通过添加;DATABASE_TO_UPPER=false
解决连接URL问题。
#3 热门回答(10 赞)
很难说。我创建了一个程序来测试这个:
package com.gigaspaces.compass;
import org.testng.annotations.Test;
import java.sql.*;
public class H2Test {
@Test
public void testDatabaseNoMem() throws SQLException {
testDatabase("jdbc:h2:test");
}
@Test
public void testDatabaseMem() throws SQLException {
testDatabase("jdbc:h2:mem:test");
}
private void testDatabase(String url) throws SQLException {
Connection connection= DriverManager.getConnection(url);
Statement s=connection.createStatement();
try {
s.execute("DROP TABLE PERSON");
} catch(SQLException sqle) {
System.out.println("Table not found, not dropping");
}
s.execute("CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64))");
PreparedStatement ps=connection.prepareStatement("select * from PERSON");
ResultSet r=ps.executeQuery();
if(r.next()) {
System.out.println("data?");
}
r.close();
ps.close();
s.close();
connection.close();
}
}
测试运行完成,没有失败,也没有意外输出。你运行的是哪个版本的h2?