- 浏览: 37372 次
- 性别:
- 来自: 北京
最新评论
-
lixiamani:
一条数据的数据量大小不同,你的数据量比较大
JDBC addbatch批量处理数据时有最大值限制 -
cmland:
我的测试结果和你相差好远,使用batch最多能支持511条记录 ...
JDBC addbatch批量处理数据时有最大值限制 -
hslh22:
请提供一下完整的源代码,谢谢
JDBC addbatch批量处理数据时有最大值限制
在用jdbc向数据灌入数据时,发现120000的数据每次只能灌入50000多条,其他的就没有了。
在oracle 9i(windows 2003),oracle 10g(RHEL 4)上试验证有相同的结果。
使用定量灌入的办法,每5W条定义为一个事务,进行提交,将120000数据循环灌入,成功。
对于批量的update,delete操作两样有5W条左右的记录数限制。
结论:jdbc批量数据处理的每个批次是有数量的限制的。
我在本地环境中测试的限制量为每批54464条,其他配置的机器没有试过。
以下是插入数据时的代码:
以下是删除数据时的代码:
以下是更新数据的代码:
在oracle 9i(windows 2003),oracle 10g(RHEL 4)上试验证有相同的结果。
使用定量灌入的办法,每5W条定义为一个事务,进行提交,将120000数据循环灌入,成功。
对于批量的update,delete操作两样有5W条左右的记录数限制。
结论:jdbc批量数据处理的每个批次是有数量的限制的。
我在本地环境中测试的限制量为每批54464条,其他配置的机器没有试过。
以下是插入数据时的代码:
ConnDB cd = new ConnDB(); Connection ct = null; PreparedStatement pst = null; ResultSet rs = null; ct = cd.getConn(); String insertSql = "insert into mytable (name,age) values(?,?)"; System.out.println(insertSql); try { ct.setAutoCommit(false); // 开始事务 pst = ct.prepareStatement(insertSql); for (int i = 0; i < 120000; i++) { pst.setString(1, "name" + i); pst.setInt(2, i); pst.addBatch(); System.out.println(i); //分段提交 if((i%50000==0&& i!=0)||i== (120000 -1)){ pst.executeBatch(); ct.commit(); ct.setAutoCommit(false);// 开始事务 pst = ct.prepareStatement(insertSql); System.out.println("------------>50000"); } } ct.commit();// 提交事务 } catch (SQLException e) { try { ct.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } catch (RuntimeException e) { try { ct.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } finally { cd.close(ct, pst, rs); } } ConnDB cd = new ConnDB(); Connection ct = null; PreparedStatement pst = null; ResultSet rs = null; ct = cd.getConn(); String insertSql = "insert into mytable (name,age) values(?,?)"; System.out.println(insertSql); try { ct.setAutoCommit(false); // 开始事务 pst = ct.prepareStatement(insertSql); for (int i = 0; i < 120000; i++) { pst.setString(1, "name" + i); pst.setInt(2, i); pst.addBatch(); System.out.println(i); //分段提交 if((i%50000==0&& i!=0)||i== (120000 -1)){ pst.executeBatch(); ct.commit(); ct.setAutoCommit(false);// 开始事务 pst = ct.prepareStatement(insertSql); System.out.println("------------>50000"); } } ct.commit();// 提交事务 } catch (SQLException e) { try { ct.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } catch (RuntimeException e) { try { ct.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } finally { cd.close(ct, pst, rs); } }
以下是删除数据时的代码:
ConnDB cd = new ConnDB(); Connection ct = null; PreparedStatement pst = null; ResultSet rs = null; ct = cd.getConn(); String deleteSql = "delete from mytable t where t.name=?"; System.out.println(deleteSql); int[] intArray = new int[120000]; try { ct.setAutoCommit(false); // 开始事务 pst = ct.prepareStatement(deleteSql); for (int i = 0; i < 120000; i++) { pst.setString(1, "name" + i); pst.addBatch(); System.out.println(i); // 分段提交 if ((i % 50000 == 0 && i != 0) || i == (120000 - 1)) { intArray = pst.executeBatch(); ct.commit(); ct.setAutoCommit(false);// 开始事务 pst = ct.prepareStatement(deleteSql); System.out.println("------------>50000"); } } ct.commit();// 提交事务 } catch (SQLException e) { try { ct.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } catch (RuntimeException e) { try { ct.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } finally { cd.close(ct, pst, rs); } ConnDB cd = new ConnDB(); Connection ct = null; PreparedStatement pst = null; ResultSet rs = null; ct = cd.getConn(); String deleteSql = "delete from mytable t where t.name=?"; System.out.println(deleteSql); int[] intArray = new int[120000]; try { ct.setAutoCommit(false); // 开始事务 pst = ct.prepareStatement(deleteSql); for (int i = 0; i < 120000; i++) { pst.setString(1, "name" + i); pst.addBatch(); System.out.println(i); // 分段提交 if ((i % 50000 == 0 && i != 0) || i == (120000 - 1)) { intArray = pst.executeBatch(); ct.commit(); ct.setAutoCommit(false);// 开始事务 pst = ct.prepareStatement(deleteSql); System.out.println("------------>50000"); } } ct.commit();// 提交事务 } catch (SQLException e) { try { ct.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } catch (RuntimeException e) { try { ct.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } finally { cd.close(ct, pst, rs); } }
以下是更新数据的代码:
ConnDB cd = new ConnDB(); Connection ct = null; PreparedStatement pst = null; ResultSet rs = null; ct = cd.getConn(); String deleteSql = "update mytable t set t.age =20 where t.name=?"; System.out.println(deleteSql); int[] intArray = new int[120000]; try { ct.setAutoCommit(false); // 开始事务 pst = ct.prepareStatement(deleteSql); for (int i = 0; i < 120000; i++) { pst.setString(1, "name"+i); pst.addBatch(); System.out.println(i); // 分段提交 if ((i % 50000 == 0 && i != 0) || i == (120000 - 1)) { intArray = pst.executeBatch(); ct.commit(); ct.setAutoCommit(false);// 开始事务 pst = ct.prepareStatement(deleteSql); System.out.println("------------>50000"); } } ct.commit();// 提交事务 } catch (SQLException e) { try { ct.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } e.printStackTrace(); } catch (RuntimeException e) { try { ct.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } finally { cd.close(ct, pst, rs); } }
评论
3 楼
lixiamani
2011-11-21
一条数据的数据量大小不同,你的数据量比较大
2 楼
cmland
2011-10-27
我的测试结果和你相差好远,使用batch最多能支持511条记录进行批量操作。
测试环境:jdk1.6,win7,oracle10g。
如果batch数量多于511条就会报错:
java.lang.ArrayIndexOutOfBoundsException: -32433。
测试环境:jdk1.6,win7,oracle10g。
如果batch数量多于511条就会报错:
java.lang.ArrayIndexOutOfBoundsException: -32433。
1 楼
hslh22
2011-09-01
请提供一下完整的源代码,谢谢
发表评论
-
Java程序性能优化
2012-11-19 10:27 618StringTokenizer 比String.split() ... -
css相对,绝对定位
2012-08-06 20:22 596相对定位是相对于不设置相对时的位置偏移,原有位置仍被占据 绝 ... -
安卓学习笔记
2012-08-05 15:02 580sqlite数据库不需要关闭,因为只有一个用户 sqlite ... -
收集国内国外比较经典的手机网站(转)
2012-05-22 17:36 1563把平常见到的一些好的手机网站收集在这,以后做的时候就去扒代码就 ... -
wap页面防左右滑动
2012-05-11 10:30 1083<meta name="viewport&qu ... -
设计模式
2012-02-14 16:02 675单例模式双加锁 if (instance == null) ... -
编写高质量的代码:Web前端开发
2012-01-15 16:40 805Web 标准——结构、样式和行为的分离 判断语义良好:fire ... -
java程序员上班那点事
2011-11-05 23:42 586JDBC操作的核心是Socket网络操作 Navicat M ... -
#parameters
2011-09-30 16:06 1130#相当于ActionContext.getContext() ... -
安装myeclipse不能放在中文目录下
2011-09-08 20:02 758Java.lang.RuntimeException: No ... -
日期增加天数
2011-08-12 18:25 615日期增加天数 String str="2011-08 ... -
核心技术
2011-06-15 17:40 634使用Spring作为核心框架并集成其他组件或框架 使用Hib ... -
ensureCapacity()方法提高ArrayList的初始化速度
2011-05-19 13:23 1235import java.util.ArrayList; ... -
利用servlet生成简单的验证码
2010-03-21 15:56 570在web.xml配置: <servlet> ... -
javascript option
2010-03-21 15:46 908一基础理解: var e = document.getEl ... -
javascript刷新
2010-03-14 17:07 666项目中会用到很多关于框架页面刷新的方法。先来看一个简单的例子: ... -
java2word读取word表格
2010-01-27 19:52 1294import java.util.ArrayList; im ... -
jacob读取word表格
2010-01-27 19:10 3325import com.jacob.activeX.Active ... -
ECLIPSE常用快捷键
2010-01-24 17:49 695更改为大写 Ctrl+Shift+X 更改为小写 Ctrl+S ... -
ajax验证用户名
2010-01-18 10:05 600var xmlHttp; function cre ...
相关推荐
因此,在有时间限制的SQL操作中,除非成批地处理SQL命令,我们应当考虑使用Statement对象。 此外,使用Statement对象也使得编写动态SQL命令更加简单,因为我们可以将字符串连接在一起,建立一个有效的SQL命令。...
有时候JDBC运行得不够快,这使得有些程序员使用数据库相关的存储过程。作为一个替代方案,可以试试使用Statement 的批量处理特性看看能否同时执行所有的SQL以提高速度。 存储过程的最简单的形式就是包含一系列SQL...
使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(10W+),如何提高效率呢? 在JDBC编程接口中Statement 有两个方法特别值得注意: void addBatch() throws SQLException Adds a set of ...
找到最大值之后+1赋给要持久化的对象 2.assigned:指派 hibernate不在自动生成主键值,需要你在插入时自己指明 3.hilo:高低值算法,由数据库表提供高值,程序提供低值 value = hi*(max_lo+1)+lo 4.sequences Cat...
【IT十八掌徐培成】Java基础第23天-03.ppst-addBatch-executeBatch.zip
3. 如果涉及批量执行多条SQL时 使用PreparedStatement执行效率较高 - 如果SQL中没有变量用Statement 有变量用PreparedStatement ###批量操作 - Statement批量操作: statement.addBatch(sql1); statement....
100万级数据插入 总结目前网上的spring batchUpdate方法,和jdbc PreparedStatement的addBatch,及insert的2种插入方式引起的效率差别,我的博客中有说明!
主要介绍了Hibernate管理Session和批量操作的技巧,包括Hibernate管理Session、批量处理数据等的常用技巧及注意事项,具有一定的参考借鉴价值,需要的朋友可以参考下
Oracle addBatch()用法实例详解 PreparedStatement.addbatch()的使用 Statement和PreparedStatement的区别就不多废话了,直接说PreparedStatement最重要的addbatch()结构的使用. 1.建立链接 Connection ...
【IT十八掌徐培成】Java基础第23天-03.ppst-addBatch-executeBatch - 副本.zip
sm.addBatch(sql1); sm.addBatch(sql2);...可是在数据量比较大的时候,应该会对效率有影响。不建议使用。 PreparedStatement ps = cn.preparedStatement(sql); { ps.setXXX(1,xxx); … ps.addBatch(); } ps.execu
Q0060 JDBC批量更新的作用和用法 "提高执行效率。减少执行时间。 Statement sm = cn.createStatement(); sm.addBatch(sql1); sm.addBatch(sql2); ... sm.executeBatch() 或者 PreparedStatement ps = ...
有参批量更新 String sql = "update bd_deptdoc set dept_code =„aaa‟ where dept_code=?”; SQLParameter param = new SQLParameter(); //构造参数对象 param.addParam(“bbb”); //添加参数 session.addBatch...
jdao有支持事务,支持批量插入数据等特性。同时jdao底层数据库操作提供接口,编程人员可以自己实现。 如果你觉得hibernate,ibatis等orm框架过于笨重,不烦试下jdao,它可以在团队开发中规范团队持久层代码,较少...
封装mong关联查询api接口,如addBatch()、delete()、exists()、lookUp()等接口 public void delete(Query query , Object obj , String collectionName){ mongoTemplate.remove(query, obj .getClass(), ...
有关许可下特定的语言管理权限和限制,请参阅许可。 例子 var vows = require ( 'vows' ) ; // vows does not pollute the assert module namespace by default var assert = vows . assert ; vows . describe ( ...
//执行批量处理,提交事务 int [] batchNumber=sta.executeBatch(); conn.commit(); //将手动提交模式转换为自动提交模式 conn.setAutoCommit(true); return batchNumber.length; } catch (SQLException e) {...
pstmt_item.addBatch(); } pstmt_item.executeBatch(); dbUtil.getCon().commit(); } catch (SQLException e) { e.printStackTrace(); try { dbUtil.getCon().rollback(); } catch ...
stat.addBatch(o.toString()); } stat.executeBatch(); conn.commit(); sign = true; } catch (Exception ex) { conn.rollback(); sign = false; ex.printStackTrace(); } finally { ...