Hibernate 性能只读事务和许多子事务
Hibernate performance read-only transaction and many child transactions
我有以下场景:
我有一个用 @Transactional(readOnly = true)
注释的方法(父方法),我在其中获取一些实体。此方法将多次调用另一个方法(子方法)(100+),该方法需要创建一个人实体并需要为此获取的实体。这个子方法将获取的实体作为参数并用 @Transactional(propagation = Propagation.REQUIRES_NEW)
注释,因为我不希望一个人的创建失败停止其他人的创建。
我想知道的是:
- 这是好事还是坏事?
- 只读事务有什么影响?此交易会长时间保持活动状态(+- 5 分钟),并且违背最佳实践的罪过是使交易尽可能小。
如果只读方法所做的只是获取对象,然后将对象传递给其他方法,如果更新大量对象 IMO,最好只使用单个写入事务或批量写入事务。你能解释为什么子方法会失败吗?
您正在做的是执行“批处理作业”的一种方式。由于您正在为每个项目创建一个事务,因此您实际上使用的是所谓的“块大小”1。如果您要处理许多易于处理的项目,这可能会给您的数据库带来很大压力。通常最好设计一个可变块大小并调整块大小直到它适合您的需要。
根据您的生态系统,您可以使用以下解决方案之一:
我有以下场景:
我有一个用 @Transactional(readOnly = true)
注释的方法(父方法),我在其中获取一些实体。此方法将多次调用另一个方法(子方法)(100+),该方法需要创建一个人实体并需要为此获取的实体。这个子方法将获取的实体作为参数并用 @Transactional(propagation = Propagation.REQUIRES_NEW)
注释,因为我不希望一个人的创建失败停止其他人的创建。
我想知道的是:
- 这是好事还是坏事?
- 只读事务有什么影响?此交易会长时间保持活动状态(+- 5 分钟),并且违背最佳实践的罪过是使交易尽可能小。
如果只读方法所做的只是获取对象,然后将对象传递给其他方法,如果更新大量对象 IMO,最好只使用单个写入事务或批量写入事务。你能解释为什么子方法会失败吗?
您正在做的是执行“批处理作业”的一种方式。由于您正在为每个项目创建一个事务,因此您实际上使用的是所谓的“块大小”1。如果您要处理许多易于处理的项目,这可能会给您的数据库带来很大压力。通常最好设计一个可变块大小并调整块大小直到它适合您的需要。
根据您的生态系统,您可以使用以下解决方案之一: