JBoss编写的语句太慢

时间:2017-01-19 23:01:12

标签: java hibernate jpa orm jboss

我有一个问题,想得到一些帮助。
我从Java运行查询。

SELECT DISTINCT field1, field1
from tblTableA WITH (NOLOCK)
WHERE criteriaField='CONSTANT TEXT'

我用jpa

运行它
  Query qry = entMgr.createNativeQuery(myQry) ;
  List sqlResult = qry.getResultList() ;

现在,qry.getResultList()需要花费太多时间才能运行 - 75秒或更长时间。是的,它返回接近70万条记录,但在Weblogic 10上运行相同的查询,使用ejb2在不到5秒的时间内运行

任何人都可以帮助解决这个问题,似乎可能是我缺少的配置,或者我没有遵循的技术。

有一些因使用而引起的 jbosscmp-jdbc.xml。 我在设置中没有这个,但发现我们可以配置一个延迟加载功能。现在,我不确定如何在xml文件中配置我正在运行的查询。 此外,这可以与注释一起使用而不是xml文件吗?

2 个答案:

答案 0 :(得分:1)

我会尝试在非事务性方法中运行此查询:

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
List getResults(..){
   Query qry = entMgr.createNativeQuery(myQry) ;
   return qry.getResultList() ;
}

有时根据环境不允许这样做,并且主要用于优化期望具有大型结果集的查询,以及稍后将由PersistenceContext管理(所以基本上当您使用HQL而不是本机时)

但我会尝试一下。

答案 1 :(得分:1)

您正在事务范围内执行此选择查询。我在Jboos的网站上找到了一个旧的JIRA ticket。如票证所示,flush附近有潜力。如果使用EJB3执行查询,则会对使用本机查询检索的所有对象自动执行或尝试flush。这个想法似乎是避免从数据库中获取过时的对象。但在你的情况下,它不适用。将刷新模式设置为COMMIT,并查看性能是否有所改善。

query.setFlushMode( FlushModeType.COMMIT );

同时关闭Hibernate日志记录,看看是否有任何区别。