Hibernate性能只读事务和许多子事务

问题描述

我有以下情况:

我有一个@Transactional(readOnly = true)注释的方法(父方法),在这里提取了一些实体。此方法将多次(100+)调用另一种方法(子方法),该方法需要创建一个人员实体并为此需要获取的实体。此子方法获取的实体作为参数,并用@Transactional(propagation = Propagation.REQUIRES_NEW)注释,因为我不希望一个人的创建失败会阻止另一个人的创建。

我想知道的是以下内容

  • 这是不好还是好的做法?
  • 只读交易有什么影响?这项交易会在很长一段时间内(+-5分钟)保持活动状态,最佳做法是使交易尽可能小。

解决方法

如果所有只读方法所做的只是获取,然后将对象传递给另一种方法,则如果更新许多IMO对象,则最好只使用单个写入事务或批量写入事务。您能解释为什么子方法失败吗?

您正在做的是做“批处理工作”的一种方法。因为您要为每个项目创建一个事务,所以实际上使用的是所谓的“块大小”(chunk size)为1。如果要处理的项目很多,而且处理起来很简单,那么这可能会对数据库造成很大的压力。通常,最好设计可变的块大小并调整块大小,直到满足您的需求为止。

根据您的生态系统,您可以使用以下解决方案之一:

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...