我正在尝试创建一个嵌入式H2服务器,我也可以远程访问它并使用Tomcat DBCP Pooling。
这是我生成dataSource的代码:
@Produces @ApplicationScoped
public DataSource getDataSource() throws NamingException, SQLException {
dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.h2.jdbcx.JdbcDataSource");
dataSource.setUrl("jdbc:h2:/tmp/myapp");
dataSource.setUsername("sa");
dataSource.setPassword("");
dataSource.setMaxActive(100);
dataSource.setMaxIdle(30);
dataSource.setMaxWait(10000);
// start the pool
Connection connection = dataSource.getConnection();
// start the server
server = Server.createTcpServer("-tcpAllowOthers").start();
connection.close();
return dataSource;
}
当我尝试使用URL“jdbc:h2:tcp://192.168.2.58//tmp/myapp”(192.168.2.58)远程连接(使用H2浏览器(java -jar h2.jar -browser
))服务器的远程IP)这里是我得到的错误:
Database may be already in use: "/tmp/myapp.mv.db". Possible solutions: close all other connection(s); use the server mode [90020-179] 90020/90020
有人有解决方案吗?
答案 0 :(得分:1)
最后是有效的代码:
@ApplicationScoped
public class DataSourceProducer {
private JdbcDataSource dataSource;
private Server server;
@Produces @ApplicationScoped
public DataSource getDataSource() throws NamingException, SQLException {
dataSource = new JdbcDataSource();
dataSource.setUrl("jdbc:h2:/tmp/myapp");
dataSource.setUser("sa");
dataSource.setPassword("");
// start the server
server = Server.createTcpServer("-tcpAllowOthers").start();
return dataSource;
}
public void disposeDataSource(@Disposes DataSource dataSource) throws SQLException {
server.stop();
}
}
然后我可以使用URL jdbc:h2:tcp://<remote ip>//tmp/myapp
访问它(至少我通过SSH隧道连接9020端口并使用jdbc:h2:tcp://localhost//tmp/myapp
访问它)
答案 1 :(得分:0)
检查H2 Multiple connections。您需要一个客户端/服务器模式才能多次打开数据库。默认情况下,嵌入式数据库无法多次打开。您需要使用“自动混合模式”功能:
因此,如果你按照以下方式修改你的jdbc网址,它应该可以工作:
JDBC:H2:/ TMP / MyApp的; AUTO_SERVER = TRUE