我有一个H2数据库的URL“jdbc: H2:test”。我使用create table PERSON (ID INT主键,名字VARCHAR(64),姓VARCHAR(64));;然后使用select * from PERSON从这个(空)表中选择所有内容。到目前为止,一切顺利。

然而,如果我将URL更改为“jdbc:h2:mem:test”,唯一的区别是数据库现在只在内存中,这给了我一个org.h2.jdbc。JdbcSQLException:表“PERSON”未找到;SQL语句:SELECT * FROM PERSON[42102-154]。我可能错过了一些简单的东西,但任何帮助将不胜感激。


当前回答

很难说。我创建了一个程序来测试这个:

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 ?

其他回答

通过创建一个新的src/test/resources文件夹+插入应用程序来解决。属性文件,显式指定创建test dbase:

spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create

我来这个职位是因为我也犯了同样的错误。

在我的例子中,数据库演化没有被执行,所以表根本就不存在。

我的问题是进化脚本的文件夹结构是错误的。

来自:https://www.playframework.com/documentation/2.0/Evolutions

Play使用多个演进脚本跟踪数据库演进。这些脚本是用普通的SQL编写的,应该位于应用程序的conf/evolution /{数据库名}目录中。如果演进应用于默认数据库,则该路径为conf/evolutions/default。

我在eclipse中创建了一个名为conf/evolution .default的文件夹。在我将文件夹结构修正为conf/evolution /default后,这个问题消失了

当打开h2-console时,JDBC URL必须与属性中指定的URL匹配:

spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:testdb

spring.jpa.hibernate.ddl-auto=create
spring.jpa.show-sql=true

spring.h2.console.enabled=true

这似乎是显而易见的,但我花了几个小时来解决这个问题。

我知道这不是你的情况下,但我有同样的问题,因为H2是创建表的大写名称,然后行为区分大小写,即使在所有脚本(包括在创建的一个)我使用小写。

通过向连接URL添加;DATABASE_TO_UPPER=false来解决。

我已经试着补充了

jdbc:h2:mem:test;DB_CLOSE_DELAY=-1

然而,这并没有帮助。在H2网站上,我发现以下,这确实可以在某些情况下有所帮助。

默认情况下,关闭到数据库的最后一个连接将关闭数据库。对于内存中的数据库,这意味着内容丢失。要保持数据库打开,在数据库URL中添加;DB_CLOSE_DELAY=-1。要在虚拟机处于活动状态时保持内存中数据库的内容,请使用jdbc:h2:mem:test;DB_CLOSE_DELAY=-1。

然而,我的问题是模式应该与默认模式不同。所以不用

JDBC URL: jdbc:h2:mem:test

我不得不使用:

JDBC URL: jdbc:h2:mem:testdb

然后桌子就可见了