Hibernate Envers - 支持 JDBC ValidityAuditStrategy 中的批处理 allow_identifier_reuse=true
Hibernate Envers - Support for JDBC batching in ValidityAuditStrategy with allow_identifier_reuse=true
使用 Hibernate + Envers(版本 5.2.17.Final),我试图保留大约 250000 个 JPA 实体并使用 Envers ValidityAuditStrategy
审核初始插入。我正在使用 JDBC 批处理来提高性能。我看到
都发生了批处理
- 插入基数 table(即
INSERT INTO dbo.EXAMPLE_TABLE
)
- 插入审计 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;
}
}
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 批处理来更新任何先前行的最终修订?
您提到的更新发生有几个原因:
- 标识符重用(实际上只对 REV_TYPE = 0 或
RevisionType.ADD
行很重要)。
- REV_TYPE != 0(又名
RevisionType.MOD
和 RevisionType.DEL
行)。
目前没有真正的解决方法可以对这些语句进行批处理,这主要是因为这些更新的工作方式的性质。现有的策略预计这些谓词会影响 table 中的单行,因此也会将其作为完整性检查的一部分进行检查,否则我们会强制事务失败。
我认为找到一种方法来做到这一点,这样批处理 insert/updates 就可以工作了,但我们首先必须找到一种方法来实现这些更新并保持相同的健全性检查只有一行会受到该更改的影响,而不是多行,如果它们被延迟就会出现这种情况。
综上所述;所有这些逻辑都在 ValidityAuditStrategy
中处理,这是用户的可插入选项,因此您可能会找到一个可行的解决方案,并与我们分享。
在任何一种情况下,我都建议与我们一起打开 JIRA 增强问题,我们可以更详细地讨论如何(如果可能)最好地处理潜在的支持批处理 inserts/updates 更有效和更高效。
使用 Hibernate + Envers(版本 5.2.17.Final),我试图保留大约 250000 个 JPA 实体并使用 Envers ValidityAuditStrategy
审核初始插入。我正在使用 JDBC 批处理来提高性能。我看到
- 插入基数 table(即
INSERT INTO dbo.EXAMPLE_TABLE
) - 插入审计 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;
}
}
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 批处理来更新任何先前行的最终修订?
您提到的更新发生有几个原因:
- 标识符重用(实际上只对 REV_TYPE = 0 或
RevisionType.ADD
行很重要)。 - REV_TYPE != 0(又名
RevisionType.MOD
和RevisionType.DEL
行)。
目前没有真正的解决方法可以对这些语句进行批处理,这主要是因为这些更新的工作方式的性质。现有的策略预计这些谓词会影响 table 中的单行,因此也会将其作为完整性检查的一部分进行检查,否则我们会强制事务失败。
我认为找到一种方法来做到这一点,这样批处理 insert/updates 就可以工作了,但我们首先必须找到一种方法来实现这些更新并保持相同的健全性检查只有一行会受到该更改的影响,而不是多行,如果它们被延迟就会出现这种情况。
综上所述;所有这些逻辑都在 ValidityAuditStrategy
中处理,这是用户的可插入选项,因此您可能会找到一个可行的解决方案,并与我们分享。
在任何一种情况下,我都建议与我们一起打开 JIRA 增强问题,我们可以更详细地讨论如何(如果可能)最好地处理潜在的支持批处理 inserts/updates 更有效和更高效。