[英]Connection Pooling: To Close or Not to Close Connections?
我在JSF Java應用程序中使用dbcp的BasicDataSource
。 由於基本約定是在使用后關閉連接,因此我在catch中-最終在我的代碼中這樣做。 但是,應用程序因錯誤而停止運行,
java.sql.SQLException: Connection is null.
at org.apache.tomcat.dbcp.dbcp2.DelegatingConnection.checkOpen(DelegatingConnection.java:611)
at org.apache.tomcat.dbcp.dbcp2.DelegatingConnection.createStatement(DelegatingConnection.java:258)
因此, 我決定不關閉我的連接; 我的代碼幾乎可以正常運行,但是隨后經常因以下錯誤而停止:
Caused by: org.postgresql.util.PSQLException: FATAL: remaining connection slots are reserved for non-replication superuser connections
以下是我的連接配置:
public class StageDB {
public StageDB() {}
public static Connection getConnection() {
BasicDataSource ds = new BasicDataSource();
ds.setDriverClassName(JDBC_DRIVER);
ds.setUsername(USER);
ds.setPassword(PASS);
ds.setUrl(DB_URL);
ds.setTimeBetweenEvictionRunsMillis(20*1000);
ds.setMinIdle(0);
ds.setMaxIdle(10);
ds.setMaxOpenPreparedStatements(100);
conn = ds.getConnection();
return conn;
}
}
我應該提到我嘗試使用這些設置,也使用默認設置,但結果相同。 我可能做錯了什么?
在意識到自己做錯了一切之后,我找到了解決方案。 因此,這就是我能夠想到的,與我的設計方法完美配合。
//1. Create pooled connections datasource class using the Singleton.
/***************************
* This is the pooled datasource class
****************************/
public class PrimaryDS {
private PrimaryDS primaryDS;
public PrimaryDS() {
ds = new BasicDataSource();
ds.setDriverClassName(JDBC_DRIVER);
ds.setUsername(USER);
ds.setPassword(PASS);
ds.setUrl(DB_URL);
}
public static PrimaryDS getInstance() {
primaryDS = primaryDS == null ? new PrimaryDS() : primaryDS;
return primaryDS;
}
public BasicDataSource getDataSource() {
return ds;
}
public void setDataSource(BasicDataSource ds) {
this.ds = ds;
}
}
//2. DAOs make call to the datasource. Initialize DS in the DAO's constructor.
/***************************
* This is in the DAO's constructor
****************************/
ds = PrimaryDS.getInstance().getDataSource();
//3. DAOs have the database manupulation methods. In each of these methods,
//create connection object from ds, and ensure it's closed in the catch - finally.
/***************************
* This is inside one of the DAO methods
****************************/
try {
conn = ds.getConnection();
stmt = null;
rs = null;
PreparedStatement pstmt = conn.prepareStatement(ACTIVE_ACCOUNTS_SQL);
pstmt.setByte(1,status);
ResultSet rs = pstmt.executeQuery();
// TODO loop through rs
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.