生产环境调用存储过程时出现Hikari无法获取JDBC连接问题
生产环境独有问题排查求助
我在UAT环境及本地运行代码时均未遇到该问题,但此问题仅在生产环境出现,且已执行压力测试仍未复现该问题。
应用部署在外部Tomcat服务器,但服务使用Hikari连接池。我正尝试排查问题,但尚未找到任何线索。
相关Hikari连接池配置
spring.datasource.minimumIdle=1 spring.datasource.maximumPoolSize=10 spring.datasource.idleTimeout=600000 # 10 min spring.datasource.maxLifetime=1800000 # 30 min spring.datasource.connectionTimeout=3000 # 3 sec
核心业务代码
@Override public Response procedureCall(Message req) { EntityManager em = null; Session session = null; try { em = getWay4EntityManager(); em.getTransaction().begin(); session = em.unwrap(Session.class); Response response = session.doReturningWork(connection -> { try (CallableStatement function = connection.prepareCall(PROCEDURE)) { function.setString(1, req.getOperation().toString()); function.setString(2, req.getAction()); function.setString(3, req.getPun()); function.setString(4, req.getRequest()); function.setString(5, req.getEncryptedOpt()); function.setString(6, req.getOptStatus()); function.setString(7, req.getConfirmationId()); function.setString(8, req.getGenericStatusCode()); function.setString(9, req.getFailureStatus()); function.setString(10, req.getResponse()); function.setString(11, req.getSeq()); function.registerOutParameter(12, Types.VARCHAR); function.registerOutParameter(13, Types.VARCHAR); function.registerOutParameter(14, Types.VARCHAR); function.execute(); return Response.builder() .seq(function.getString(12)) .code(function.getString(13)) .desc(function.getString(14)) .build(); } }); return response; } catch (Exception e) { logger.error("Exception in procedure call", e); return Response.builder().code("500").desc("Sql Exception").build(); } finally { if (session != null && session.isOpen()) { session.close(); // safe to close here } if (em != null) { em.getTransaction().commit(); em.close(); } } }
内容的提问来源于stack exchange,提问作者Shahid Hussain
相关产品推荐
相关产品推荐

