使用DBCP池以服务器模式远程连接到H2数据库

时间:2014-07-02 09:57:22

标签: h2 apache-commons-dbcp

我正在尝试创建一个嵌入式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

有人有解决方案吗?

2 个答案:

答案 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。您需要一个客户端/服务器模式才能多次打开数据库。默认情况下,嵌入式数据库无法多次打开。您需要使用“自动混合模式”功能:

Mixed Mode for H2 database

因此,如果你按照以下方式修改你的jdbc网址,它应该可以工作:

JDBC:H2:/ TMP / MyApp的; AUTO_SERVER = TRUE