我遇到的问题是我批量处理了很多类似的问题:
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已编入索引。自动提交已启用,所有连接都在bonecp连接池中进行管理。 Hibernate用于将每个结果映射到对象实例。
我的问题是:
1.如果我将它们组合在一个查询中,即使所有数据库连接都是实时的,服务也不需要等待连接建立,它会有所作为吗?
2.如果是,那么在冬眠中做到这一点的最佳做法是什么?
3.如果没有,如果我同时执行所有查询(而不是在当前情况下逐个执行)会不会有所不同,尽管连接池只允许同时执行一定数量的查询? / p>
答案 0 :(得分:1)
Hibernate提供了一些在加载关联实体(BATCH,JOIN,SUBSELECT)时优化提取检索的策略,但对于HQL / JPQL,您最多只能生成使用本机查询完成的查询。
您需要禁用自动提交。这与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),那么本机查询是比HQL更好的选择(假设MySQLDialect甚至支持这种语法。)
我不会同时执行这些操作。 CP锁定争用将成为您的下一个瓶颈,对于仅索引扫描,单个IN查询将比许多小型查询执行得更好。