我遇到的问题是我批量中有很多类似的查询:
select id, a, b, c from records where a = 1 and b = 2
select id, a, b, c from records where a = 5 and b = 3
select id, a, b, c from records where a = 2 and b = 5
select id, a, b, c from records where a = 3 and b = 4
...
一个批处理通常由 1000 个查询组成,大约需要 0.5 秒才能完成,其中 a 和 b 都有索引。自动提交已打开,所有连接都在boncp连接池中管理。 Hibernate 用于将每个结果映射到一个对象实例。
我的问题是:
1.如果我将它们组合在一个查询中,即使所有数据库连接都是事件的并且服务不需要等待连接建立,会有什么不同吗?
2. 如果是,在 hibernate 状态下执行此操作的最佳实践是什么?
3. 如果不是,尽管连接池只允许同时执行一定数量的查询,但如果我同时执行所有查询(而不是在当前情况下一个一个地执行),会有什么不同吗?
最佳答案
Hibernate 提供了一些在加载关联实体(BATCH、JOIN、SUBSELECT)时优化获取检索的策略,但对于 HQL/JPQL,您最多只能生成使用 native 查询完成的查询。
您需要禁用自动提交。这与 Hibernate 后写事务处理效果不佳,而且还会影响性能。
由于您使用的是 MySQL,因此您可以尝试创建一个 IN query像这样:
select id, a, b, c from records where (a, b) IN ((1, 2), (5, 3), (2, 5), (3, 4))
如果您对获取实体(用于更新/删除它们)不感兴趣并且只需要一个投影(id、a、b、c),那么 native 查询是比 HQL 查询更好的选择(假设 MySQLDialect 甚至支持此语法)。
我不会同时执行这些操作。 CP 锁争用将成为您的下一个瓶颈,对于仅索引扫描,单个 IN 查询将比许多小查询执行得更好。
关于mysql - 针对多个相似选择查询的 Hibernate 性能调优,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24947569/