spring jdbctemplate batch 可以处理多少条记录

问题描述

//1、统计一共多少数据int countNum = jdbcTamplate1.queryForInt("select count(0) from tabA") ;System.out.println("总记录条数为:"+countNum);int l = (countNum + 29999) / 30000 ;jdbcTamplate2.getDataSource().getConnection().setAutoCommit(false) ;for(int i=0; i<l; i++){int startRowNum = i * 30000 ;int endRowNum = (i+1) * 30000 ;if(i == l-1){endRowNum = countNum ;}//构造查询语句StringBuilder sql = new StringBuilder() ;sql.append("select ID, X, Y, from (") ;sql.append("select rownum r, ID, X, Y from tabA where rownum <= ") ;sql.append(endRowNum + " ") ;sql.append("order by ID asc) ") ;sql.append("where r > ") ;sql.append(startRowNum) ;List<Map<String, Object>> rs = jdbcTamplate1.queryForList(sql.toString()) ;System.out.println((i+1)+"[]获得结果集记录数:"+rs.size());int[] ns = jdbcTamplate1.batchUpdate(Locrecord.INSERT_SQL, new LocrecordBatchSetter(rs)) ;System.out.println((i+1)+"[]本次batch记录数:"+ns.length);jdbcTamplate1.getDataSource().getConnection().commit() ;Thread.sleep(10000) ;System.out.println((i+1)+"[]本次循环结束!");}jdbcTamplate1.getDataSource().getConnection().setAutoCommit(true) ; 其中,Locrecord.INSERT_SQL这个就是简单的insert语句,只插入3个字段,后边的这个LocrecordBatchSetter也很简单,就是把新表的字段和旧表的字段对应上。比如:public void setValues(PreparedStatement pstmt, int i) throws SQLException {Map<String, Object> obj = list.get(i) ;pstmt.setString(1, obj.get("ID")+"") ;pstmt.setInt(2, (obj.get("X")) ;pstmt.setInt(3, obj.get("Y")) ;} 我是从一个库的表A导数据到另一个库的表B,他们的表结构不一样,只是提出部份可以匹配的字段。原表有数据73W,我每次导入3W,可是每次循环到21W数据的时候程序就没反应了。也不抛任何异常。控制台显示程序还在进行。去数据库一看,只有21W数据进入,剩下的就没戏了。想问问用过batch插入的兄弟们。你们碰见过这样的情况吗?应该如何解决呢?或者使用batch时,还应该注意哪些事情? 问题补充:iihero 写道

解决方案

第8行和第34行拿到的是同一个connection吗?第8行拿了把它放个变量里吧,下面直接操作这个connectionConncetion conn = jdbcTamplate2.getDataSource().getConnection()还有个问题,为什么第8行是jdbcTamplate2其它是jdbcTamplate1
解决方案二:
有一个值得怀疑的地方,几处connection,未必是同一个connection,先用同一个connection 试试。
解决方案三:
把每次3W条改成每次1W条
解决方案四:
引用关于事务,我是循环一次就提交一次啊。也就是说每3W条记录提交一次事务。那这个临时空间不就释放了么? 提交了事务,只是保证有一个checkpoint,但是日志中的数据并不一定马上写回数据文件。为什么不看看数据库服务器上的消息日志文件呢?
解决方案五:
引用关于事务,我是循环一次就提交一次啊。也就是说每3W条记录提交一次事务。那这个临时空间不就释放了么? 一个事务里做3W条,太多了,临时空间也需要3W条这么多。还是改少一点吧
解决方案六:
引用那不一样么?我一共73W数据,都要写事务日志。从日志记录上来说,一次3W和一次3条有什么不同么?最终不都是得写73W数据的日志? 一次3W,必须有3W条对应的可用日志空间,建议你看看redo log相关的资料。
解决方案七:
引用那不一样么?我一共73W数据,都要写事务日志。从日志记录上来说,一次3W和一次3条有什么不同么?最终不都是得写73W数据的日志? 应该是临时空间不够用了,一次事务提交后会释放临时空间的。
解决方案八:
针对每次提交,事务日志要记录这次提交的所有操作,包括数据,30000太大了,可能事务日志空间已满。
解决方案九:
为什么会这现这种问题呢?原因是什么,怎么理解呢?
解决方案十:
再改小一点吧。多少条记录也没有个一定的,根据单条记录的数据量来看,如果一条记录数据量就很多,那么一次能处理的就少一点。
解决方案十一:
每次3W太大了,每次2000吧。

时间: 2024-10-31 15:19:51

spring jdbctemplate batch 可以处理多少条记录的相关文章

spring jdbctemplate 设计的问题

问题描述 simplespringtemplate 提供了对jdbc的包装,并提供了一些方便的方法,但是在进行选择的时候还是感觉不方便.假设有数据表:user ,包含属性 Long id,String name ,int salary,如果我要查询工资为234的用户,设想生成的语句为:select * from user where age=234如果使用jdbctemplate则需要使用如下代码:simplejdbctemplate.queryForObject("select * from

oracle可以一次性插入多条记录吗?

问题描述 oracle可以一次性插入多条记录吗? 而且数据还是有重复的,比如说要插入一个日期和一个上班状况,日期是主键,数据是:2015-05-10,请假:2015-05-11,请假:2015-05-12,请假.本来用的是insert into ... select...from dual union select......,但是报错违反唯一约束条件 刚开始做.不太会还请指教 解决方案 为什么要用日期当主键啊...不会重复么??? 解决方案二: insert into table(...)se

使用jdbc向数据库插入100000条记录

分别使用statement,PreparedStatement,及PreparedStatement+批处理3种方式进行测试: //1.使用statement插入100000条记录  Java代码   public void exec(Connection conn){      try {       //开始时间      Long beginTime = System.currentTimeMillis();       //设置手动提交       conn.setAutoCommit(

hibernate 查询40万条记录出现 java.sql.SQLException 数字溢出 异常

问题描述 大家好,我用hibernate 查询40万条记录,结果出现 java.sql.SQLException 数字溢出 异常,怎么回事啊?难道 hibernate 支持不了几十万的数据检索???我的代码: List list = session.createQuery("from 表 ").list(); 解决方案 你有没有设置Lazy Loading呀..如果你设的为立即加载的话,几十万的话数据.溢出很正常呀..解决方案二:大哥 你一起弄这么多数据出来能不溢出么?用LAZY解决方

两个对象数组 ojb1[],obj2[] 每个都有十几万条记录怎么在内存中做sql运算?

问题描述 从webservice上得到了两个对象数组ojb1[],obj2[]每个都有十几万条记录!!我要对它们执行select*fromobj1fulljoinobj2....运算出新的对象数组.1.把这两个数组进数据库后再执行sql运算.那有什么办法把他批量进库(一条条insert太慢了)?2.有什么办法在直接在内存中执行sql运算(我的平台不支持linq,在linq出来之前怎么做的)? 解决方案 解决方案二:关注,帮顶!解决方案三:引用1楼mawering的回复: 关注,帮顶! 解决方案四

pymongo中如何判断是否查找到某条记录

问题描述 pymongo中如何判断是否查找到某条记录 - coding: utf-8 - #!/usr/bin/python import pymongo import time conn = pymongo.Connection("127.0.0.1",27017) db = conn.test #连接库test num = db.posts.count({'text':'赵云'}) print num 我想查text字段为赵云的记录个数,这个命令 :db.posts.count({

dw-如何在DW/asp中让重复记录横向重复3条记录,然后换行继续直到写入完所有

问题描述 如何在DW/asp中让重复记录横向重复3条记录,然后换行继续直到写入完所有 在做一个产品展示页,数据表名称为furniture_pro里面有若干产品(至少9个以上)现在希望用DW中重复区域这个功能展示这些产品,希望每行只有三个产品,不知道在Dw中怎么实现 解决方案 写一个两重循环,排完一行插入一个分割符 解决方案二: Repeat1__index=Repeat1__index+1 Repeat1__numRows=Repeat1__numRows-1 if (Repeat1__inde

c++-WritePrivateProfileString写入ini问题,只能写入第二条记录

问题描述 WritePrivateProfileString写入ini问题,只能写入第二条记录 WritePrivateProfileString(_T(""CONFIG"")_T(""4"")_T(""01000;"")_T(""c:\projectThread.ini""));WritePrivateProfileString(_T("

vfp报表中如何动态显示打印二维码,每条记录的值有可能重复,比如姓名用二维码显示打印。

问题描述 vfp报表中如何动态显示打印二维码,每条记录的值有可能重复,比如姓名用二维码显示打印. vfp报表中如何动态显示打印二维码,每条记录的值有可能重复,比如姓名用二维码显示打印.求关注求转发求收藏qq:1280737814https://shop67511955.taobao.com/ 解决方案 http://bbs.bccn.net/thread-436671-1-1.html 解决方案二: 二维码打印JS