繁体   English   中英

如何在 Hibernate 中使用 pooled-lo 优化器

[英]How to use the pooled-lo optimizer with Hibernate

我有一个运行使用 JPA 的 EAR 的 JBoss 7.1.1。 通过 JPA 注释,我使用映射到org.hibernate.id.enhanced.TableGenerator的策略GenerationType.Table

有谁知道在使用“pooled-lo”优化器时如何配置persistence.xml

TABLE 生成器是一个糟糕的选择

现在,在我开始解释如何配置pooledpooled-lo优化器之前,您应该知道TABLE生成器是一个糟糕的选择,因为它不仅慢了 10 倍,而且会使您的数据库连接池拥塞,因为它需要一个获取标识符的额外连接。

此外,因为它使用行级锁来分配下一个标识符,这可能会导致应用程序出现瓶颈。 有关TABLE生成器的危险的更多详细信息。

基于序列的优化器

从 Hibernate 5 开始,只要您将 JPA @SequenceGenerator注释的allocationSize属性设置为大于1的值,就会使用pooled优化器。

对于 Hibernate 4 或 3,要使用pooledpooled-lo优化器,您必须启用以下 Hibernate 属性:

 <property name="hibernate.id.new_generator_mappings" value="true"/>

值得注意的是, pooledpooled-lo优化器仅可用于 SEQUENCE 和 TABLE 生成器,因为这些优化器的目标是减少获取下一个实体标识符所需的数据库往返次数。

池化优化器

pooled化优化器非常容易设置。 您需要做的就是设置 JPA @SequenceGenerator注释的allocationSize ,并且 Hibernate 将切换到使用pooled优化器:

@Id
@GeneratedValue(
    strategy = GenerationType.SEQUENCE,
    generator = "post_sequence"
)
@SequenceGenerator(
    name = "post_sequence",
    sequenceName = "post_sequence",
    allocationSize = 3
)
private Long id;

Hibernate 池化优化器

由于此映射更直接,如果您还提供此 Hibernate 配置属性,则可以切换到pooled-lo而不是pooled

<property name="hibernate.id.optimizer.pooled.preferred" value="pooled-lo" />

池化优化器

要使用 pooled-lo 优化器,实体标识符映射将如下所示:

@Id
@GeneratedValue(
    strategy = GenerationType.SEQUENCE,
    generator = "pooled-lo"
)
@GenericGenerator(
    name = "pooled-lo",
    strategy = "sequence",
    parameters = {
        @Parameter(
            name = "sequence_name",
            value = "post_sequence"
        ),
        @Parameter(
            name = "initial_value",
            value = "1"
        ),
        @Parameter(
            name = "increment_size",
            value = "3"
        ),
        @Parameter(
            name = "optimizer",
            value = "pooled-lo"
        )
    }
)

要了解 pooled-lo 的工作原理,请查看此图:

Hibernate pooled-lo 优化器

如果您一直在使用旧的hilo优化器,您可能希望切换到使用pooledpooled-lo ,因为hilo无法与可能不知道hilo标识符分配策略的其他客户端互操作。

与此同时,我得到了我的问题的答案。

当您将以下行添加到persistent.xml 文件的<properties>部分时,hibernate 将使用“pooled-lo”优化器。

<property name="hibernate.id.optimizer.pooled.prefer_lo" value="true" />

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM