调用JDBC方法 executeBatch()后你检查rowcount了吗?
最近的一个项目里用hibernate插入sybase数据库时,总是报告异常
Batch update returned unexpected row count from update [10]; actual row count:0; expected:1
检查了很久也没找到原因,主要是sybaes的驱动做的不好,没有报告原始 的错误信息,
经过检查,是hibernate 的类org.hibernate.jdbc.BatchingBatcher在调用jdbc插入数据库后检查返回的rowcount是否和预期的不一致,而报告的错误 。当时由于找不到错误原因,为了让系统能够正常运行,就修改了hibernate 的代码,去除了检查rowcount 的代码:
protected void doExecuteBatch(PreparedStatement ps)
throws SQLException, HibernateException
{
if(batchSize == 0)
{
log.debug("no batched statements to execute");
} else
{
if(log.isDebugEnabled())
log.debug("Executing batch size: " + batchSize);
try
{
checkRowCounts(ps.executeBatch(), ps);
}
catch(RuntimeException re)
{
log.error("Exception executing batch: ", re);
throw re;
}
finally
{
batchSize = 0;
}
}
}
去掉了checkRowCounts的调用。
没想到修改这个代码以后,虽然异常没有了, 却出现了insert 正常,数据库里却没有数据的问题。只好手工调试代码,才发现是插入的数据精度太大,数据库定义的精度小而导致的这个问题,这个问题如果是其他的数据库根本不会发生,但是sybase的jdbc驱动却没有报告出这个异常。
上面讲了这么多,主要是向想说明的是,估计大多数人和我一样,在手工jdbc代码时几乎不检查rowcount的返回值,虽然出现这个问题的概率可能只有万分之一,但是如果是一个严谨的系统,还是应该要检查的,好在hibernate在这方面做的不错,不由的赞一个,这才叫专业。