国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
三種JDBC批量插入編程方法的比較
JDBC批量插入主要用于數據導入和日志記錄因為日志一般都是先寫在文件下的等。
我用Mysql 5.1.5的JDBC driver 分別對三種比較常用的方法做了測試

  • 方法一,使用PreparedStatement加批量的方法
Java代碼
  1.     
  2. try {   
  3.       Class.forName("com.mysql.jdbc.Driver");   
  4.       conn = DriverManager.getConnection(o_url, userName, password);   
  5.       conn.setAutoCommit(false);   
  6.       String sql = "INSERT adlogs(ip,website,yyyymmdd,hour,object_id) VALUES(?,?,?,?,?)";   
  7.       PreparedStatement prest = conn.prepareStatement(sql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);   
  8.       for(int x = 0; x < size; x++){   
  9.          prest.setString(1"192.168.1.1");   
  10.          prest.setString(2"localhost");   
  11.          prest.setString(3"20081009");   
  12.          prest.setInt(48);   
  13.          prest.setString(5"11111111");   
  14.          prest.addBatch();   
  15.       }   
  16.       prest.executeBatch();   
  17.       conn.commit();   
  18.       conn.close();   
  19. catch (SQLException ex) {   
  20.    Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null, ex);   
  21. catch (ClassNotFoundException ex) {   
  22.      Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null, ex);   
  23. }  

說明下在建Statement的時候,后面兩個參數的意義:
第一個參數指定 ResultSet 的類型。其選項有:
TYPE_FORWARD_ONLY:缺省類型。只允許向前訪問一次,并且不會受到其他用戶對該數據庫所作更改的影響。
TYPE_SCROLL_INSENSITIVE:允許在列表中向前或向后移動,甚至可以進行特定定位,例如移至列表中的第四個記錄或者從當前位置向后移動兩個記錄。不會受到其他用戶對該數據庫所作更改的影響。
TYPE_SCROLL_SENSITIVE:象 TYPE_SCROLL_INSENSITIVE 一樣,允許在記錄中定位。這種類型受到其他用戶所作更改的影響。如果用戶在執(zhí)行完查詢之后刪除一個記錄,那個記錄將從 ResultSet 中消失。類似的,對數據值的更改也將反映在 ResultSet 中。
第二個參數設置 ResultSet 的并發(fā)性,該參數確定是否可以更新 ResultSet。其選項有:
CONCUR_READ_ONLY:這是缺省值,指定不可以更新
ResultSet CONCUR_UPDATABLE:指定可以更新 ResultSet

  • 方法二 使用Statement加批量的方法

Java代碼
  1.     
  2.  conn.setAutoCommit(false);   
  3.  Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);   
  4.  for(int x = 0; x < size; x++){   
  5.    stmt.addBatch("INSERT INTO adlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3', 'localhost','20081009',8,'23123')");   
  6.  }   
  7. stmt.executeBatch();   
  8. conn.commit();  


  • 方法三:直接使用Statement
Java代碼
  1. conn.setAutoCommit(false);   
  2. Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,   
  3.                                     ResultSet.CONCUR_READ_ONLY);   
  4. for(int x = 0; x < size; x++){   
  5.    stmt.execute("INSERT INTO adlogs(ip,website,yyyymmdd,hour,object_id) VALUES('192.168.1.3', 'localhost','20081009',8,'23123')");   
  6. }   
  7. conn.commit();  


使用上述方法分別插入10萬條數據的平均測試時間為:
方法一:17.844s
方法二:18.421s
方法三:16.359s

可以看出JDBC的batch語句插入不但沒有性能提升,反而比沒有用batch的時候要慢,當然這可能跟JDBC具體驅動的實現方法有關。 附件中是我測試代碼,可以用來在自己電腦上跑一下。

在執(zhí)行批量插入的時候最主要的是將自動提交取消,這樣不管是否用JDBC的batch語法應該都沒有關系。
 
本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現有害或侵權內容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
JDBC快速入門教程
JDBC ResultSet分析
JDBC
采用JDBC進行數據庫分頁查詢 - 我的java歷程 - BlogJava
JAVA ResultSet概論
Java JDBC 中獲取 ResultSet 的大小
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服