oracle – 如何避免这种非常繁重的查询会降低应用程序的速度?

我们有一个在生产环境中运行的Web应用程序,在某些时候客户抱怨应用程序有多慢.

当我们检查应用程序和数据库发生了什么时,我们发现了几个用户同时执行的这个“宝贵”查询(从而在数据库服务器上造成了极高的负载):

SELECT   NULL AS table_cat,
         o.owner AS table_schem,
         o.object_name AS table_name,
         o.object_type AS table_type,
         NULL AS remarks
FROM     all_objects o
WHERE    o.owner LIKE :1 ESCAPE :"SYS_B_0" AND
         o.object_name LIKE :2 ESCAPE :"SYS_B_1" AND
         o.object_type IN(:"SYS_B_2", :"SYS_B_3")
ORDER BY table_type, table_schem, table_name

我们的应用程序不执行此查询,我相信它是一个Hibernate内部查询.我发现很少有关于为什么Hibernate会执行这个极其繁重的查询的信息,所以任何有关如何避免它的帮助都非常感谢!

生产环境信息:Red Hat Enterprise Linux 5.3(Tikanga),JDK 1.5,Web容器OC4J(whitin Oracle Application Server),Oracle Database 10.1.0.4,JDK 1.2和1.3的JDBC驱动程序,Hibernate版本3.2.6.ga,连接池库C3P0版本0.9.1.

更新:感谢@BalusC for claryfing确实是Hibernate执行查询,现在我对正在发生的事情有了更好的了解.我将解释我们处理hibernate会话的方式(这是非常基本的,如果你有关于如何更好地处理它的建议,我们非常欢迎!)

我们有一个过滤器(实现javax.servlet.Filter),当它启动时(init方法)它构造会话工厂(通常这只发生一次).然后,进入应用程序的每个HttpRequest都会通过过滤器并获得一个新会话并启动一个事务.当它结束的过程时,它通过过滤器返回,进行事务的提交,杀死hibernate会话,然后继续前进页面(我们不在Http会话中存储hibernate会话,因为它在我们的测试).

现在这里是我认为问题所在的部分.在我们的开发环境中,我们在Tomcat 5.5中部署我们的应用程序,当我们启动服务时,所有过滤器都会立即启动,只启动一次.在使用OC4J的生产环境中似乎没有这样的方式.我们部署应用程序,并且只有在第一个请求到达时,OC4J才会实例化过滤器.

这让我认为OC4J在每个请求上实例化过滤器(或者至少多次,这仍然是错误的),从而在每个请求上创建会话工厂,执行%&%#%$#查询,这导致我的问题!

现在,这是正确的吗?有没有办法让我配置OC4J才能实例化一次过滤器?

非常感谢大家花时间回复此事!

最佳答案
它确实来自Hibernate,特别是org.hibernate.tool.hbm2ddl.TableMetadata.每个都用于验证模式(表和列映射).显然,它不必要地在每个生成的请求或会话上执行,而不是仅在应用程序启动期间执行一次.例如,您是否在每个请求或会话上不必要地调用Hibernate Configurator?

转载注明原文:oracle – 如何避免这种非常繁重的查询会降低应用程序的速度? - 代码日志