Hibernate批量处理其实从性能上考虑它是很不可取的浪费了很大的内存从它的机制上讲Hibernate它是先把符合条件的数据查出来放到内存当中然后再进行操作实际使用下来性能非常不理想在笔者的实际使用中采用下面的第三种优化方案的数据是条数据插入数据库主流台式机的配置需要约分钟呵呵晕倒
总结下来有三种来处理以解决性能问题
绕过Hibernate API 直接通过 JDBC API 来做这个方法性能上是比较好的也是最快的
运用存储过程
还是用Hibernate API 来进行常规的批量处理可以也有变变就变在我们可以在查找出一定的量的时候及时的将这些数据做完操作就
删掉sessionflush()sessionevict(XX对象集) 这样也可以挽救一点性能损失这个一定的量要就要根据实际情况做定量参考了一般为左右但效果仍然不理想
绕过Hibernate API 直接通过 JDBC API 来做这个方法性能上是比较好的也是最快的(实例为 更新操作)
Transaction tx=sessionbeginTransaction() //注意用的是hibernate事务处理边界
Connection conn=sessionconnection()
PreparedStatement stmt=connpreparedStatement(update CUSTOMER as C set Csarlary=csarlary+ where csarlary>)
stmtexcuteUpdate()
txcommit() //注意用的是hibernate事务处理边界
这小程序中采用的是直接调用JDBC 的API 来访问数据库效率很高避免了Hibernate 先查询出来加载到内存再进行操作引发的性能问题
运用存储过程但这种方式考虑到易植和程序部署的方便性不建议使用(实例为 更新操作)
如果底层数据库(如Oracle)支持存储过程也可以通过存储过程来执行批量更新存储过程直接在数据库中运行速度更加快在Oracle数据库中可以定义一个名为batchUpdateCustomer()的存储过程代码如下
create or replace procedure batchUpdateCustomer(p_age in number) as begin update CUSTOMERS set AGE=AGE+
where AGE>p_age
end
以上存储过程有一个参数p_age代表客户的年龄应用程序可按照以下方式调用存储过程
tx = sessionbeginTransaction()
Connection con=sessionconnection()
String procedure = {call batchUpdateCustomer(?) }
CallableStatement cstmt = conprepareCall(procedure)
cstmtsetInt() //把年龄参数设为
cstmtexecuteUpdate()
txcommit()
从上面程序看出应用程序也必须绕过Hibernate API直接通过JDBC API来调用存储过程
[] [] [] [] []