1

当我第一次调用我的存储过程时,它会在几秒钟内执行。当我再次调用它时,完全相同的方式,说一两分钟后,大约需要 3-5 分钟!存储过程只是使用一些 where 子句进行普通更新,没什么特别的。

我在这里看到了其他问题,存储过程第一次运行缓慢,随后运行更快,所以我的情况真的让我很困惑!

我在休眠调试模式下运行应用程序,这似乎需要很长时间,第二次:您可以看到第一个和第二个调试语句之间有 3 分钟的间隔

........ //binding of other named parameters
17 Sep 2013 17:06:38,287 | DEBUG | org.hibernate.engine.query.NativeSQLQueryPlan [139] | bindNamedParameters() ABC111 -> productName [1]
17 Sep 2013 17:09:39,051 | DEBUG | org.hibernate.jdbc.AbstractBatcher [418] | about to close PreparedStatement (open PreparedStatements: 1, globally: 1)

这是我如何调用我的存储过程:

StringBuilder query = new StringBuilder();
query.append("{call ").append(Constants.StoreProcedures.UPDATE_ORDER_STATUS)
     .append("(:productName, :prodNumber, ")
     //other parameters
     .append(")} ");

final String queryStr = query.toString();
Object obj = super.getJpaTemplate().execute(new JpaCallback() {
    public Object doInJpa(EntityManager em) throws PersistenceException {
        Query query = em.createNativeQuery(queryStr);
        query.setParameter("productName", prodBean.getProductName());
        query.setParameter("prodNumber", prodBean.getProdNumber());
        //other parameters
        return query.executeUpdate();
    }
});

编辑:在进一步嗅探时,我注意到在对相关存储过程的两次调用之间,我们将其称为 SP1,另一个存储过程(SP2)在循环中被调用。只有当循环数很高 - 超过 400 时,我才会遇到这个问题。如果我在 5 分钟左右后运行 SP1,它似乎运行良好 - 不需要这么长时间。(虽然还没有弄清楚实际的阈值时间间隔,之后问题就不会发生。)

4

0 回答 0