针对多个类似的选择查询的Hibernate性能调优

时间:2014-07-25 03:30:05

标签: mysql sql performance hibernate jpa

我遇到的问题是我批量处理了很多类似的问题:

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>

1 个答案:

答案 0 :(得分:1)

Hibernate提供了一些在加载关联实体(BATCH,JOIN,SUBSELECT)时优化提取检索的策略,但对于HQL / JPQL,您最多只能生成使用本机查询完成的查询。

  1. 您需要禁用自动提交。这与Hibernate后写交易的效果不佳,也会影响性能。

  2. 由于您使用的是MySQL,您可以尝试创建一个IN query,如下所示:

    select id, a, b, c 
    from records 
    where (a, b) IN ((1, 2), (5, 3), (2, 5), (3, 4))
    
  3. 如果您对获取实体(更新/删除它们)不感兴趣并且您只需要一个投影(id,a,b,c),那么本机查询是比HQL更好的选择(假设MySQLDialect甚至支持这种语法。)

  4. 我不会同时执行这些操作。 CP锁定争用将成为您的下一个瓶颈,对于仅索引扫描,单个IN查询将比许多小型查询执行得更好。