从java springboot程序池中调用存储过程为空错误

时间:2019-03-16 00:07:25

标签: java

我有一个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;
    } 

}

1 个答案:

答案 0 :(得分:0)

我认为您应该关闭会话,最好还是结束会话,或者使用try with resource语句。

 finally {
     ses.close(); 
  }