我有一个springboot应用程序,该应用程序非常频繁地调用存储过程,该过程执行一些插入操作并更新一些表。我可以看到这段代码在功能上是可行的,但是过了一会儿我可以打开更多的连接,并且不能满足运行任何查询的任何新请求,并且不会出现错误
'Timeout: Pool empty. Unable to fetch a connection in 30 seconds, none available[size:100; busy:100; idle:0; lastwait:30000].","logger_name":"org.hibernate.engine.jdbc.spi.SqlExceptionHelper"'
下面是调用存储过程的代码,我也尝试使用实体管理器更改为其他实现,但结果相同
将感谢您对此问题的任何想法,如果未提及任何内容,也请通知我。
@Transactional
private Status bulkSaveOrderInterfaceStatus(String procName,String orderIds,
interfaceType, String errorMsg, String status) {
String outPutPram;
try(Session session = (Session) em.getDelegate()) {
SessionFactoryImplementor sessionFactory = (SessionFactoryImplementor) session.getSessionFactory();
Session ses = sessionFactory.openSession();
ses.beginTransaction();
ProcedureCall storedProcedure = ses.createStoredProcedureCall(procName);
storedProcedure.registerParameter(SqlConstants.BULK_INS_PROCEDURE_ORDERID_INPUTPARM, String.class, ParameterMode.IN).bindValue(orderIds);
storedProcedure.registerParameter(SqlConstants.BULK_INS_PROCEDURE_INTERFACETYPE_INPUTPARM,String.class, ParameterMode.IN).bindValue(interfaceType);
storedProcedure.registerParameter(SqlConstants.BULK_INS_PROCEDURE_ERRORMSG_INPUTPARM,String.class, ParameterMode.IN).bindValue(errorMsg);
storedProcedure.registerParameter(SqlConstants.BULK_INS_PROCEDURE_STATUS_INPUTPARM,String.class, ParameterMode.IN).bindValue(status);
storedProcedure.registerParameter(SqlConstants.PROCEDURE_OUTPUT_MESSAGE, String.class, ParameterMode.OUT);
outPutPram = (String) storedProcedure.getOutputs().getOutputParameterValue(SqlConstants.PROCEDURE_OUTPUT_MESSAGE);
ses.getTransaction().commit();
if (outPutPram.equals(SqlConstants.PROCEDURE_STATUS_SUCCESS)) {
return Status.SUCCESS;
} else {
return Status.ERROR;
}
} catch (Exception e) {
return Status.ERROR;
}
}
答案 0 :(得分:0)
我认为您应该关闭会话,最好还是结束会话,或者使用try with resource语句。
finally {
ses.close();
}