【问题标题】:H2 connection poolH2连接池
【发布时间】:2015-12-02 08:26:42
【问题描述】:

我想为我的 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();  

数据源:

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,但我得到了相同的结果。

【问题讨论】:

    标签: java h2 apache-commons-dbcp


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-20
      • 2018-10-15
      • 1970-01-01
      • 2016-02-13
      • 2015-05-02
      • 1970-01-01
      相关资源
      最近更新 更多