我有一个JBoss 7.1.1,运行一个使用JPA的EAR。通过JPA注解,我使用Map到org.hibernate.id.enhanced.TableGenerator的策略GenerationType.Table。有人知道在使用“pooled-lo”优化器时如何配置persistence.xml吗?
org.hibernate.id.enhanced.TableGenerator
GenerationType.Table
persistence.xml
62lalag41#
现在,在我开始解释如何配置pooled或pooled-lo优化器之前,您应该知道,TABLE生成器是一个糟糕的选择,因为它不仅速度慢10倍,而且会使数据库连接池拥塞,因为它需要一个额外的连接来获取标识符。更多,因为它使用行级锁来分配下一个标识符,这可能会导致应用程序中的瓶颈。
pooled
pooled-lo
TABLE
从Hibernate 5开始,只要将JPA @SequenceGenerator注解的allocationSize属性设置为大于1的值,就会使用pooled优化器。对于Hibernate 4或3,若要使用pooled或pooled-lo最佳化工具,您必须启用下列Hibernate属性:
@SequenceGenerator
allocationSize
1
<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;
由于此Map更直接,因此如果还提供以下Hibernate配置属性,则可以切换到pooled-lo而不是pooled:
<property name="hibernate.id.optimizer.pooled.preferred" value="pooled-lo" />
要使用pooled-lo优化器,实体标识符Map将如下所示:
@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标识符分配策略。
hilo
dxxyhpgq2#
同时,我的问题得到了答案。当您在persistent.xml文件的<properties>部分中添加以下行时,hib将使用“pooled-lo”优化器。
<properties>
<property name="hibernate.id.optimizer.pooled.prefer_lo" value="true" />
2条答案
按热度按时间62lalag41#
TABLE生成器是一个糟糕的选择
现在,在我开始解释如何配置
pooled
或pooled-lo
优化器之前,您应该知道,TABLE
生成器是一个糟糕的选择,因为它不仅速度慢10倍,而且会使数据库连接池拥塞,因为它需要一个额外的连接来获取标识符。更多,因为它使用行级锁来分配下一个标识符,这可能会导致应用程序中的瓶颈。
基于序列的优化器
从Hibernate 5开始,只要将JPA
@SequenceGenerator
注解的allocationSize
属性设置为大于1
的值,就会使用pooled
优化器。对于Hibernate 4或3,若要使用
pooled
或pooled-lo
最佳化工具,您必须启用下列Hibernate属性:值得注意的是,
pooled
和pooled-lo
优化器仅适用于SEQUENCE和TABLE生成器,因为这些优化器的目标是减少获取下一个实体标识符所需的数据库往返次数。池化优化程序
pooled
优化器非常容易设置,您只需设置JPA@SequenceGenerator
注解的allocationSize
,Hibernate将切换到使用pooled
优化器:由于此Map更直接,因此如果还提供以下Hibernate配置属性,则可以切换到
pooled-lo
而不是pooled
:入池优化器
要使用pooled-lo优化器,实体标识符Map将如下所示:
要了解pooled-lo的工作原理,请查看下图:
如果您一直在使用传统的
hilo
优化器,则可能希望切换到使用pooled
或pooled-lo
,因为hilo
无法与其他客户端进行互操作,这些客户端可能不知道hilo
标识符分配策略。dxxyhpgq2#
同时,我的问题得到了答案。
当您在persistent.xml文件的
<properties>
部分中添加以下行时,hib将使用“pooled-lo”优化器。