java - 如何使用 ValidityAuditStrategy 批量插入审计表以进行收集
问题描述
我正在使用 Hibernate envers 进行审计,并且我的大多数表都可以很好地执行批量插入。但是,在我的一个实体上,我有一个经过审核的集合,它似乎不想批处理。
我的实体:
@Entity
@DynamicUpdate
@Indexed(index = "aj")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ElementGroup {
...
@ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE })
@BatchSize(size = 30)
@OrderBy("id ASC")
@JoinTable(
name = "element_groups",
joinColumns = @JoinColumn(name = "group_id"),
inverseJoinColumns = @JoinColumn(name = "member_id")
)
@Audited
protected List<Element> members = new LinkedList<Element>();
(不确定这是否重要,我使用的是 postgresql)。在日志中,我在循环中看到了 1000 条这样的语句
DEBUG 2021-11-07 15:28:56,673 [applicationInterfcePublishTaskExecuter-4::o.h.SQL.logStatement] [user:system]
insert
into
nst_netobj_groups_aud
(revtype, revend, rev, group_id, member_id)
values
(?, ?, ?, ?, ?)
DEBUG 2021-11-07 15:28:56,677 [applicationInterfcePublishTaskExecuter-4::o.h.SQL.logStatement] [user:system]
select
nst_netobj0_.rev as rev1_137_,
nst_netobj0_.group_id as group_id2_137_,
nst_netobj0_.member_id as member_i3_137_,
nst_netobj0_.revtype as revtype4_137_,
nst_netobj0_.revend as revend5_137_
from
nst_netobj_groups_aud nst_netobj0_
where
nst_netobj0_.group_id=?
and nst_netobj0_.member_id=?
and (
nst_netobj0_.revend is null
) for update
of nst_netobj0_
做一些调试,我了解到 select for update 语句导致前一个插入的刷新,不允许它们批处理。这条线似乎是原因:
final List<Object> l = qb.toQuery( session ).setLockOptions( LockOptions.UPGRADE ).list();
hibernate-envers-5.4.27.Final-sources.jar!/org/hibernate/envers/strategy/internal/ValidityAuditStrategy.java:328
我看到将刷新模式设置为手动/提交似乎没有帮助。有什么建议么?
完整的堆栈跟踪:
logStatement:125, SqlStatementLogger (org.hibernate.engine.jdbc.spi)
prepareStatement:170, StatementPreparerImpl$StatementPreparationTemplate (org.hibernate.engine.jdbc.internal)
prepareQueryStatement:151, StatementPreparerImpl (org.hibernate.engine.jdbc.internal)
prepareQueryStatement:2104, Loader (org.hibernate.loader)
executeQueryStatement:2041, Loader (org.hibernate.loader)
executeQueryStatement:2019, Loader (org.hibernate.loader)
doQuery:948, Loader (org.hibernate.loader)
doQueryAndInitializeNonLazyCollections:349, Loader (org.hibernate.loader)
doList:2850, Loader (org.hibernate.loader)
doList:2832, Loader (org.hibernate.loader)
listIgnoreQueryCache:2664, Loader (org.hibernate.loader)
list:2659, Loader (org.hibernate.loader)
list:506, QueryLoader (org.hibernate.loader.hql)
list:400, QueryTranslatorImpl (org.hibernate.hql.internal.ast)
performList:219, HQLQueryPlan (org.hibernate.engine.query.spi)
list:1414, SessionImpl (org.hibernate.internal)
doList:1625, AbstractProducedQuery (org.hibernate.query.internal)
list:1593, AbstractProducedQuery (org.hibernate.query.internal)
performCollectionChange:328, ValidityAuditStrategy (org.hibernate.envers.strategy.internal)
performCollectionChange:76, AuditStrategy (org.hibernate.envers.strategy)
perform:87, PersistentCollectionChangeWorkUnit (org.hibernate.envers.internal.synchronization.work)
executeInSession:125, AuditProcess (org.hibernate.envers.internal.synchronization)
doBeforeTransactionCompletion:164, AuditProcess (org.hibernate.envers.internal.synchronization)
doBeforeTransactionCompletion:47, AuditProcessManager$1 (org.hibernate.envers.internal.synchronization)
beforeTransactionCompletion:954, ActionQueue$BeforeTransactionCompletionProcessQueue (org.hibernate.engine.spi)
beforeTransactionCompletion:525, ActionQueue (org.hibernate.engine.spi)
beforeTransactionCompletion:2381, SessionImpl (org.hibernate.internal)
beforeTransactionCompletion:447, JdbcCoordinatorImpl (org.hibernate.engine.jdbc.internal)
beforeCompletionCallback:183, JdbcResourceLocalTransactionCoordinatorImpl (org.hibernate.resource.transaction.backend.jdbc.internal)
access$300:40, JdbcResourceLocalTransactionCoordinatorImpl (org.hibernate.resource.transaction.backend.jdbc.internal)
commit:281, JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl (org.hibernate.resource.transaction.backend.jdbc.internal)
commit:101, TransactionImpl (org.hibernate.engine.transaction.internal)
doCommit:562, JpaTransactionManager (org.springframework.orm.jpa)
processCommit:743, AbstractPlatformTransactionManager (org.springframework.transaction.support)
commit:711, AbstractPlatformTransactionManager (org.springframework.transaction.support)
execute:152, TransactionTemplate (org.springframework.transaction.support)
lambda$publishApplicationInterfaceAsync$0:298, ApplicationInterfaceService (com.tufin.secureapp.service.interfaces)
run:-1, 16579879 (com.tufin.secureapp.service.interfaces.ApplicationInterfaceService$$Lambda$669)
runWorker:1149, ThreadPoolExecutor (java.util.concurrent)
run:624, ThreadPoolExecutor$Worker (java.util.concurrent)
run:748, Thread (java.lang)
解决方案
推荐阅读
- ansible - 我可以在ansible的jinja2模板中运行shell命令吗
- c# - 设置字典的属性?
- python-imaging-library - heroku上的python图像库PIL不起作用
- vue.js - 在 Jest 中模拟 axios 返回 axios 未定义
- java - SimpleDateFormat 给出错误的格式输出
- swift - 如何在collectionViewCell中使用动态大小的scrollView
- python - 如何在特定目录中的所有测试之前运行一次 pytest 夹具?
- operating-system - DMA 对小数据包有效吗?
- django - Django 查询集返回空“[]”
- php - 如何在php中修复特征方法冲突和重命名方法