JBoss准备的声明太慢了

问题描述 投票:1回答:2

我有一个问题,想得到一些帮助。 我有从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文件一起使用吗?

java hibernate jpa orm jboss
2个回答
1
投票

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

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

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

但我会尝试一下。


1
投票

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

query.setFlushMode( FlushModeType.COMMIT );

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

© www.soinside.com 2019 - 2024. All rights reserved.