Java Hibernate Session.SaveOrUpdate方法在每个项目之前调用select-是否有方法批处理这些选择?
我正在使用java/hibernate/mysql。我正在创建要保存到数据库的对象列表。有些项目是新的,有些已经在数据库中(我不知道是哪一个)。出于这个原因,我使用session.SaveOrUpdate方法,它可以在必要时插入并在必要时更新 问题是,每次调用saveOrUpdate(myObject)时,我都会看到一个select调用,用于检查此记录是否已经存在,因此如果我在N个对象上循环,则有N个select查询。我有没有办法把这些选择集中在一起 这种行为对性能有显著影响吗 谢谢 我得到的日志是:Java Hibernate Session.SaveOrUpdate方法在每个项目之前调用select-是否有方法批处理这些选择?,java,mysql,hibernate,batch-processing,Java,Mysql,Hibernate,Batch Processing,我正在使用java/hibernate/mysql。我正在创建要保存到数据库的对象列表。有些项目是新的,有些已经在数据库中(我不知道是哪一个)。出于这个原因,我使用session.SaveOrUpdate方法,它可以在必要时插入并在必要时更新 问题是,每次调用saveOrUpdate(myObject)时,我都会看到一个select调用,用于检查此记录是否已经存在,因此如果我在N个对象上循环,则有N个select查询。我有没有办法把这些选择集中在一起 这种行为对性能有显著影响吗 谢谢 我得到的日
Hibernate: select price0_.product_id as product1_3_0_, price0_.store_id as
store2_3_0_, price0_.date_updated as date3_3_0_, price0_.price as price3_0_,
price0_.quality as quality3_0_, price0_.update_source as update6_3_0_
from realworld.price price0_ where price0_.product_id=? and price0_.store_id=?
Hibernate: select price0_.product_id as product1_3_0_, price0_.store_id as
store2_3_0_, price0_.date_updated as date3_3_0_, price0_.price as price3_0_,
price0_.quality as quality3_0_, price0_.update_source as update6_3_0_
from realworld.price price0_ where price0_.product_id=? and price0_.store_id=?
Hibernate: insert into realworld.price
(date_updated, price, quality, update_source, product_id, store_id)
values (?, ?, ?, ?, ?, ?)
Hibernate: insert into realworld.price
(date_updated, price, quality, update_source, product_id, store_id)
values (?, ?, ?, ?, ?, ?)
生成此命令的代码是:
for (Price price : prices){
HibernateCurrentSession.currentSession().merge(price);
i++;
if ( i % batchsize == 0 ) {
//flush a batch of inserts and release memory:
HibernateCurrentSession.currentSession().flush();
HibernateCurrentSession.currentSession().clear();
}
}
首先,这些选择和其他选择都是在同一个事务中执行的,所以它们应该工作得很快。获取它们的原因可能是,对于现有条目,Hibernate可能希望首先检查version字段(通过将其当前值与数据库中已有的值进行比较),这将在更新之前发出select。有关saveOrUpdate行为的更多详细信息,请参见 我认为在这种情况下,没有办法控制或批处理这些选择。要实现更高效的运营,您可以做以下几点:
- 您有一个实体实例列表,希望将其当前状态持久化到db,并且不知道/不关心哪些实体实例已经将状态持久化到db,哪些是新的实体实例
- 在给定事务中,使用
session.merge(obj)
- 现在,您只需对每个实例进行必要的修改(即根据您的业务逻辑需要)。您不再需要对其调用任何persist/update方法来将modif持久化到数据库,这将在提交事务时自动发生