站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题executeBatch 出错!! HELP !!!--很急

executeBatch 出错!! HELP !!!--很急

摘要: executeBatch 出错!! HELP !!!--很急


在开发过程中由于数据量庞大,所以采用的1.4的JDBC的executeBatch

但是由于是批处理,当executeBatch()抛出异常的时候,我怎么判断出错的SQL是什么呢?

而且由于数据量实在太大,不可能把每条SQL都打印出来! 怎么从Statement中取出这个出错的语句呢?



哪位大侠帮忙分析一下,全分送上!!!


log4j看看能否帮你了


不行的,因为数据量太大..

现实情况是80W数据,在进行转化后,每条数据要生成新的数据大概2-30条新数据!!
如果每个sql语句都打出来的话,实在太庞大的信息了..

而且是执行在二三十万的时候出错..当然我处理了出错时的异常,让程序继续处理下一批数据.但问题是,很难找出这些有问题的数据


呵呵,是一时被这个问题急了一下..

既然我能处理一批数据,那么当这批数据提交的时候出了问题的时候,我也能够把这一批数据给揪出来,这样我就能定位到这一批数据上了..

自然能够分析出这批数据中的哪些数据有问题.

============
JDBC的executeBatch()的返回值int[] 只是说明批处理中的每条SQL语句的执行结果,并没有提供接口直接访问出问题的哪些SQL语句...


executeBatch()抛出异常,你给贴出来,这样大家都是在猜。
最好把你的代码给贴出来。


executeBatch()
遇到过一样的问题
错误不好找
我插入10W条就顶不住了
后来用procedure实现了
楼主可以考虑一下


晕,那么大的数据阿
你都什么数据库阿?



呵呵,行啊,反正也要等一下执行结果.
贴一个大概的意思..注明 以下说说明一下大体过程..基本上也能反应出问题..批处理抛出的异常信息只有:
doJob:(catch (Exception ex))批处理中出现错误: ORA-00984: 列在此处不允许

堆栈信息也只能定位到insertCommit(aStmtUpdate,aConn);中的aConn.commit();这一行.找不到对应的有问题sql..
大体意思就这样了
===========
public static main(String[] arg){
try{
Connection aConn = datasourceFactory.getConnection("ziyuan");
aConn.setAutoCommit(false);
aStmtUpdate = aConn.createStatement();
.......
doJob(aStmtUpdate,aConn);
......
insertCommit(aStmtUpdate,aConn);

}catch(SQLException){
.......//处理这些异常的一批数据,基本上就能定位到这些比较特殊的数据了
//代码实在太多
}finally{
closeRSAndStmt(null,aStmtUpdate );
if(null != aConn )
aConn.close();//这里还要抛SQLException的,我就不写处理了
}

public void closeRSAndStmt(ResultSet rs, Statement stmt) {
if (null != rs) {
try {
rs.close();
}
catch (SQLException ex1) {
Log.error(SynTableIFC.LOG_FILE, "closeRSAndStmt(catch (SQLException ex1)):"+ex1.getMessage());
}
}
if (null != stmt) {
try {
stmt.close();
}
catch (SQLException ex2) {
Log.error(SynTableIFC.LOG_FILE, "closeRSAndStmt(catch (SQLException ex2)):" +ex2.getMessage());
}
}
}
}



private void doJob(Statement aStmtUpdate,
Connection aConn) throws SQLException{
String insertSQLByModel = getInsertDNPackageSQLByModel(template,dnslotid,aConn);
Log.debug(SynTableIFC.LOG_FILE, "==createDNPackageByModel's insertSQLByModel ="+insertSQLByModel);
aStmtUpdate.addBatch(insertSQLByModel);
//......
aStmtUpdate.addBatch(otherSQL);

//等等很多N多业务上的SQL
}



private void insertCommit(Statement aStmtUpdate,
Connection aConn) throws SQLException{
if(null != aStmtUpdate)
aStmtUpdate.executeBatch();
aConn.commit();
}



http://www.techonthenet.com/oracle/errors/ora00984.php
呵呵~~
这样的问题直接搜索oracle的错误代码:ORA-00984


TO:zs178(zh-cn)
以前考虑过用存储过程,但是业务逻辑的判断实在太复杂!太复杂!(先前把逻辑给公司DB说清楚过,写了一个存储过程,结果造成N多脏数据,幸好新数据都有标志,容易清除.后来客户规则一变,等等,存储过程我觉得很难维护的)
况且JAVA程序员,对写存储过程来说,基本上属于弱项.

加上如果把公司DB请到现场,估计没个十天半个月可能还搞不定.所以决定用程序搞定这类数据转换问题...
效率也不差啊,对方把80W数据导到这张表上要花6.5个小时,用程序写的转换程序(包括根据一条记录生成新的记录,等等其他一些数据检查)等等也只要8.01个小时..


TO :NsGFr(elan)

谢谢先..
我想我要表达的不是这个异常


还有你有没有关掉自动提交?
con.setAutoCommit(false);

http://www.52bcw.cn/Java/Basic/20060907/5004743.htm
这儿有个帖子,看看能不能帮你了,mysql的



TO :hdhmail2000(禅剑飞雪)

oracle9i


效率也不差啊,对方把80W数据导到这张表上要花6.5个小时,用程序写的转换程序(包括根据一条记录生成新的记录,等等其他一些数据检查)等等也只要8.01个小时..

恐怖!
这是什么应用啊?


:-(

NND,其实这应该数据迁移工程的,结果客户狡猾,安排几个人,和我们老大交互..要我们帮忙解决..
日,没钱的...

唉,这年头,钱难赚啊.


批处理更新功能使用 CallableStatement 对象进行工作的方式与使用 PreparedStatement 对象进行工作的方式相同。多个输入参数值的集合可以与可调用语句相关联,然后一起送交给 DBMS。批处理更新功能与可调用语句一起使用所调用的存储过程必须返回更新计数,而且可以不必有输出或输入输出参数。如果违反这个限制条件,则 CallableStatement.executeB atch() 方法会抛出异常。
// 关闭自动执行
con.setAutoCommit(false);

PreparedStatement stmt = con.prepareStatement(
"INSERT INTO employees VALUES (?, ?)");

stmt.setInt(1, 2000);
stmt.setString(2, "Kelly Kaufmann");
stmt.addBatch();

stmt.setInt(1, 3000);
stmt.setString(2, "Bill Barnes");
stmt.addBatch();

// 提交要执行的批处理
int[] updateCounts = stmt.executeBatch();

http://202.102.240.73/java/javaweb/linuxjava/cjdk1_2-doc-zh/jdk1.2/zh/docs/guide/jdbc/spec2/jdbc2.0.frame6.html
这里有讲到


给各建议:
对于楼主的情况:我的做法是生成一批xml文档。
然后通过xml文档的形式导入数据,呵呵~ 工作大了点,不过挺好用的。而且也容易定位错误的记录


我以前做过大数据量的导入,给你点建议吧:

不要一个batch 80万条数据!!!!!

这样做的话,各种各样的问题都会出现。

你把它分成800个batch,每次1000条数据commit一次。

不过你要自己控制数据,知道导到哪个地方了,这样即使出现了问题还能退回到初始状态。


真心的谢谢.

hbwhwang(catmiw的ID已经停用,现在用这个) ( ) 信誉:100

呵呵,当初,我一下转换到Vector中,呵呵,结果OutOfmenery....

根据sybase的经验,现在一般是300个commit一次..其实时间也挺快的



300个SQL,你还定位不到错误吗?


啊,历经痛苦!!!
终于定位到错误了!!!!!!!
55555555555555555555,真想大哭一场!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

=======
千心万苦才定位到的问题,竟然是对方抽取数据时,不小心把一个VPI本应该是数值类型的字段,付上了字符串'nul'

要转换到对应的字段是个数字类型,我先判断VPI是否为空,trim后如果为空取0,不为空就取不空的值,像一下,如果把字符串'nul'插入到数据库中,不报异常异常才怪!
=============
谢谢楼上关心,其实虽然时300条记录,但是对应的SQL远远不止300条.
比如一般的情况下,有以前的记录就update,没则insert,并且同时置这条对方的来的数据是处理成功还是处理失败.
这些都加入批处理中.


光这个动作:并且同时置这条对方的来的数据是处理成功还是处理失败.,就有300条SQL..
更何况对方的一条sql,在转化过程中,还有N多其它的约束产生的SQL.

=========================================
啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
真TMD要抓狂!!


同时日一下对方!!靠


我把放入批中的SQL全部打印出来,因为是批commit的时候报错..只有这样,所以对应的SQL很多很多!


呵呵,我解决这些问题最拿手了。


呵呵,恐怕未必啊..
log4j中所有涉及到SQL的(包括查询),我都DEBUG输出..
所以在定位这个问题的时候,我还不敢设置成DEBUG数据,因为包含查询等之后实在是太多的SQL了.

调试这个问题的时候所有加入批中我都重新info打印了一下,级别设置成info了,所以就打这部分sql,但是也不少啊..555

先回去睡觉了..明天见..


欢迎加入qq群:
代码大全群(一):23015268(满)
代码大全群(二):25766691
官方网站:http://www.codeclub.cn
欢迎有兴趣的朋友共同参与整理精品代码,源码,开发工具。

目前整理的代码,源码如下,每天都在不断完善中,请随时关注!


精品源码下载:
精品.NET开源Blog
精品.NET开源论坛
精品.NET开源OA
汉化 Pet Shop 4.0
Duwamish 7.0
FMStocks7

精品书籍下载:
代码大全
《人月神话》中文版
Apress.Pro.ASP.dot.NET.2.0.in.C.Sharp.2005.Sep.2005
WROX.Professional.Web.Parts.and.Custom.Controls.with.ASP.dot.NET.2.0.Nov.2005.eBook-DDU
Wrox.Professional.ASP.NET.2.0.XML.Jan.2006

精品工具下载:
Microsoft .NET Framework 3.0 正式版
CodeSmith3.0正式破解版
Reflector4.0及FileDisassembler插件

精品代码:
C#实现的18位身份证格式验证算法
身份证15To18 的算法
用C#生成一个简单的PDF文件
操作Excel(C#)
用.net操作word
COM和.NET的互操作
属性和元数据
类型映射
C#几种加密算法,包括MD5
C#实现对象的Xml格式序列化及反序列化
C#中XML的基本操作
Visual C#常用函数和方法集汇总
常见.Net 英文专业词汇收集
如何取得设备网卡的MAC地址和硬盘的卷标号?
使用C#调用外部Ping命令获取网络连接情况
一个自动生成html的类
利用ASP.NET的三种缓存提高站点性能
asp.net实现树形菜单
DataList分页、增加、删除、修改实例
通用分页显示查询存储过程
asp.net中读取和更新xml文件
如何用asp.net收发传真
使用HttpHandler实现URL重写
使用ASP.NET程序来管理文件或目录的一种方案
利用asp.net设计ftp文件上传
asp.net验证码实现
C# 创建FTP
共享.Net 图片上传的一个类库的源码
asp.net实现把Execl数据导入
ASP.NET 通过GDI+编程画曲线图
C#如何获取当前计算机的系统信息?
ASP.NET如何获取服务器变量信息?
使用FileUpload控件上传图片并自动生成缩略图、带文字和图片的水印图
怎样把图片存储到数据库中?
数字如何转换为大写人民币?
认识ASP.NET配置文件Web.config
ASP.NET页面间的传值的几种方法
如何使用 Ado.net 获取数据库架构信息?
Asp.net如何实现IIS控制管理?
提高ASP.Net应用程序性能的方法
如何获取中文首字母?
防刷新机制
如何检测某一URL地址是否有效?
ASP.NET编程中的十大技巧
asp.net中如何利用smtp群发邮件?
如何保存和获取 Cookie?
怎样把图片存储到数据库中?
网站中如何显示在线人数?
用C#如何生成中文汉字验证码?
ASP.NET中如何使用正则表达式?
ASP.NE如何导出Excel?
把字符与字符编码之间如何转换?
如何取得远程用户IP地址?
字符串如何转换成字节编码?
ASP.NET 如何生成验证码?
Visual C#常用函数和方法集汇总
ASP.NET中键盘的回车如何转换成Tab键?
编程规范
Session详解
Log4Net 使用指南
C#如何获取当前计算机的系统信息?
ASP.NET如何获取服务器变量信息?
Asp.Net如何生成静态页?
asp.net中如何利用smtp群发邮件?
C# 如何读写 INI文件?
C#如何调用API?
C#中对注册表的操作
DateTime 格式字符串
VB.Net常用函数
如何加密web.config保证数据库用户和密码安全?

交流中心:
向主考官提出10个漂亮问题
找工作的20条吐血经验
求职面试经典30题
求职英语面试问答大全
世界500强高管给应聘者11条建议
求职信结尾常用的十句必杀技
高质量简历要避免10大错误
外企面试十大要点
全球最热门的职场词汇(2006版)
最真实的06年应届毕业生薪水
所有行业职位表-中英文对照

社会生活中的著名法则
十大经典人生哲理故事
一百八十一點人生哲理
史上最强人生哲理故事
三大人生哲理故事
10个应该知道的人生哲理故事
幽默人生哲理故事几则
20个人生哲理故事



↑返回目录
前一篇: 求助:java中那些是提供了改变字体颜色的类?
后一篇: 求段java对象clone代码,解决马上结贴