当前位置: 首页 > 知识库问答 >
问题:

Hibernate Envers-支持ValidityAuditStrategy中的JDBC批处理,允许_identifier_reuse=true

曾奇略
2023-03-14

使用HiberNate Envers(版本5.2.17。最终),我试图持久化大约250000个JPA实体,并使用EnversValidityAuditStrategy审计初始插入。我正在使用JDBC批处理来提高性能。我看到两者都发生了批处理

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

但不适用于用于更新任何以前审核行的结束修订的查询,我认为在设置允许_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;
    }
}

Hibernate/Envers配置:

  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个答案

暴骏奇
2023-03-14

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

  1. 标识符重用(这实际上只对REV_TYPE=0或Rev. sionType. ADD行重要)。
  2. REV_TYPE!=0(又名RevsionType. MODRevsionType. DEL行)。

目前,还没有真正的解决方法来批量处理这些语句,这主要是因为这些更新的工作方式。现有的策略预期这些谓词会影响表中的一行,因此也会检查它,作为其合理性检查的一部分,否则我们会强制事务失败。

我认为找到一种方法来实现这一点是很好的,这样批量插入/更新就可以工作了,但我们首先必须找到一种方法来实现这些更新,并保持相同的健全性检查,其中只有一行会受到该更改的影响,而不是多行,如果更改被延迟,就会出现这种情况。

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

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

 类似资料:
  • 我需要用Storm处理成批的元组。我的最后一个bolt必须等到拓扑接收到整个批处理之后才能进行一些处理。为了避免混淆--对我来说,批处理是一组N条消息,它们是实时的,这个术语不需要与批处理(Hadoop)联系在一起。即使2条消息也可以是一批。 阅读Storm的文档是否可以说Storm不支持这种批处理(实时的批处理=N条消息)? 所以我的问题是给你们,我亲爱的Storm大师们,这个拓扑是不是设计得很

  • 主要内容:使用Statement对象进行批处理,使用PrepareStatement对象进行批处理批量处理允许将相关的SQL语句分组到批处理中,并通过对数据库的一次调用来提交它们,一次执行完成与数据库之间的交互。 一次向数据库发送多个SQL语句时,可以减少通信开销,从而提高性能。 不需要JDBC驱动程序来支持此功能。应该使用方法来确定目标数据库是否支持批量更新处理。如果JDBC驱动程序支持此功能,该方法将返回。 ,和的方法用于将单个语句添加到批处理。 用于执行组成批量的所有语句。 返回一个整数

  • Cassaforte具有插入批处理功能,可一次性将多行插入到cassandra CQL表中。 我最近切换到Alia,我想知道它是否提供相同的功能?我不能立即在留档中看到任何内容,并且(hayt/value…)似乎一次只支持单行插入。

  • 问题内容: 我在应用程序中使用Hibernate ORM和PostgreSQL,有时我使用批处理操作。最初,我不明白为什么在批处理大小为25的日志中,会生成25个查询,并且最初认为它无法正常工作。但是之后,我查看了pg驱动程序的源代码,并在PgStatement类中找到了以下几行: 并在PgPreparedStatement类中 我注意到,事实证明,如果批处理的大小达到25,则会发送25个带有附加

  • 我在我的应用程序中使用Hibernate ORM和PostgreSQL,有时我使用批处理操作。起初我不明白为什么在批处理大小=25的日志中,会生成25个查询,起初我认为它不能正常工作。但是在那之后,我查看了pg驱动程序的源代码,在Pg语句类中发现了以下几行: 在PgPreparedStatement类中 我注意到,如果批处理的大小变为25,则会发送25个查询并附带参数。 数据库日志证实了这一点,例

  • 12.9 扩展 JSR-352 批处理作业 Spring Batch 的 job 有4种扩展方式 (后两种方式支持使用多个JVM来执行): Split - 并行执行多个 step. Multiple threads - 通过多线程执行单个 step. Partitioning - 将数据切分后并行处理 (主从,master/slave). Remote Chunking - 远程执行逻辑处理块.