社区
Java SE
帖子详情
executeBatch 出错!! HELP !!!--很急
hm8328
2006-11-15 03:29:15
在开发过程中由于数据量庞大,所以采用的1.4的JDBC的executeBatch
但是由于是批处理,当executeBatch()抛出异常的时候,我怎么判断出错的SQL是什么呢?
而且由于数据量实在太大,不可能把每条SQL都打印出来! 怎么从Statement中取出这个出错的语句呢?
...全文
996
25
打赏
收藏
executeBatch 出错!! HELP !!!--很急
在开发过程中由于数据量庞大,所以采用的1.4的JDBC的executeBatch 但是由于是批处理,当executeBatch()抛出异常的时候,我怎么判断出错的SQL是什么呢? 而且由于数据量实在太大,不可能把每条SQL都打印出来! 怎么从Statement中取出这个出错的语句呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
hm8328
2006-11-15
打赏
举报
回复
呵呵,恐怕未必啊..
log4j中所有涉及到SQL的(包括查询),我都DEBUG输出..
所以在定位这个问题的时候,我还不敢设置成DEBUG数据,因为包含查询等之后实在是太多的SQL了.
调试这个问题的时候所有加入批中我都重新info打印了一下,级别设置成info了,所以就打这部分sql,但是也不少啊..555
先回去睡觉了..明天见..
hbwhwang
2006-11-15
打赏
举报
回复
呵呵,我解决这些问题最拿手了。
hm8328
2006-11-15
打赏
举报
回复
我把放入批中的SQL全部打印出来,因为是批commit的时候报错..只有这样,所以对应的SQL很多很多!
hm8328
2006-11-15
打赏
举报
回复
同时日一下对方!!靠
hm8328
2006-11-15
打赏
举报
回复
啊,历经痛苦!!!
终于定位到错误了!!!!!!!
55555555555555555555,真想大哭一场!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
=======
千心万苦才定位到的问题,竟然是对方抽取数据时,不小心把一个VPI本应该是数值类型的字段,付上了字符串'nul'
要转换到对应的字段是个数字类型,我先判断VPI是否为空,trim后如果为空取0,不为空就取不空的值,像一下,如果把字符串'nul'插入到数据库中,不报异常异常才怪!
=============
谢谢楼上关心,其实虽然时300条记录,但是对应的SQL远远不止300条.
比如一般的情况下,有以前的记录就update,没则insert,并且同时置这条对方的来的数据是处理成功还是处理失败.
这些都加入批处理中.
光这个动作:并且同时置这条对方的来的数据是处理成功还是处理失败.,就有300条SQL..
更何况对方的一条sql,在转化过程中,还有N多其它的约束产生的SQL.
=========================================
啊!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
真TMD要抓狂!!
hbwhwang
2006-11-15
打赏
举报
回复
300个SQL,你还定位不到错误吗?
hm8328
2006-11-15
打赏
举报
回复
真心的谢谢.
hbwhwang(catmiw的ID已经停用,现在用这个) ( ) 信誉:100
呵呵,当初,我一下转换到Vector中,呵呵,结果OutOfmenery....
根据sybase的经验,现在一般是300个commit一次..其实时间也挺快的
hbwhwang
2006-11-15
打赏
举报
回复
我以前做过大数据量的导入,给你点建议吧:
不要一个batch 80万条数据!!!!!
这样做的话,各种各样的问题都会出现。
你把它分成800个batch,每次1000条数据commit一次。
不过你要自己控制数据,知道导到哪个地方了,这样即使出现了问题还能退回到初始状态。
NsGFr
2006-11-15
打赏
举报
回复
给各建议:
对于楼主的情况:我的做法是生成一批xml文档。
然后通过xml文档的形式导入数据,呵呵~ 工作大了点,不过挺好用的。而且也容易定位错误的记录
hdhmail2000
2006-11-15
打赏
举报
回复
批处理更新功能使用 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
这里有讲到
hm8328
2006-11-15
打赏
举报
回复
:-(
NND,其实这应该数据迁移工程的,结果客户狡猾,安排几个人,和我们老大交互..要我们帮忙解决..
日,没钱的...
唉,这年头,钱难赚啊.
xxxatt2
2006-11-15
打赏
举报
回复
效率也不差啊,对方把80W数据导到这张表上要花6.5个小时,用程序写的转换程序(包括根据一条记录生成新的记录,等等其他一些数据检查)等等也只要8.01个小时..
恐怖!
这是什么应用啊?
hm8328
2006-11-15
打赏
举报
回复
TO :hdhmail2000(禅剑飞雪)
oracle9i
hdhmail2000
2006-11-15
打赏
举报
回复
还有你有没有关掉自动提交?
con.setAutoCommit(false);
http://www.52bcw.cn/Java/Basic/20060907/5004743.htm
这儿有个帖子,看看能不能帮你了,mysql的
hm8328
2006-11-15
打赏
举报
回复
TO :NsGFr(elan)
谢谢先..
我想我要表达的不是这个异常
hm8328
2006-11-15
打赏
举报
回复
TO:zs178(zh-cn)
以前考虑过用存储过程,但是业务逻辑的判断实在太复杂!太复杂!(先前把逻辑给公司DB说清楚过,写了一个存储过程,结果造成N多脏数据,幸好新数据都有标志,容易清除.后来客户规则一变,等等,存储过程我觉得很难维护的)
况且JAVA程序员,对写存储过程来说,基本上属于弱项.
加上如果把公司DB请到现场,估计没个十天半个月可能还搞不定.所以决定用程序搞定这类数据转换问题...
效率也不差啊,对方把80W数据导到这张表上要花6.5个小时,用程序写的转换程序(包括根据一条记录生成新的记录,等等其他一些数据检查)等等也只要8.01个小时..
NsGFr
2006-11-15
打赏
举报
回复
http://www.techonthenet.com/oracle/errors/ora00984.php
呵呵~~
这样的问题直接搜索oracle的错误代码:ORA-00984
hm8328
2006-11-15
打赏
举报
回复
呵呵,行啊,反正也要等一下执行结果.
贴一个大概的意思..注明 以下说说明一下大体过程..基本上也能反应出问题..批处理抛出的异常信息只有:
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();
}
hdhmail2000
2006-11-15
打赏
举报
回复
晕,那么大的数据阿
你都什么数据库阿?
行近远山
2006-11-15
打赏
举报
回复
executeBatch()
遇到过一样的问题
错误不好找
我插入10W条就顶不住了
后来用procedure实现了
楼主可以考虑一下
加载更多回复(5)
面试2
这样对你来说也可能是不错的,如果餐馆不是太忙,她 服务的客人的请求都很简短且容易完成,你的感觉也好像自己拥有一个专门的waiter,waiter把你的ORDER转给厨师,然后把做好的菜拿给你,这 就是MTS的处理方式,...
各种
出错
以及解决方法(持续更新)
return
execute
Batch
(entityList,
BATCH
_SIZE, (sqlSession, entity) -> { Object idVal = this.getMethodValue(this.currentModelClass(), entity, keyProperty); if (StringUtils.checkValNull(idVal) || Objects...
Scala集成sqlite-vec:JVM向量搜索实现
)" ) documents.foreach { case (content, embedding) => stmt.setString(1, content) stmt.setBytes(2, embedding.toSqliteBlob) stmt.add
Batch
() } val result = stmt.
execute
Batch
().sum // 执行批量插入 conn....
Error converting characters into server's characte
hibernate使用sybase 15.0数据库,在未设置好DB参数时可能会造成乱码,
出错
显示如下: Error 500: Hibernate flushing: Could not
execute
JDBC
batch
update; SQL [insert into CCS_LOG_ACTION (OP_ID, OP_TIME, ...
JDBC心得体会-->总结
ResultSetMetaData是对元数据进行操作的接口,可以实现很多高级功能。 Hibernate运行数据库的操作,大部分都是通过此接口。可以认为,此接口是SQL查询语言的一种反射机制。 ResultSetMetaData接口可以通过...
Java SE
62,629
社区成员
307,261
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章