最近的一个项目里用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在这方面做的不错,不由的赞一个,这才叫专业。
分享到:
相关推荐
例如,了解JDBC如何通过反射机制调用数据库驱动的特定方法,或者数据库连接是如何在内部实现的,都能帮助我们更好地设计和优化数据库应用程序。 总之,JDBC是Java开发中的重要工具,理解和掌握其基本操作和高级特性...
当你已经添加了足够多的SQL语句到批处理列表后,通过调用`executeBatch()`,所有这些语句会被一次性提交到数据库。这样做的好处在于,它减少了与数据库交互的次数,从而提高了效率。 批量处理的使用场景通常包括: ...
Java JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,它提供了标准的方法来连接、查询和操作数据库系统。本示例是关于如何使用Java JDBC与MySQL数据库进行交互的...
- **批处理**:批量执行SQL语句可以提高效率,使用`addBatch()`和`executeBatch()`方法。 - **预编译SQL**:使用PreparedStatement可以预编译SQL,减少解析时间。 - **关闭自动提交**:在不需要自动提交的情况下...
- **事务管理**:JDBC支持显式事务控制,你可以通过调用`setAutoCommit(false)`来开启手动事务,并使用`commit()`和`rollback()`进行提交和回滚。 - **批处理**:对于大量相似的SQL插入或更新,可以使用`addBatch()...
1. **批处理**:使用Statement对象的addBatch()方法添加多条SQL,然后调用executeBatch()一次性执行,提高效率。 2. **事务管理**:通过Connection对象的setAutoCommit()方法控制事务的自动提交,使用commit()和...
通过 `Statement` 对象的 `addBatch(String sql)` 方法添加SQL语句到批处理队列,然后通过 `executeBatch()` 执行所有累积的SQL。 - 批处理适用于多条相同类型的操作,如批量插入或更新。 5. **预编译语句...
本自学文档将带你深入理解和掌握JDBC的核心概念和操作。 **1. JDBC基础知识** JDBC的核心是`java.sql.DriverManager`类,它是连接数据库的入口点。首先,我们需要加载数据库驱动并建立连接。这通常通过`Class.for...
1. **批处理**:通过Statement对象的`addBatch()`和`executeBatch()`方法,可以将多个SQL语句作为一个批次执行,提高性能。 2. **使用PreparedStatement**:预编译SQL语句,减少解析次数,提升效率。 3. **设置合适...
要优化JDBC性能,可以考虑预编译SQL语句(使用`PreparedStatement`)、批量操作(使用`addBatch()`和`executeBatch()`)、使用最新的JDBC驱动,以及合理设置连接池参数。 以上就是关于"sql server2000 jdbc"的相关...
如果需要调用多个存储过程或函数,可以使用`CallableStatement.addBatch()`方法将多个调用语句添加到批处理队列,然后用`CallableStatement.executeBatch()`一次性执行,提高效率。 六、性能优化 1. 使用连接池:...
JDBC提供了PreparedStatement接口,通过`addBatch()`方法可以将多条SQL语句添加到批处理队列中,然后调用`executeBatch()`一次性执行所有插入操作。这种方法适用于需要插入相同结构但参数不同的数据,例如用户注册...
**JDBC(Java Database Connectivity)**是Java编程语言中用于与关系数据库进行交互的一种标准接口。...通过本课件的学习,你将能够熟练地使用JDBC进行数据库操作,并了解其背后的原理和最佳实践。
【IT十八掌徐培成】Java基础第23天的课程主要聚焦在JDBC操作数据库时的批量处理技术,特别是`addBatch`和`executeBatch`这两个关键方法。在Java中,当我们需要对数据库进行大量数据的插入、更新或删除操作时,传统的...
4. **执行SQL**:调用`executeQuery()`或`executeUpdate()`方法执行SQL。 5. **处理结果**:如果执行的是查询语句,使用`ResultSet`处理结果;如果是DML语句(增删改),检查受影响的行数。 6. **关闭资源**:确保在...
若需手动控制事务,可以调用`Connection.setAutoCommit(false)`来开启事务,并在所有操作完成后用`Connection.commit()`提交或`Connection.rollback()`回滚事务。 五、JDBC优化技巧 1. 使用PreparedStatement以...
这个全面的JDBC资源集合旨在为不同水平的开发者提供深入理解和使用JDBC所需的知识,无论你是初学者还是有一定经验的程序员,都可以从中受益。 **一、JDBC基础** 1. **JDBC驱动**: JDBC驱动是Java与数据库之间的桥梁...
在 JDBC 中,批量处理语句包括两个方法:addBatch(String) 和 executeBatch()。addBatch(String) 方法用于添加需要批量处理的 SQL 语句或参数,而 executeBatch() 方法用于执行批量处理语句。 使用 JDBC 批量处理...
使用addBatch()添加SQL,然后调用executeBatch()执行。 5. JDBC优化技巧 - 使用PreparedStatement而不是Statement,因为预编译的SQL语句更高效。 - 尽量减少数据库连接的创建和关闭,考虑使用连接池。 - 适当...
2. 调用`executeBatch()`执行批处理。 六、JDBC优化 1. 使用PreparedStatement代替Statement,减少解析次数。 2. 使用连接池(如C3P0、HikariCP)管理数据库连接,避免频繁创建和销毁。 3. 使用批处理,减少网络...