控制台无法访问内存模式下的嵌入式数据库 – H2数据库
发布时间:2020-05-23 06:26:37 所属栏目:MsSql 来源:互联网
导读:我在H2数据库中通过servlet上下文启动中的以下代码创建一个内存数据库 void initDb() { try { webserver = Server.createWebServer().start(); Class.forName(org.h2.Driver); Connection conn = DriverManager
|
我在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();
}
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
