Joh*_*erg 3 java spring hibernate transactions batch-processing
我有几个场景,我认为从hibernate文档中有点不清楚.
数据类:
class HibernateDao {
// ...
@Transactional
public void store(List<Object> batch) {
for(Object o : batch) {
hibernate.store(o);
}
}
}
Run Code Online (Sandbox Code Playgroud)
hibernate.jdbc.batch_size = 1
Run Code Online (Sandbox Code Playgroud)
Q1:store(..)使用一组10项目调用时会发生什么?会有10 个 1个交易还是只有一个?
hibernate.jdbc.batch_size = 10
Run Code Online (Sandbox Code Playgroud)
Q2:store(..)使用一组1项目调用时会发生什么?无论batch_size属性如何,它是否会立即写入后备存储?
从hibernate文档:
如果您使用身份标识符生成器,Hibernate会透明地禁用JDBC级别的插入批处理
问题3:什么被归类为identify identifier generator,使用注释@Id和@GeneratedValue(strategy = GenerationType.AUTO)?
Q1:使用10个项目的集合调用store(..)会发生什么?会有10个1个交易还是只有一个?
这是特定于Spring事务的,但就Hibernate而言,如果您使用一个会话和一个"事务",它将等到"flush"或"commit"实际执行操作.所以,一个交易.
Q2:使用1个项目的集合调用store(..)会发生什么?无论batch_size属性如何,它是否会立即写入后备存储?
不是马上.前面的响应中的相同内容适用于此:除非您明确要求"刷新",否则Hibernate将在提交阶段执行操作.
问题3:什么被归类为识别标识符生成器,使用注释@Id和@GeneratedValue(strategy = GenerationType.AUTO)?
Hibernate无法预测任何ID作为ID.例如,身份(如序列,但对于T-SQL数据库),自动增量,序列......原因很简单:Hibernate不知道每个批处理实体的生成ID是什么,因此,插入后的实体状态与之前的状态不同.Hibernate通过调用"getGeneratedKeys"的JDBC方法来处理常规方案,这允许它将数据库中的数据与其会话中的数据同步,但是不可能对批处理进行同步.
如果Hibernate确实知道实体的ID是什么(即:assigned,hilo,uuid,......),它可以安全地执行批处理.
| 归档时间: |
|
| 查看次数: |
4952 次 |
| 最近记录: |