当我第一次调用我的存储过程时,它会在几秒钟内执行。当我再次呼叫时,完全相同的方式,在说一分钟或2分钟后,大约需要3-5分钟!存储过程只是使用一些where子句进行普通的更新,没什么特别的。
我在这里看到了其他问题,其中存储过程第一次运行缓慢,后续运行速度更快,所以我的情况真让我困惑!
我在hibernate调试模式下运行应用程序,这似乎需要很长时间,第二次:你可以看到第一个和第二个调试语句之间有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();
}
});
编辑: 在进一步嗅探时,我注意到在对所讨论的存储过程的两次调用之间,让我们调用它,在循环中调用另一个存储的Proc(SP2)。而且只有当循环次数很高时才会遇到这个问题 - 超过400.如果我在说了5分钟左右后运行SP1,它似乎运行良好 - 不需要这么长时间。 (虽然没有计算出实际的阈值时间间隔,但之后问题不会发生。)