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>