JPA / Hibernate比使用简单JDBC慢50%

时间:2015-01-09 09:51:22

标签: spring performance jpa slowdown

首先,我想说我是JPA和Hibernate的专家。但是我遇到了一些我完全陷入困境的事情,因为我不知道事情是如何运作的,并且不知道如何调试它。

我有一个webapp(Spring + JPA2.0)。我有一个算法,用于计算来自PostrgeSQL数据库的数据的用户得分。为了测试算法的速度,我已经对1个用户进行了计算。

花了72秒。 (我发现这次有点奇怪,因为我知道它不应该花那么长时间)

所以我所做的是通过简单JDBC连接(conn = DriverManager.getConnection(url, props);))替换数据库调用(entityManger.createQuery(...)),我从数据库中提取数据而不使用JPA。

计算同一用户的得分需要35秒......

使用JPA使计算 50%变慢是否正常?我的意思是我会认为是时候会是"有点"不仅仅是使用jdbc,而是 50% ??

是否有任何我不知道的配置可以解释这种差异?

这是算法的伪代码。 calculateScore在循环中调用2000次:

public double calculateScore(userId, placeId) {

//This returns in average 5 columns
List<Object[]> datas = entityManager.createNativeQuery("SELECT info1, info2, info3 WHERE user_id=.. and place_id=...").getResultList();
..
..
for (Object[] result : datas) {
 info1 = result[0] // Integer
 info2 = result[1] // Integer
 info3 = result[2] // Double

 if (info3 == null) {
     info3 = calculateMissing(..)
 }

 .. calculation ..

 return result
}

private double calculateMissing(..) {

    //this query returns maximum 20 rows 
    List<Double> data =  entityManager.createNativeQuery("SELECT info FROM..."). getResultList;


    //So here we could have UP TO 20 call to the db
    while(some cond) {
       data2 =  entityManager.createNativeQuery("SELECT * FROM...).getOne()
       if (data2 ..)
         cond = false
      ..
      }

    ... calculation ..

   return result;
}

所以这是我的&#34;三&#34;很少选择DB。

编辑1

我已经尝试缩小&#34;确切地&#34;问题是。我已经逐个替换了从jdbc到JPA的调用。并且似乎while循环是使50%(几乎)时间损失的循环。从一开始做dis就是一个非常糟糕的主意,但我并不知道JPA不会喜欢这个。

我已经用更智能的SQL查询替换了while循环。现在算法运行<15秒而不是70秒!

在12秒内,而不是JDB版本的35秒。

2 个答案:

答案 0 :(得分:0)

在按主键检索记录时,我在JPA / Hibernate和JDBC之间经历了非常大的差异。

如果它是平面物体模型,则差异可能特别大。随着模型复杂性的增加,性能变得更加均匀。

另外,考虑使用JPA意味着在应用程序启动时创建连接池(JDBC不需要这样做),因此使用JPA时,第一个特殊事务可能比使用JDBC需要更长时间。

答案 1 :(得分:0)

根据我的经验,hibernate / jdbc之间的速度差异似乎对小型查询很重要。另一方面,当您尝试使用大量结果时,性能非常相似。

在实际使用中确实不错。小查询仍然足够快运行。长时间运行的查询(应该是您主要关注的问题)具有类似的性能。