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,成为垃圾,循环多几次,肯定会碰到类似的错误,因为有些对象已经超出生命周期.
收起