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

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

最佳答案

TABLE生成器是一个糟糕的选择
现在,在我开始解释如何配置pooledpooled-lo优化器之前,您应该知道TABLE生成器是一个糟糕的选择,因为它的运行速度不仅慢了10倍,而且由于它需要额外的连接,因此它可能会阻塞数据库连接池获取标识符。
另外,由于它使用行级锁来分配下一个标识符,因此可能导致应用程序出现瓶颈。有关 TABLE 生成器危险的更多详细信息。
基于序列的优化器
从Hibernate 5开始,只要将JPA pooled批注的allocationSize属性设置为大于@SequenceGenerator的值,就会使用1优化器。

值得注意的是,pooledpooled-lo优化器仅可用于SEQUENCE和TABLE生成器,因为这些优化器的目标是减少获取下一个实体标识符所需的数据库往返次数。
池优化器pooled优化器很容易设置。您所需要做的就是设置JPA allocationSize批注的@SequenceGenerator,Hibernate将切换到使用pooled优化器:

@Id
@GeneratedValue(
    strategy = GenerationType.SEQUENCE,
    generator = "post_sequence"
)
@SequenceGenerator(
    name = "post_sequence",
    sequenceName = "post_sequence",
    allocationSize = 3
)
private Long id;
java - 如何在Hibernate中使用pooled-lo优化器-LMLPHP
由于此映射更直接,因此,如果您还提供以下Hibernate配置属性,则可以切换到pooled-lo而不是pooled:
<property name="hibernate.id.optimizer.pooled.preferred" value="pooled-lo" />
Pool-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的工作原理,请查看以下图表:
java - 如何在Hibernate中使用pooled-lo优化器-LMLPHP

关于java - 如何在Hibernate中使用pooled-lo优化器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25204019/

10-12 16:03