日期:2014-05-16  浏览次数:20452 次

调用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在这方面做的不错,不由的赞一个,这才叫专业。