隨筆-61  評論-13  文章-19  trackbacks-0

          在Connection上調(diào)用close方法會關(guān)閉Statement和ResultSet嗎?

          級聯(lián)的關(guān)閉這聽起來好像很有道理,而且在很多地方這樣做也是正確的,通常這樣寫
          Connection con = getConnection();//getConnection is your method
          PreparedStatement ps = con.prepareStatement(sql);
          ResultSet rs = ps.executeQuery();
          ……
          ///rs.close();
          ///ps.close();
          con.close();? // NO!
          這樣做的問題在于Connection是個接口,它的close實現(xiàn)可能是多種多樣的。在普通情況下,你用 DriverManager.getConnection()得到一個Connection實例,調(diào)用它的close方法會關(guān)閉Statement和 ResultSet。但是在很多時候,你需要使用數(shù)據(jù)庫連接池,在連接池中的得到的Connection上調(diào)用close方法的時候,Connection可能并沒有被釋放,而是回到了連接池中。它以后可能被其它代碼取出來用。如果沒有釋放Statement和ResultSet,那么在Connection上沒有關(guān)閉的Statement和ResultSet可能會越來越多,那么……
          相反,我看到過這樣的說法,有人把Connection關(guān)閉了,卻繼續(xù)使用ResultSet,認為這樣是可以的,引發(fā)了激烈的討論,到底是怎么回事就不用我多說了吧。

          所以我們必須很小心的釋放數(shù)據(jù)庫資源,下面的代碼片斷展示了這個過程

          Connection con = null;
          PreparedStatement ps = null;
          ResultSet rs = null;

          try {
          ??? con = getConnection();//getConnection is your method
          ??? ps = con.prepareStatement(sql);
          ??? rs = ps.executeQuery();
          ??? ///...........
          }
          catch (SQLException ex) {
          ??? ///錯誤處理
          }
          finally{
          ??? try {
          ??????? if(ps!=null)
          ??????????? ps.close();
          ??? }
          ??? catch (SQLException ex) {
          ??????? ///錯誤處理
          ??? }
          ??? try{
          ??????? if(con!=null)
          ??????????? con.close();
          ??? }
          ??? catch (SQLException ex) {
          ??????? ///錯誤處理
          ??? }
          }

          ?

          posted on 2006-03-23 22:27 xnabx 閱讀(509) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 白银市| 临湘市| 温泉县| 内江市| 信丰县| 湄潭县| 睢宁县| 高要市| 河源市| 陇川县| 勐海县| 鄯善县| 阳泉市| 长丰县| 额济纳旗| 扎赉特旗| 舒城县| 靖州| 吴川市| 九江市| 西城区| 陆河县| 承德县| 峡江县| 元朗区| 遂平县| 拜泉县| 绥阳县| 平顺县| 永城市| 河间市| 石狮市| 炎陵县| 石阡县| 吐鲁番市| 柳河县| 正镶白旗| 泰安市| 清丰县| 德钦县| 八宿县|