Hibernate Envers-在ValidityAuditStrategy中使用allow_identifier_reuse = true支持JDBC批处理

时间:2018-12-21 15:27:19

标签: java hibernate hibernate-envers

使用Hibernate + Envers(版本5.2.17.Final),我试图保留大约250000个JPA实体,并使用Envers ValidityAuditStrategy审核初始插入。我正在使用JDBC批处理来提高性能。我看到两者都发生了批处理

  • 插入基表(即INSERT INTO dbo.EXAMPLE_TABLE
  • 插入审核表(即INSERT INTO dbo.EXAMPLE_TABLE_AUD

,但不适用于用于更新任何先前审核行的最终版本的查询,我相信在设置allow_identifier_reuse=true时启用(对于我的用例是必需的)。这些更新查询之一的示例:

update
    dbo.example_table_aud
set
    revend=? 
where
    id=? 
    and rev<> ? 
    and revend is null

实体代码:

@Entity
@Audited
@Table(schema = "dbo", name = "EXAMPLE_TABLE")
public class ExampleEntity {

    @Id
    @Column(name = "ID", nullable = false)
    private long id;

    @Column(name = "NAME", nullable = false)
    private String name;

    @Version
    @Column(name = "VERSION", nullable = false)
    private int version;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getVersion() {
        return version;
    }

    public void setVersion(int version) {
        this.version = version;
    }
}

休眠/启用配置:

  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批处理来更新任何先前行的最终修订版?

1 个答案:

答案 0 :(得分:1)

您提到的更新的发生有几个原因:

  1. 标识符重用(这实际上仅对REV_TYPE = 0或RevisionType.ADD行很重要)。
  2. REV_TYPE!= 0(又名RevisionType.MODRevisionType.DEL行)。

当前没有真正的解决方法,因此可以对这些语句进行批处理,这主要是由于这些更新的工作方式的本质。现有的策略希望这些谓词会影响表中的一行,因此也要检查其是否是其健全性检查的一部分,否则我们会迫使交易失败。

我认为找到一种方法来执行批量插入/更新将是很棒的,但是我们首先必须找到一种方法来实现这些更新并保持相同的完整性检查,其中只有一行会受到该更改的影响,而不是受延迟的影响。

所有这些;所有这些逻辑都在ValidityAuditStrategy内部处理,这是用户可插入的选项,因此您可能会找到可行的解决方案,并与我们分享。

无论哪种情况,我都建议与我们一起解决JIRA增强问题,我们可以更详细地讨论如何(如果可能)最好地有效,更有效地处理潜在支持的批处理插入/更新。