请教生产系统中出现的Batch failure问题,非常感谢!

各位老师,生产系统昨晚出现一个Batch failure问题,搞到2点多也没什么思路,今天继续过来搞,还请各位指教,非常感谢!

环境:AIX P550小型机,DB2 9.7.5,Websphere 6.1.43 diaglog级别是info,里面没有error信息,只有几个无关的event 信息,systemout日志如下,搜索SQL Error: -4229和SQL Error: -302, SQLState: 22001 ibm网站上显示插入时字段超过约束限制,但是奇怪的是日志中红色显示的错误。,这个操作是一个查询操作,判断是否存在相同记录,查询操作为什么会产生batch update错误?
在命令行上,向该表插入也不存在问题,是否遇到过类似的问题,怎么解决?

参与12

9同行回答

梦奇梦奇研究学者某银行
SQL Error: -4229 和 SQL Error: -302 错误信息:SQL Error: -4229 错误表示存在一个或多个字段超过了约束限制,而 SQL Error: -302 表示执行的 SQL 语句中存在一个或多个字段长度超过数据库表中定义的最大长度限制。根据您提供的信息,似乎是插入操作中某个字段的值超过了表...显示全部
  1. SQL Error: -4229 和 SQL Error: -302 错误信息:SQL Error: -4229 错误表示存在一个或多个字段超过了约束限制,而 SQL Error: -302 表示执行的 SQL 语句中存在一个或多个字段长度超过数据库表中定义的最大长度限制。根据您提供的信息,似乎是插入操作中某个字段的值超过了表的约束或长度限制。
  2. 红色显示的错误:您提到日志中有一个红色显示的错误,可能是一个严重错误或异常。请确保您仔细阅读日志中的详细信息,以便更好地理解问题的根本原因。
  3. 查询操作产生 Batch update 错误:您提到查询操作为什么会产生 Batch update 错误。Batch update 错误通常与执行的 SQL 语句有关,可能是执行的语句被认为是更新操作,而不是查询操作。这可能是由于某些代码逻辑或配置问题导致的。
  4. 向该表插入不存在问题:您提到在命令行上向该表插入数据没有问题。这可能意味着问题不在于表的约束或长度限制,而是与应用程序的逻辑或配置相关。
收起
文化教育其它 · 2023-06-19
浏览1033
zhendazhenda数据库管理员昆仑银行
今天遇到了这样类似的问题,数据库日志里没有任何报错。错误返回码又没有有价值的东东。还好此类问题解决了。显示全部
今天遇到了这样类似的问题,数据库日志里没有任何报错。错误返回码又没有有价值的东东。还好此类问题解决了。收起
软件开发 · 2015-04-24
浏览6916
db2china2db2china2技术经理DB2咨询服务
回复 5# hczzhong 从代码来看,addEmployee()函数只返回   int employeeID,外面 代码不会引有函数体新建的EMPLOYEE的显示全部
回复 5# hczzhong
从代码来看,addEmployee()函数只返回   int employeeID,外面 代码不会引有函数体新建的EMPLOYEE的收起
IT咨询服务 · 2015-04-24
浏览7218
shadowflareshadowflare软件开发工程师交通银行
回复 3# lxcorange 只要有rollback就会出现序列数字间隔的现象,你检查下。显示全部
回复 3# lxcorange

只要有rollback就会出现序列数字间隔的现象,你检查下。收起
银行 · 2015-04-24
浏览6981
zhendazhenda数据库管理员昆仑银行
回复 3# lxcorange    你怎么查看出错是数据库的信息啊,出错应该不写入数据库信息吧。显示全部
回复 3# lxcorange


   你怎么查看出错是数据库的信息啊,出错应该不写入数据库信息吧。收起
软件开发 · 2015-04-24
浏览6920
hczzhonghczzhong售前工程师CN
db2diag里面不会有这类信息,这是代码问题,不是数据库异常或者值得DBA关注的事情。getNextException() 能获取batch中的具体Exception,如果有多个,还可以继续getNextException,但这里肯定和sequence cache无关,和并发/锁也无关对JAVA代码来说,302最容易的原因是JAVA对象生命周期...显示全部
db2diag里面不会有这类信息,这是代码问题,不是数据库异常或者值得DBA关注的事情。
getNextException() 能获取batch中的具体Exception,如果有多个,还可以继续getNextException,但这里肯定和sequence cache无关,和并发/锁也无关
对JAVA代码来说,302最容易的原因是JAVA对象生命周期,看如下代码:
   public Integer addEmployee(String fname, String lname, int salary){
      Session session = factory.openSession();
      Transaction tx = null;
      Integer employeeID = null;
      try{
         tx = session.beginTransaction();
         Employee employee = new Employee(fname, lname, salary);
         employeeID = (Integer) session.save(employee);
         tx.commit();
      }catch (HibernateException e) {
         if (tx!=null) tx.rollback();
         e.printStackTrace();
      }finally {
         session.close();
      }
      return employeeID;
   }
这段代码是以前写的,应该有两个版本,一个出错,一个正常,现在找不到完整的了,当时是为了一个几乎一样的问题。可以在Employee ...session.save(employee)外面套循环,改变fname,lnane的内容,
比较一下在循环中增加新的Employee,每次new.然后看看在循环外面用new,而不是循环里面。
用Hibernate时,并非每个对象的保存都是立即到数据库执行的,在有transaction或者batch时,是延迟执行的。这样,如果上面的代码中,在循环外面new,而在循环中改变它的内容,一次两次可能似乎执行没错,但实际上,有些对象已经失去了外面的reference,成为垃圾,循环多几次,肯定会碰到类似的错误,因为有些对象已经超出生命周期.收起
IT分销/经销 · 2013-07-01
浏览6916
nanjing_2013nanjing_2013系统架构师北京卓望
把出错时的db2diag日志贴出来看看,db2错误时很准的显示全部
把出错时的db2diag日志贴出来看看,db2错误时很准的收起
互联网服务 · 2013-06-30
浏览7716
lxcorangelxcorange软件架构设计师某券商
补充下,出错时查看数据库中的数据,发现原来没出错时由sequence生成的主键为顺序的,间隔为1,出错时sequence生成的主键中间空了一个数字,是不是数据库中存在的sequence缓存,有一个间隔导致的生成的主键约束冲突...显示全部
补充下,出错时查看数据库中的数据,发现原来没出错时由sequence生成的主键为顺序的,间隔为1,出错时sequence生成的主键中间空了一个数字,是不是数据库中存在的sequence缓存,有一个间隔导致的生成的主键约束冲突收起
互联网服务 · 2013-06-30
浏览6874
lxcorangelxcorange软件架构设计师某券商
在网上搜到的一个原因,按照这样是不是我报出的查询操作的异常是一个假象,实际的异常没有捕获到,我需要用Int[] results = ps.executeBatch(); 捕获异常,找到真正原因?3. 使用批处理时,当批处理中有一条SQL语句优化SQL异常而导致整个批处理失败。在打印日志时应该注意,以上的打印...显示全部
在网上搜到的一个原因,按照这样是不是我报出的查询操作的异常是一个假象,实际的异常没有捕获到,我需要用Int[] results = ps.executeBatch(); 捕获异常,找到真正原因?

3. 使用批处理时,当批处理中有一条SQL语句优化SQL异常而导致整个批处理失败。在打印日志时应该注意,以上的打印方式对问题定位没有任何帮助。如上如果其中的一条SQL语句执行失败,那么你不知道究竟是什么异常,因为没有打印异常列,而只打印了最顶层异常。例如:如上程序在DB2数据库中执行失败后,只返回了如下信息com.ibm.db2.jcc.c.vd: Non-atomic batch failure.  The batch was submitted, but at least one exception occurred on an individual member of the batch. Use getNextException() to retrieve the exceptions for specific batched elements.大概意思是批处理执行失败,批处理已经提交,但是其中至少有一条或者多条执行失败。使用getNextException来查看执行白失败的SQL语句异常信息,便于定位!可是这样还是有问题,你知道了SQL语句的异常了,但是你不知道究竟是那条SQL语句导致的异常,其实可以更具批处理执行的返回值来检查执行结果。
Int[] results = ps.executeBatch();收起
互联网服务 · 2013-06-29
浏览7039

提问者

lxcorange
软件架构设计师某券商
擅长领域: 大数据数据库数据仓库

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2013-06-29
  • 关注会员:2 人
  • 问题浏览:19457
  • 最近回答:2023-06-19
  • X社区推广