问题

我有一个带有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?


原文链接