内存模式下的H2数据库无法通过Console访问
我在 servlet 上下文启动时通过以下代码在 H2 数据库中创建一个内存数据库,
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'
然后尝试连接,令人惊讶的是它连接但没有数据。似乎它正在自己创建一个单独的服务器和一个不同的数据库。所以没有数据。
I am creating an in memory database in H2 database by the following code on servlet context startup
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);
}
}
I am later on accessing by url jdbc:h2:mem:db1
in the same JVM, which is working too. But when i want to access it by jdbc:h2:tcp://localhost/mem:db1
it is not working either in the same JVM or in different JVM.
I actually want to run the system in embedded mode and see the contents using the console. If I start the webserver in the same servlet context startup method I am able to see the Console but it is still not connecting to the in memory DB with url jdbc:h2:tcp://localhost/mem:db1
.
If I start the server using Command line using
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'
And then try to connect, surprisingly it connects but with no data. Seems like it is creating a seperate server on its own and its a different db. So there is no data.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
要使内存数据库可供其他进程使用,您需要在打开数据库的同一进程中启动 TCP 服务器。例子:
To make the in-memory database available for another process, you need to start a TCP server in the same process as the database was opened. Example: