[英]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
?
現在,在我開始解釋如何配置pooled
或pooled-lo
優化器之前,您應該知道TABLE
生成器是一個糟糕的選擇,因為它不僅慢了 10 倍,而且會使您的數據庫連接池擁塞,因為它需要一個獲取標識符的額外連接。
此外,因為它使用行級鎖來分配下一個標識符,這可能會導致應用程序出現瓶頸。 有關TABLE
生成器的危險的更多詳細信息。
從 Hibernate 5 開始,只要您將 JPA @SequenceGenerator
注釋的allocationSize
屬性設置為大於1
的值,就會使用pooled
優化器。
對於 Hibernate 4 或 3,要使用
pooled
或pooled-lo
優化器,您必須啟用以下 Hibernate 屬性:<property name="hibernate.id.new_generator_mappings" value="true"/>
值得注意的是, pooled
和pooled-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 配置屬性,則可以切換到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 的工作原理,請查看此圖:
如果您一直在使用舊的
hilo
優化器,您可能希望切換到使用pooled
或pooled-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.