Hibernate + Java 上的性能较慢,但当我使用具有相同本机 Oracle 查询的 TOAD 时速度很快

2022-09-03 15:50:36

我在 Oracle 上检测到休眠和本机查询存在性能问题。当我在TOAD上执行具有多个参数的复杂SQL查询时,我以毫秒为单位获得结果。但是,当我使用Hibernate执行相同的查询时,这个时间会大大增加(最多四秒甚至更长时间)。

我的SQL查询相当复杂,返回一个唯一值(因此,问题与输入类所需的时间无关),并且它包含几个格式为“:nameParameter”的参数。此查询存储在字符串中。例如

String myNamedNativeQuery = "select count(*) from tables "+
                            "where column1 = :nameParameter1 "+ 
                            "and column2 = :nameParameter2";  
                            //actually my sentence is much more complex!!

当我在TOAD上执行句子时,它在几毫秒内就解决了。但是将这句话与Hibernate一起使用

SQLQuery query = session.createSQLQuery("myNamedNativeQuery");

query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);

query.uniqueResult(); 

需要几秒钟才能得到相同的结果。

我意识到,如果我直接在本机查询上替换参数,然后使用Hibernate执行句子,时间就会大大减少。它将是这样的:

String strQuery = session.getNamedQuery("myNamedNativeQuery").getQueryString();

myNamedNativeQuery = myNamedNativeQuery.replace("nameParameter1", value1);
myNamedNativeQuery = myNamedNativeQuery.replace("nameParameter2", value2);

SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.uniqueResult(); 

有人知道发生了什么吗??

提前致谢。

PS:Oracle版本是9i和Hibernate 3.2


答案 1

我认为这段代码发生了什么:

SQLQuery query = session.createSQLQuery("myNamedNativeQuery");
query.setParameter(nameParameter1, value1);
query.setParameter(nameParameter2, value2);
query.uniqueResult(); 

是这样的:

在第 1 行 :根据命名参数的一些预期值创建查询计划。

在第 4 行 :查询使用 value1 和 value2 执行,但是对于在第 1 行中详细阐述的查询计划,这些值不是“好值”,因此,数据库正在为实际值执行非常不合适的计划,并且需要花费大量时间。

为什么?

查看源代码,我发现了这行代码:HibernateSessionImpl.createSQLQuery(...)

SQLQueryImpl query = new SQLQueryImpl(
                sql,
                        this,
                        factory.getQueryPlanCache().getSQLParameterMetadata( sql )
        );

它使用一些参数MetaData进行调用。我假设这个元数据还不够好getQueryPlanCache()


答案 2

我对你的回答是:

删除所有绑定参数并使用无状态会话而不是会话

使用 SQLQuery 而不是具有完整 SQL(包括参数值)的查询

StatelessSession session = sessionFactory.openStatelessSession();

我有类似的问题,直到我得到更好的解决方案,这就是我设法使它工作的原因。请参阅休眠参数化 sql 查询慢速和活动的 oracle 会话


推荐