我有一个问题,想得到一些帮助。 我有从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文件一起使用吗?
我会尝试在非事务性方法中运行此查询:
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
List getResults(..){
Query qry = entMgr.createNativeQuery(myQry) ;
return qry.getResultList() ;
}
这有时不允许取决于环境,主要用于优化期望具有大型结果集的查询,以及稍后将由PersistenceContext管理(所以基本上当您使用HQL而不是本机时)
但我会尝试一下。
您正在事务范围内执行此选择查询。我在Jboos的网站上找到了一个旧的JIRA ticket。如门票所示,flush
周围有潜力。如果使用EJB3
执行查询,则会对使用本机查询检索的所有对象自动执行或尝试flush
。这个想法似乎是避免从数据库中获取过时的对象。但在你的情况下,它不适用。将刷新模式设置为COMMIT
and,看看性能是否有所改善。
query.setFlushMode( FlushModeType.COMMIT );
同时关闭Hibernate日志记录,看看是否有任何区别。