我有一个运行使用JPA的EAR的JBoss 7.1.1。通过JPA批注,我使用了映射到GenerationType.Table
的策略org.hibernate.id.enhanced.TableGenerator
。
有谁知道使用“pooled-lo”优化器时如何配置persistence.xml
?
最佳答案
TABLE生成器是一个糟糕的选择
现在,在我开始解释如何配置pooled
或pooled-lo
优化器之前,您应该知道TABLE
生成器是一个糟糕的选择,因为它的运行速度不仅慢了10倍,而且由于它需要额外的连接,因此它可能会阻塞数据库连接池获取标识符。
另外,由于它使用行级锁来分配下一个标识符,因此可能导致应用程序出现瓶颈。有关 TABLE
生成器危险的更多详细信息。
基于序列的优化器
从Hibernate 5开始,只要将JPA pooled
批注的allocationSize
属性设置为大于@SequenceGenerator
的值,就会使用1
优化器。
值得注意的是,pooled
和pooled-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;
由于此映射更直接,因此,如果您还提供以下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优化器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25204019/