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

Posted

技术标签:

【中文标题】如何在 Hibernate 中使用 pooled-lo 优化器【英文标题】:How to use the pooled-lo optimizer with Hibernate 【发布时间】:2014-10-01 23:08:25 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

这是 Hibernate 3.6.x 的正确属性名称。他们在 4.x 中对其进行了更改,后来我猜,这就是弗拉德的答案对我不起作用的原因。 +1【参考方案2】:

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 配置属性,则可以切换到 pooled-lo 而不是 pooled

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

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 优化器,您可能希望改用 pooledpooled-lo,因为 hilo 无法与可能不知道 hilo 的其他客户端互操作标识符分配策略。

【讨论】:

Starting with Hibernate 5, the pooled optimizer is used whenever you are setting the allocationSize attribute of the JPA @SequenceGenerator annotation to a value that's greater than 1. 默认分配大小如果为 50,那么它会选择池化优化器吗? @JavaLearner 如果使用默认分配大小 50,则还需要为数据库序列提供匹配的增量大小。否则,它将无法按预期工作。 Hibernate 试图找出这个问题并记录警告消息。

以上是关于如何在 Hibernate 中使用 pooled-lo 优化器的主要内容,如果未能解决你的问题,请参考以下文章

spring整合hibernate时出错(已经导入commons-dbcp2-2.1.1.jar和commons-pool2-2.1.jar)

如何在并行下载文件中正确使用“Pool”?

如何在 Python 中使用 multiprocessing.pool 创建全局锁/信号量?

多处理:如何在类中定义的函数上使用 Pool.map?

如何使用 Python 多处理 Pool.map 在 for 循环中填充 numpy 数组

如何在 Laravel 中测试 Http Pool?