Java Hibernate Envers-支持ValidityAuditStrategy中的JDBC批处理,允许\标识符\重用=true
使用Hibernate+Envers(版本5.2.17.Final),我试图保存大约250000个JPA实体,并使用EnversJava Hibernate Envers-支持ValidityAuditStrategy中的JDBC批处理,允许\标识符\重用=true,java,hibernate,hibernate-envers,Java,Hibernate,Hibernate Envers,使用Hibernate+Envers(版本5.2.17.Final),我试图保存大约250000个JPA实体,并使用EnversValidityAuditStrategy审核初始插入。我使用JDBC批处理来提高性能。我看到这两种方法都在进行批处理 插入到基表(即,插入到dbo中。示例\u表) 插入到审核表(即,插入到dbo。示例\u table\u AUD) 但不适用于用于更新任何以前审核行的结束修订的查询,我认为在设置allow\u identifier\u reuse=true时启用了该
ValidityAuditStrategy
审核初始插入。我使用JDBC批处理来提高性能。我看到这两种方法都在进行批处理
- 插入到基表(即,
)插入到dbo中。示例\u表
- 插入到审核表(即,
)插入到dbo。示例\u table\u AUD
allow\u identifier\u reuse=true时启用了该查询(这对于我的用例是必需的)。这些更新查询之一的示例:
update
dbo.example_table_aud
set
revend=?
where
id=?
and rev<> ?
and revend is null
休眠/环境配置:
org.hibernate.envers:
audit_table_suffix: _AUD
revision_field_name: REV
revision_type_field_name: REVTYPE
default_schema: dbo
audit_strategy: org.hibernate.envers.strategy.ValidityAuditStrategy
do_not_audit_optimistic_locking_field: false
store_data_at_delete: true
allow_identifier_reuse: true
hibernate:
dialect: org.hibernate.dialect.SQLServer2012Dialect
format_sql: true
jdbc.batch_size: 100
jdbc.batch_versioned_data: true
order_inserts: true
order_updates: true
是否有一种解决方法,可以在查询中使用JDBC批处理来更新以前任何行的结束修订?您提到的更新有以下几个原因:
标识符重用(这实际上只对REV_TYPE=0或RevisionType.ADD
行重要)
REV_类型!=0(又名RevisionType.MOD
和RevisionType.DEL
行)
目前还没有真正的解决方法来批量处理这些语句,这主要是因为这些更新的工作方式。现有的策略期望这些谓词影响表中的一行,因此也会检查该行,作为其健全性检查的一部分,否则我们会强制事务失败
我认为找到一种方法来实现这一点会很好,这样批插入/更新就可以工作了,但我们首先必须找到一种方法来实现这些更新,并保持相同的健全性检查,其中只有一行会受到该更改的影响,而不是多行(如果更改被延迟的话)
所有这些;所有这些逻辑都在ValidityAuditStrategy
中处理,这是用户的一个可插拔选项,因此您可以找到一个可行的解决方案,与我们共享
在任何一种情况下,我都会建议与我们讨论JIRA增强问题,我们可以更详细地讨论如何(如果可能的话)更好地处理可能支持的批插入/更新
org.hibernate.envers:
audit_table_suffix: _AUD
revision_field_name: REV
revision_type_field_name: REVTYPE
default_schema: dbo
audit_strategy: org.hibernate.envers.strategy.ValidityAuditStrategy
do_not_audit_optimistic_locking_field: false
store_data_at_delete: true
allow_identifier_reuse: true
hibernate:
dialect: org.hibernate.dialect.SQLServer2012Dialect
format_sql: true
jdbc.batch_size: 100
jdbc.batch_versioned_data: true
order_inserts: true
order_updates: true