<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    歲月如哥
    人生非夢
    posts - 50,comments - 144,trackbacks - 0
    XX系統在生產環境使用一定時間后表現出用戶不能登錄,后臺tomcat日志報如下錯:
       
     2008-08-14 12:31:35,029 [org.hibernate.util.JDBCExceptionReporter]-[WARN] SQL Error: 0, SQLState: null
       
    2008-08-14 12:31:35,029 [org.hibernate.util.JDBCExceptionReporter]-[ERROR] Cannot get a connection, pool exhausted
       
    2008-08-14 12:31:35,029 [org.hibernate.util.JDBCExceptionReporter]-[WARN] SQL Error: 0, SQLState: null
       
    2008-08-14 12:31:35,029 [org.hibernate.util.JDBCExceptionReporter]-[ERROR] Cannot get a connection, pool exhausted

       顯然是連接池滿了,駐地工程師重啟之后就可以正常使用了。因為我們的tomcat連接池的配置連接參數好像很大,所以應該肯定是程序出問題了。后來在測試那也出現了同樣的問題,因為測試的人比較多,所以那兩天基本上一兩個小時連接池就滿了,當時只能一次一次的重啟tomcat。
       因為XX系統之前已經修改過一次因為代碼錯誤而導致的數據連接沒有釋放的問題,所以這一次的問題比較不好定位,不能知道是哪些操作的連接池沒有釋放。
       后來由zhxy提供了如下的查看當前數據庫(sybase)哪些連接沒有被釋放的腳本,其中的ip為tomcat的發布地址(因為數據庫連接都是由tomcat發起):
    declare cur_spid cursor 
    for
    select spid from sysprocesses where ipaddr='172.16.7.8'
    go

    declare @spid Integer
    open  cur_spid
    fetch cur_spid into @spid 
    while @@sqlstatus=0
    begin
            
    print '%1!' , @spid
      
    dbcc traceon(3604)
      
    dbcc sqltext(@spid )
      
    fetch cur_spid into @spid 
    end
    close cur_spid

    使用該腳本只能之后,執行結果都是打印出大量類似的下面的三行:
    184
    DBCC execution completed. If DBCC printed error messages, contact a user with System Administrator (SA) role. 
    SQL 
    Textset CHAINED off 
    直接使用上面的腳本打印的結果是當前占用數據庫連接池的spid(第一行),以及連接正在執行的sql(第三行)。   
      后來發現每登錄一次審判系統,使用上面的腳本執行結果就會有一個連接沒有被釋放(一般連接會在一段時間之后釋放),除非是重啟tomcat否則一直占用。
      跟蹤登陸代碼發現有如下的寫法(調用存儲過程):
    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()問題就沒有了,后來經zhangjy提醒,如果是使用spring提供的getSession()獲取的連接,最好是使用releaseSession()方法進行釋放。引用原話“release不一定是關閉連接,就像連接池的連接一樣。release只是放回池中,你要關閉了 就不能放回池中了 而且 直接close可能會拋異常,release不會拋異常 因為里邊有對環境的判斷”,把con.close()改成releaseSession()問題也解決了。
          但是我們的項目中使用了spring,對存儲過程調用最好是使用jdbcTemplate。退一步如果要獲取一個connection,最好能使用Summer提供的jdbcDao獲取,即jdbcdao.getDataSource().getConnection(),當然這樣的連接完全就需要自己手工關閉了。
          最后搜了一下代碼,把程序中如上調用存儲過程的地方全部改為使用jdbcTemplate問題解決。最終代碼如下:
    getJdbcDAO().getJdbcTemplate().execute(
                    
    "{call K_TJ..PR_GET_AjCount(?,?,?,?,?,?,?,?,?,?,?,?) }",
                    
    new CallableStatementCallback() {
                      
    public Object doInCallableStatement(CallableStatement cstmt)
                                    
    throws SQLException, DataAccessException {
                            
    //……
                            ResultSet resultSet = cstmt.executeQuery();
                            
    if (resultSet.next())
                              
    return new Integer(resultSet.getInt(1));
                            
    // ……
                    });
    連接池的問題解決。
    posted on 2008-08-30 15:03 歲月如歌 閱讀(7186) 評論(2)  編輯  收藏 所屬分類: java

    FeedBack:
    # re: 數據庫連接池滿的問題
    2008-12-17 10:21 | husl
    謝謝,寫得不錯,借用了,^_^  回復  更多評論
      
    # re: 數據庫連接池滿的問題[未登錄]
    2012-09-18 09:29 | c
    頂一下  回復  更多評論
      
    主站蜘蛛池模板: a级毛片在线视频免费观看| 国产精品久久久久免费a∨| 亚洲福利一区二区精品秒拍| 国产精品久久久久免费a∨ | 久久亚洲精品中文字幕| 免费电视剧在线观看| 一本岛v免费不卡一二三区| 亚洲午夜视频在线观看| 免费黄网在线观看| 两个人看的www免费视频中文| 亚洲一区二区久久| 亚洲国产精品成人AV无码久久综合影院 | 亚洲自偷自偷精品| 国产精品免费视频播放器| 在线观看片免费人成视频播放 | 久久国产精品萌白酱免费| 亚洲精品V天堂中文字幕| 亚洲国产成人片在线观看| 日本高清免费不卡在线| 精品一区二区三区无码免费视频 | 亚洲va在线va天堂va四虎| 免费无码黄网站在线观看| 欧洲精品99毛片免费高清观看| 疯狂做受xxxx高潮视频免费| 中文字幕亚洲第一在线| 色久悠悠婷婷综合在线亚洲| 成年丰满熟妇午夜免费视频| 伊人久久免费视频| 国产精品视频全国免费观看| 亚洲精品国产精品| 国产精品亚洲片在线va| 337p日本欧洲亚洲大胆精品555588 | 日本xxwwxxww在线视频免费| 8090在线观看免费观看| 99久久免费国产特黄| 特级aa**毛片免费观看| 亚洲国产日韩综合久久精品| 精品日韩亚洲AV无码一区二区三区 | 亚洲国产av美女网站| 亚洲AV永久纯肉无码精品动漫| 亚洲av麻豆aⅴ无码电影|