1. 程式人生 > >資料庫連線池滿的問題

資料庫連線池滿的問題

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問題解決。最終程式碼如下: