我想为我的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,但我得到了相同的结果。
答案 0 :(得分:2)
您正在使用连接池,即BasicDataSource
。它最初会创建一个配置数量的连接,然后在调用getConnection()
时,它将重用一个自由池连接或创建一个新连接,直到配置的限制(如果配置的话,没有限制)。当获得的连接是"关闭"使用Connection.close()
,它实际上会返回到池而不是立即关闭。
除了配置最小和最大允许打开连接之外,您基本上无法控制在给定时间将有多少打开连接。你观察两个开放的连接,因此没有任何证据。如果要查看打开的连接是否有限制,请使用BasicDataSource.maxActive()
将BasicDataSource
配置为最多使用2个连接,然后尝试同时获取三个连接。对于另一个测试,使用相同的配置,尝试获取两个连接,使用Connection.close()
返回它们,然后获得另外两个连接。