为了正常的体验网站,请在浏览器设置里面开启Javascript功能!
首页 > [方案]jdbc批量插入、批量删除、批量更新

[方案]jdbc批量插入、批量删除、批量更新

2018-03-14 7页 doc 22KB 17阅读

用户头像

is_266065

暂无简介

举报
[方案]jdbc批量插入、批量删除、批量更新[方案]jdbc批量插入、批量删除、批量更新 一、JDBC的批量插入 JDBC批量插入主要用于数据导入和日志记录因为日志一般都是先写在文件 下的等。 我用Mysql 5.1.5的JDBC driver 分别对三种比较常用的方法做了测试 方法一,使用PreparedStatement加批量的方法 1. try { 2. Class.forName("com.mysql.jdbc.Driver"); 3. conn = DriverManager.getConnection(o_url, userName, pass...
[方案]jdbc批量插入、批量删除、批量更新
[方案]jdbc批量插入、批量删除、批量更新 一、JDBC的批量插入 JDBC批量插入主要用于数据导入和日志因为日志一般都是先写在文件 下的等。 我用Mysql 5.1.5的JDBC driver 分别对三种比较常用的方法做了测试 方法一,使用PreparedStatement加批量的方法 1. try { 2. Class.forName("com.mysql.jdbc.Driver"); 3. conn = DriverManager.getConnection(o_url, userName, passw ord); 4. conn.setAutoCommit(false); 5. String sql = "INSERT adlogs(ip,website,yyyymmdd,hour,obje ct_id) VALUES(?,?,?,?,?)"; 6. PreparedStatement prest = conn.prepareStatement(sql,Resul tSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); 7. for(int x = 0; x < size; x++){ 8. prest.setString(1, "192.168.1.1"); 9. prest.setString(2, "localhost"); 10. prest.setString(3, "20081009"); 11. prest.setInt(4, 8); 12. prest.setString(5, "11111111"); 13. prest.addBatch(); 14. } 15. prest.executeBatch(); 16. conn.commit(); 17. conn.close(); 18.} catch (SQLException ex) { 19. Logger.getLogger(MyLogger.class.getName()).log(Level.SEVERE, null, ex); 20.} catch (ClassNotFoundException ex) { 21. Logger.getLogger(MyLogger.class.getName()).log(Level.SEVER E, null, ex); 22.} 说明下在建Statement的时候,后面两个参数的意义: 第一个参数指定 ResultSet 的类型。其选项有: TYPE_FORWARD_ONLY:缺省类型。只允许向前访问一次,并且不会受到其他用户对该数据库所作更改的影响。 TYPE_SCROLL_INSENSITIVE:允许在列中向前或向后移动,甚至可以进行特定定位,例如移至列表中的第四个记录或者从当前位置向后移动两个记录。不会受到其他用户对该数据库所作更改的影响。 TYPE_SCROLL_SENSITIVE:象 TYPE_SCROLL_INSENSITIVE 一样,允许在记录中定位。这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映 在 ResultSet 中。 第二个参数设置 ResultSet 的并发性,该参数确定是否可以更新 ResultSet。其选项有: CONCUR_READ_ONLY:这是缺省值,指定不可以更新 ResultSet ResultSet CONCUR_UPDATABLE:指定可以更新 方法二 使用Statement加批量的方法 1. conn.setAutoCommit(false); 2. Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SE NSITIVE, ResultSet.CONCUR_READ_ONLY); 3. for(int x = 0; x < size; x++){ 4. stmt.addBatch("INSERT INTO adlogs(ip,website,yyyymmdd,hour,o bject_id) VALUES('192.168.1.3', 'localhost','20081009',8,'23123 ')"); 5. } 6. stmt.executeBatch(); 7. conn.commit(); 方法三:直接使用Statement 1. conn.setAutoCommit(false); 2. Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SEN SITIVE, 3. ResultSet.CONCUR_READ_ONLY) ; 4. for(int x = 0; x < size; x++){ 5. stmt.execute("INSERT INTO adlogs(ip,website,yyyymmdd,hour,ob ject_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具体驱动的实现方法有关。附件中是我测试代码,可以用来在自己电脑上跑一下。 在执行批量插入的时候最主要的是将自动提交取消,这样不管是否用JDBC的batch语法应该都没有关系。 Java代码 conn.setAutoCommit(false) 二、JDBC的批量更新 由 于阿堂在原来的老项目中,用jdbc操作时,用到了jdbc的批量操作,加上前段时间看《疯狂java讲义》时,也看到李刚作者的相关介绍。考虑还是会有人要用到jdbc的操作的,所以,阿堂还是把它整一下,就成了下面的文字了。用JDBC的DML语句时(insert,delete,update),我们可能可能需要同时某几个表都要进行DML操作,比如,当我们对A表插入的时候,同时也要对B表插入相关的记录,还要同时更新C表的关联记录,这样就会涉及到三条DML的sql语句,如果不用批量更新功能的话,我们就得单独去处理,效率相对就要低些了。。使用批量更新时,多条sql语句将会被作为一批操作被同时收集,并同时提交。值得注意的是,批量更新必须得到底层数据库的支持,可能通过 DatabaseMetaData的 supportBatchUpdates方法来查看底层数据库是否支持批量更新 //conn是Connection的类型 DatabaseMetaData dbmd=conn.getMetaData(); //若a为true则意味着该数据是支持批量更新的 boolean a=dbmd.supportsBatchUpdates(); 为了保证批量更新的操作可以正确处理错务,必须把批量更新的操作视为单个事务,如果批理更新在执行过程中失败,则让事务回滚到操作开始之前的状态。为了达到这种效果,程序应该在开始批量操作之前先关闭自动提交,然后开始收集更新语句,当批量操作执行结束后,提交事务,并恢复之前的自动提交模式 具体如下代码片断所示 1. try 2. { 3. //保存当前自动提交模式 4. boolean autoCommit=conn.getAutoCommit(); 5. //关闭自动提交 6. conn.setAutoCommit(false); 7. //使用Statement同时收集多条sql语句 8. stmt.addBatch(insert_sql1); 9. stmt.addBatch(insert_sql2); 10. stmt.addBatch(update_sql3); 11. .. 12. //同时提交所有的sql语句 13. stmt.executeBatch(); 14. //提交修改 15. conn.commit(); 16. conn.setAutoCommit(autoCommit); 17. } 18. catch(Exception e) 19.{ 20. e.printStackTrace() 21. conn.rollback(); 22. } 附: 需要说明的一点是,如果是addBatch()方法中加了select查询语句,程序将直接出现错务的 这个又是一种方法批量进行更新。但是我认为上面那个方法不 1. tx=session.beginTransaction(); 2. Connection con = session.connection(); 3. PreparedStatement stmt = con.prepareStatement( 4. "update CUSTOMERS set AGE=AGE+1 where AGE>0"); 5. stmt.excuteUpdate(); 6. tx.commit(); 三、JDBC批量删除 1. String sql="delete from table where id in(0"; 2. String id[]=要删除的ID数组; 3. for(int i=0;i
/
本文档为【[方案]jdbc批量插入、批量删除、批量更新】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
热门搜索

历史搜索

    清空历史搜索