我有一个问题,想得到一些帮助。
我从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文件吗?
答案 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日志记录,看看是否有任何区别。