我在H2数据库中通过servlet上下文启动中的以下代码创建一个内存数据库
void initDb() { try { webserver = Server.createWebServer().start(); Class.forName("org.h2.Driver"); Connection conn = DriverManager.getConnection("jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1","SA",""); InputStream in = getClass().getResourceAsStream("script.sql"); if (in == null) { System.out.println("Please add the file script.sql to the classpath,package " + getClass().getPackage().getName()); } else { RunScript.execute(conn,new InputStreamReader(in)); Statement stat = conn.createStatement(); ResultSet rs = stat.executeQuery("SELECT TO_CHAR(bday,'DD/MM/yyyy hh24:mi') FROM TEST2"); while (rs.next()) { System.out.println(rs.getString(1)); } rs.close(); stat.close(); conn.commit(); conn.close(); } //accessed using url jdbc:h2:tcp://localhost/mem:db1 try{ CachedRowSet crs = new DBConnector().executeQuery("select * from test2"); while(crs.next()){ System.out.println("ARGUMENT_NAME:"+crs.getString(1)); // System.out.println(",DATA_TYPE:"+crs.getString("DATA_TYPE")); } crs.close(); }catch(sqlException e){ e.printStackTrace(); } } catch (Exception e) { //this exception gets throws connection Failed! System.out.println("Exception initializing memory H2 database"+e); } }
我后来在同一个JVM中访问url jdbc:h2:mem:db1,这也是一样.但是当我想通过jdbc访问它时:h2:tcp:// localhost / mem:db1它在同一个JVM或不同的JVM中不起作用.
我实际上想要以嵌入式模式运行系统,并使用控制台查看内容.如果我在同一个servlet上下文启动方法中启动Web服务器,我可以看到控制台,但仍然没有使用url jdbc:h2:tcp:// localhost / mem:db1连接到内存数据库.
如果我使用命令行启动服务器
java -cp "WebContent/WEB-INF/lib/h2-1.3.148.jar;hsqldb.jar;%H2DRIVERS%;%CLASSPATH%" org.h2.tools.Console %* and url as 'jdbc:h2:tcp://localhost/mem:db1'
然后尝试连接,令人惊讶的是它连接但没有数据.好像它正在自己创建一个独立的服务器和一个不同的数据库.所以没有数据.
解决方法
要使内存中的数据库可用于另一个进程,您需要在打开数据库的过程中启动TCP服务器.例:
package db; import java.sql.Connection; import java.sql.DriverManager; import org.h2.tools.Server; public class TestMem { public static void main(String... args) throws Exception { // open the in-memory database within a VM Class.forName("org.h2.Driver"); Connection conn = DriverManager.getConnection("jdbc:h2:mem:test"); conn.createStatement().execute("create table test(id int)"); // start a TCP server // (either before or after opening the database) Server server = Server.createTcpServer().start(); // .. use in embedded mode .. // or use it from another process: System.out.println("Server started and connection is open."); System.out.println("URL: jdbc:h2:" + server.getURL() + "/mem:test"); // now start the H2 Console here or in another process using // java org.h2.tools.Console -web -browser System.out.println("Press [Enter] to stop."); System.in.read(); System.out.println("Stopping server and closing the connection"); server.stop(); conn.close(); } }