Glassfish 不重用 JDBC 个连接
Glassfish does not reuse JDBC Connections
我在 glassfish 网络服务器上使用 JDBC 连接池。我通过以下语句注入数据源:
@Resource(lookup="database")
DataSource db;
我用来加载数据的代码如下所示:
public ArrayList<Stuff> loadStuff()throws SQLException{
PreparedStatement ps = db.getConnection().prepareStatement("Select * from stufftable");
ResultSet rs = ps.executeQuery();
ArrayList<Stuff> stuffs= new ArrayList<Stuff>();
if(rs.next()){
Stuff stuff = new Stuff();
stuff.setString1(rs.getString("string1"));
stuff.setString1(rs.getString("string1"));
stuffs.add(stuff );
}
return stuffs;
}
出于某种原因,glassfish 没有重用数据库连接,因此我很快 运行 就摆脱了它们。
迟早我总是会收到这个错误:Error in allocating a connection. Cause: In-use connections equal max-pool-size and expired max-wait-time. Cannot allocate more connections.
据我了解在 glassfish 上合并的概念:我不应该在使用后关闭连接,因此其他东西可以在需要时重用连接。当不再需要连接时,Glassfish 会自行关闭连接。
为什么我的程序每次都打开一个新的连接?完成后我是否必须对连接做些什么?
您还需要致电Connection.close()
。您的池将管理您的连接,因此它们不会真正关闭,但如果您不在代码中 "close" 它们,它们将不会返回到池中。
编辑:或者,使用 try-with-resources:
Connection con = db.getConnection();
try {
PreparedStatement ps = con.prepareStatement("Select * from stufftable");
...
} finally {
// this returns the connection to the pool
con.close();
}
我在 glassfish 网络服务器上使用 JDBC 连接池。我通过以下语句注入数据源:
@Resource(lookup="database")
DataSource db;
我用来加载数据的代码如下所示:
public ArrayList<Stuff> loadStuff()throws SQLException{
PreparedStatement ps = db.getConnection().prepareStatement("Select * from stufftable");
ResultSet rs = ps.executeQuery();
ArrayList<Stuff> stuffs= new ArrayList<Stuff>();
if(rs.next()){
Stuff stuff = new Stuff();
stuff.setString1(rs.getString("string1"));
stuff.setString1(rs.getString("string1"));
stuffs.add(stuff );
}
return stuffs;
}
出于某种原因,glassfish 没有重用数据库连接,因此我很快 运行 就摆脱了它们。
迟早我总是会收到这个错误:Error in allocating a connection. Cause: In-use connections equal max-pool-size and expired max-wait-time. Cannot allocate more connections.
据我了解在 glassfish 上合并的概念:我不应该在使用后关闭连接,因此其他东西可以在需要时重用连接。当不再需要连接时,Glassfish 会自行关闭连接。
为什么我的程序每次都打开一个新的连接?完成后我是否必须对连接做些什么?
您还需要致电Connection.close()
。您的池将管理您的连接,因此它们不会真正关闭,但如果您不在代码中 "close" 它们,它们将不会返回到池中。
编辑:或者,使用 try-with-resources:
Connection con = db.getConnection();
try {
PreparedStatement ps = con.prepareStatement("Select * from stufftable");
...
} finally {
// this returns the connection to the pool
con.close();
}