gpt4 book ai didi

java - H2连接池

转载 作者:行者123 更新时间:2023-11-30 03:08:59 25 4
gpt4 key购买 nike

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

最佳答案

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

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

关于java - H2连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34037955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com