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

          在Connection上調用close方法會關閉Statement和ResultSet嗎?

          級聯的關閉這聽起來好像很有道理,而且在很多地方這樣做也是正確的,通常這樣寫
          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實現可能是多種多樣的。在普通情況下,你用 DriverManager.getConnection()得到一個Connection實例,調用它的close方法會關閉Statement和 ResultSet。但是在很多時候,你需要使用數據庫連接池,在連接池中的得到的Connection上調用close方法的時候,Connection可能并沒有被釋放,而是回到了連接池中。它以后可能被其它代碼取出來用。如果沒有釋放Statement和ResultSet,那么在Connection上沒有關閉的Statement和ResultSet可能會越來越多,那么……
          相反,我看到過這樣的說法,有人把Connection關閉了,卻繼續使用ResultSet,認為這樣是可以的,引發了激烈的討論,到底是怎么回事就不用我多說了吧。

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

          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
          主站蜘蛛池模板: 商都县| 昌都县| 济源市| 农安县| 伊金霍洛旗| 那坡县| 家居| 台中县| 巴林右旗| 保亭| 七台河市| 宁南县| 云安县| 吴堡县| 乌拉特后旗| 陆河县| 楚雄市| 秭归县| 阿巴嘎旗| 涟水县| 龙海市| 绍兴市| 安吉县| 布尔津县| 平定县| 松潘县| 天台县| 若尔盖县| 太和县| 霍邱县| 东丽区| 祁东县| 咸阳市| 西平县| 兴隆县| 许昌县| 若羌县| 云浮市| 平谷区| 安陆市| 武胜县|