是什么让Hibernate / Oracle变慢了?

时间:2019-05-29 08:51:41

标签: java oracle hibernate

我有一个在Windows服务器上运行的Java应用程序。该应用程序通过Hibernate查询Oracle 10数据库。我有一个查询,取回215个实体的集合,每个实体有6个字符串字段。将它们恢复原状大约需要20秒钟(该统计数据来自休眠统计数据)

我取回了由hibernate生成的sql,并通过SQLPlus运行它,运行时间在300-500ms之间。

我使用ojdbc驱动程序启动了H2控制台(与我的应用程序使用的相同),并连接到我的数据库(与运行应用程序的计算机相同,以避免网络问题),运行了从Hibernate获得的sql多次,与SQLPlus相同的300-500ms运行时间,所以我想我的问题来自Hibernate,但我不知道在哪里查找。

该数据库位于另一台服务器上,但是我对该服务器执行了<1ms ping操作,因此我不认为涉及网络。

我的配置:

javax.persistence.jdbc.driver=oracle.jdbc.driver.OracleDriver
javax.persistence.jdbc.url=jdbc:oracle:thin:@xxxxx
javax.persistence.jdbc.user=xxxxx
javax.persistence.jdbc.password=xxxxx
hibernate.ejb.naming_strategy=org.nuiton.jpa.hibernate.OracleCompliantImprovedNamingStrategy
hibernate.dialect=xxxx.MyDialect

hibernate.hbm2ddl.auto=update
hibernate.show_sql=false
hibernate.use_sql_comments=false
hibernate.format_sql=true
hibernate.ejb.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy

hibernate.c3p0.min_size=3
hibernate.c3p0.max_size=5
hibernate.c3p0.timeout=1800
hibernate.c3p0.max_statements=50

hibernate.generate_statistics = false

命名策略:https://gitlab.nuiton.org/retired/nuiton-jpa/blob/develop/nuiton-jpa-hibernate/src/main/java/org/nuiton/jpa/hibernate/OracleCompliantImprovedNamingStrategy.java

方言:

public class MyDialect extends Oracle10gDialect {

    public MyDialect() {
        super();
        registerColumnType(Types.DOUBLE, "number");
    }

}

1 个答案:

答案 0 :(得分:0)

回到我的问题以提供我长期寻找的答案。

正如@AmitNaik指出的那样,我的问题来自未设置的访存大小,因此使用了默认的大小(10)。我试图在休眠参数中设置其他值,但是没有运气。看来在我的Hibernate版本中,我的entityManagerFactory中未考虑该参数(为什么?)。因此,我必须在特定查询中设置提取大小,这解决了我的问题(现在,我的测试用例大约为600毫秒)。正如@ john16384所说,我现在必须调查我的SQL查询,但这是另一回事。