H2连接池

时间:2015-12-02 08:26:42

标签: java h2 apache-commons-dbcp

我想为我的h2数据库建立一个连接池。但我认为每次拨打getConnection()时我的游泳池都会打开新连接。我想应该有一定数量的可重用连接,但是如果我运行这段代码:

Connection conn = DataSource.getInstance().getConnection();
        Statement stmt = conn.createStatement();
        ResultSet rs;
        rs = stmt.executeQuery("SELECT * FROM NODE_USERS;");
        while (rs.next()) {
            System.out.println(rs.getString("login"));
        }
        try {
            // wait a bit
            Thread.sleep(20000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        stmt.close();
        rs.close();
        conn.close();  

的DataSource:

public class DataSource {

    private static volatile DataSource datasource;
    private BasicDataSource ds;

    private DataSource() throws IOException, SQLException, PropertyVetoException {
        ds = new BasicDataSource();
        ds.setUsername("sa");
        ds.setPassword("sa");
        ds.setUrl("jdbc:h2:tcp://localhost/~/test");       
        ds.setMinIdle(5);
        ds.setMaxActive(10);
        ds.setMaxIdle(20);
        ds.setMaxOpenPreparedStatements(180);

    }

    public static DataSource getInstance() throws IOException, SQLException, PropertyVetoException {
        if (datasource == null) {
            synchronized (DataSource.class) {
                if (datasource == null) {
                    datasource = new DataSource();
                }
            }
            datasource = new DataSource();
        }
        return datasource;
    }

    public Connection getConnection() throws SQLException {
        return this.ds.getConnection();
    }

}

然后执行select * from information_schema.sessions;,会有两行。怎么了?我也尝试了H2 tutorial example,但我得到了相同的结果。

1 个答案:

答案 0 :(得分:2)

您正在使用连接池,即BasicDataSource。它最初会创建一个配置数量的连接,然后在调用getConnection()时,它将重用一个自由池连接或创建一个新连接,直到配置的限制(如果配置的话,没有限制)。当获得的连接是"关闭"使用Connection.close(),它实际上会返回到池而不是立即关闭。

除了配置最小和最大允许打开连接之外,您基本上无法控制在给定时间将有多少打开连接。你观察两个开放的连接,因此没有任何证据。如果要查看打开的连接是否有限制,请使用BasicDataSource.maxActive()BasicDataSource配置为最多使用2个连接,然后尝试同时获取三个连接。对于另一个测试,使用相同的配置,尝试获取两个连接,使用Connection.close()返回它们,然后获得另外两个连接。