ZhipSoft.com
              冬去春來
                  鄭重聲明:本Blog純屬個人學習、工作需要,記錄相關資料。請不要發表任何有人身攻擊的言論,謝謝!!www.ZhipSoft.com
          posts - 94,comments - 149,trackbacks - 0
          <2007年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          鄭重聲明:本Blog純屬個人學習、工作需要,記錄相關資料。請不要發表任何有人身攻擊的言論,謝謝!!
          www.ZhipSoft.com

          常用鏈接

          留言簿(5)

          隨筆分類(82)

          隨筆檔案(94)

          博客鏈接

          站點收藏

          搜索

          •  

          積分與排名

          • 積分 - 344362
          • 排名 - 160

          最新評論

          閱讀排行榜

          評論排行榜

          在java應用中,我們會經常用oracle jdbc.在開發中我們有時候會遇到(ORA-01000: maximum open cursors

          exceeded)的錯誤。在ITPUB上juant曾發過一篇帖子:http://www.itpub.net/showthread.php?

          s=&threadid=122832&perpage=15&pagenumber=1

          [TIP]關于Java開發中使用Oracle數據庫的一點注意事項(原創)

          很多朋友在Java開發中,使用Oracle數據庫的時候,經常會碰到有ORA-01000: maximum open cursors exceeded.的

          錯誤。

          實際上,這個錯誤的原因,主要還是代碼問題引起的。
          ora-01000: maximum open cursors exceeded.
          表示已經達到一個進程打開的最大游標數。

          這樣的錯誤很容易出現在Java代碼中的主要原因是:Java代碼在執行conn.createStatement()和

          conn.prepareStatement()的時候,實際上都是相當與在數據庫中打開了一個cursor。尤其是,如果你的

          createStatement和prepareStatement是在一個循環里面的話,就會非常容易出現這個問題。因為游標一直在不停的打

          開,而且沒有關閉。

          一般來說,我們在寫Java代碼的時候,createStatement和prepareStatement都應該要放在循環外面,而且使用了這些

          Statment后,及時關閉。最好是在執行了一次executeQuery、executeUpdate等之后,如果不需要使用結果集

          (ResultSet)的數據,就馬上將Statment關閉。

          對于出現ORA-01000錯誤這種情況,單純的加大open_cursors并不是好辦法,那只是治標不治本。實際上,代碼中的隱

          患并沒有解除。
          而且,絕大部分情況下,open_cursors只需要設置一個比較小的值,就足夠使用了,除非有非常特別的要求。

           

          對這個問題專門研究了一下,并寫了測試程序,首先說一些測試環境,我們的數據庫最大可打開的cursor設置為600,操

          作的數據庫表的記錄數為30條記錄。為了模擬同時打開600cursor,也就是說有600個statement在運行,必須用到java

          的多線程。下面是測試程序:

          public class StatementTest extends Thread{
            private Connection conn;
            public StatementTest(Connection conn) {
              this.conn = conn;
              start();
            }
           
            public void run(){
                try {
             String strSQL = "SELECT * FROM  TestTable"
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery(strSQL);
             int i = 0;
             while(rs.next()){
                System.out.println("----"+i+"------");
                i = i+1;
             }
             rs.close();
                  stmt.close();  
            
           } catch (Exception e) {
             // TODO: handle exception
             e.printStackTrace();
           }
           
            }


            public static void main(String args[]){
              try{
                Connection conn = DBConnection.getConnection();
               
                for(int i = 0;i < 800;i++){
              
                 new StatementTest(conn);
                }
               }catch(Exception e){
           e.printStackTrace();
               }      

            }
           
          }



                  本Blog純屬個人學習、工作需要,記錄相關資料。請不要發表任何有人身攻擊的言論,謝謝! www.zhipsoft.cn
          posted on 2007-07-31 15:12 ZhipSoft 閱讀(1351) 評論(0)  編輯  收藏 所屬分類: DataBase
          主站蜘蛛池模板: 澄城县| 会理县| 澄江县| 定结县| 锡林浩特市| 甘南县| 乌鲁木齐县| 苍山县| 台北县| 桓仁| 盖州市| 衡南县| 老河口市| 延边| 石家庄市| 新巴尔虎左旗| 湘乡市| 池州市| 惠水县| 枣阳市| 桐柏县| 通化县| 手游| 江城| 舞阳县| 开鲁县| 邛崃市| 龙山县| 恭城| 绵竹市| 花莲县| 全椒县| 阿克陶县| 深圳市| 万全县| 三明市| 台前县| 科尔| 三都| 德清县| 辽阳市|