資料庫連線池滿的問題
阿新 • • 發佈:2019-02-02
Session session =this.getSession();
Transaction tx = session.beginTransaction();
Connection con = session.connection();
try {
//…… CallableStatement cstmt = con.prepareCall("{call K_TJ..PR_GET_AjCount(?,?,?,?,?,?,?,?,?,?,?,?) }");
//…… ResultSet resultSet = cstmt.executeQuery();
tx.commit();
if (resultSet.next())
ajCount = resultSet.getInt(1);
resultSet.close();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
return 0;
} finally{
try
{
con.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
這裡有幾個問題,一是把hibernate和connection的用法使用混亂了;二是使用session獲取的連線不需要自己關閉,應該關閉session(一個session對應一個connection),這裡剛好用使用反了。
後來試著把con.close()改成session.close()問題就沒有了,後來經張進炎提醒,如果是使用spring提供的getSession()獲取的連線,最好是使用releaseSession()方法進行釋放。引用原話“release不一定是關閉連線,就像連線池的連線一樣。release只是放回池中,你要關閉了 就不能放回池中了 而且 直接close可能會拋異常,release不會拋異常 因為裡邊有對環境 的判斷”,把con.close()改成releaseSession()問題也解決了。
但是我們的專案中使用了spring,對儲存過程呼叫最好是使用jdbcTemplate。退一步如果要獲取一個connection,最好能使用Summer提供的jdbcDao獲取,即jdbcdao.getDataSource().getConnection(),當然這樣的連線完全就需要自己手工關閉了。
最後搜了一下程式碼,把程式中如上呼叫儲存過程的地方全部改為使用jdbcTemplate問題解決。最終程式碼如下:
Transaction tx = session.beginTransaction();
Connection con = session.connection();
try {
//…… CallableStatement cstmt = con.prepareCall("{call K_TJ..PR_GET_AjCount(?,?,?,?,?,?,?,?,?,?,?,?) }");
tx.commit();
if (resultSet.next())
ajCount = resultSet.getInt(1);
resultSet.close();
} catch (Exception e) {
tx.rollback();
e.printStackTrace();
return
} finally{
try
{
con.close();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
這裡有幾個問題,一是把hibernate和connection的用法使用混亂了;二是使用session獲取的連線不需要自己關閉,應該關閉session(一個session對應一個connection),這裡剛好用使用反了。
後來試著把con.close()改成session.close()問題就沒有了,後來經張進炎提醒,如果是使用spring提供的getSession()獲取的連線,最好是使用releaseSession()方法進行釋放。引用原話“release不一定是關閉連線,就像連線池的連線一樣。release只是放回池中,你要關閉了 就不能放回池中了 而且 直接close可能會拋異常,release不會拋異常 因為裡邊有對環境
但是我們的專案中使用了spring,對儲存過程呼叫最好是使用jdbcTemplate。退一步如果要獲取一個connection,最好能使用Summer提供的jdbcDao獲取,即jdbcdao.getDataSource().getConnection(),當然這樣的連線完全就需要自己手工關閉了。
最後搜了一下程式碼,把程式中如上呼叫儲存過程的地方全部改為使用jdbcTemplate問題解決。最終程式碼如下: