簡體   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