H2内存数据库。 表未find

我有一个H2数据库的URL "jdbc:h2:test" 。 我使用CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64));创build了一个表CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64)); 。 然后,我使用SELECT * FROM PERSON从这个(空)表中select一切。 到现在为止还挺好。

但是,如果我将URL更改为"jdbc:h2:mem:test" ,唯一的区别是数据库现在只在内存中,这给了我一个org.h2.jdbc.JdbcSQLException: Table "PERSON" not found; SQL statement: SELECT * FROM PERSON [42102-154] org.h2.jdbc.JdbcSQLException: Table "PERSON" not found; SQL statement: SELECT * FROM PERSON [42102-154] 。 我可能在这里错过简单的东西,但任何帮助将不胜感激。

hbm2ddl创build表后closures连接,所以h2丢弃它。

如果你有你的连接URL这样configuration

 jdbc:h2:mem:test 

数据库的内容在上次连接closures时丢失。

如果你想保持你的内容,你必须像这样configurationurl

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

如果这样做,只要vm生活, h2将保持其内容。

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

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

很难说。 我创build了一个程序来testing这个:

 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(); } } 

testing运行完成,没有失败,没有意外的输出。 你运行的是哪个版本的h2?

H2内存数据库将数据存储在JVM内存中。 当JVM退出时,这些数据将丢失。

我怀疑你在做什么类似于下面的两个Java类。 其中一个类创build一个表,另一个尝试插入它:

 import java.sql.*; public class CreateTable { public static void main(String[] args) throws Exception { DriverManager.registerDriver(new org.h2.Driver()); Connection c = DriverManager.getConnection("jdbc:h2:mem:test"); PreparedStatement stmt = c.prepareStatement("CREATE TABLE PERSON (ID INT PRIMARY KEY, FIRSTNAME VARCHAR(64), LASTNAME VARCHAR(64))"); stmt.execute(); stmt.close(); c.close(); } } 

 import java.sql.*; public class InsertIntoTable { public static void main(String[] args) throws Exception { DriverManager.registerDriver(new org.h2.Driver()); Connection c = DriverManager.getConnection("jdbc:h2:mem:test"); PreparedStatement stmt = c.prepareStatement("INSERT INTO PERSON (ID, FIRSTNAME, LASTNAME) VALUES (1, 'John', 'Doe')"); stmt.execute(); stmt.close(); c.close(); } } 

当我依次运行这些类时,我得到了以下输出:

 C:\ Users \ Luke \ stuff> java CreateTable

 C:\ Users \ Luke \ stuff> java InsertIntoTable
线程“main”中的exceptionorg.h2.jdbc.JdbcSQLException:未find表“PERSON”;  SQL语句:
插入人(ID,FIRSTNAME,LASTNAME)值(1,'John','Doe')[42102-154]
        在org.h2.message.DbException.getJdbcSQLException(DbException.java:327)
        在org.h2.message.DbException.get(DbException.java:167)
        在org.h2.message.DbException.get(DbException.java:144)
         ...

只要第一个java进程退出,由CreateTable创build的表就不再存在。 所以,当InsertIntoTable类出现的时候,没有可以插入的表格。

当我将连接string更改为jdbc:h2:test ,发现没有这样的错误。 我也发现一个文件test.h2.db出现了。 这是H2放置表的地方,因为它已经存储在磁盘上,所以表仍然在那里,InsertIntoTable类可以find它。

我试图添加

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

但是,这并没有帮助。 在H2的网站上 ,我find了下面的内容,这在某些情况下的确有帮助。

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

但是 ,我的问题是,只是架构应该是不同于默认的架构。 所以使用

 JDBC URL: jdbc:h2:mem:test 

我不得不使用:

 JDBC URL: jdbc:h2:mem:testdb 

然后桌子是可见的

我来到这个职位,因为我有同样的错误。

在我的情况下,数据库的演变并没有执行,所以表格根本就没有。

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

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

Play使用几个演变脚本跟踪您的数据库演变。 这些脚本是用普通的旧SQL编写的,应该位于应用程序的conf / evolutions / {database name}目录下。 如果演变适用于您的默认数据库,则此path为conf / evolutions / default。

我有一个名为conf / evolutions.default的文件夹,由eclipse创build。 将文件夹结构更正为conf / evolutions / default后,问题消失了

 <bean id="benchmarkDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="org.h2.Driver" /> <property name="url" value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1" /> <property name="username" value="sa" /> <property name="password" value="" /> </bean>