• 因工作需要将公司SSH项目改为Spingboot项目,将项目中部分需要调用存储过程的部分用entityManagerFactory.unwrap(SessionFactory.class).openSession()来获取Session实现后发现项目访问数据库超过十次就会挂掉,原因是Springboot连接池数量默认为10,猜测是每次访问数据库后连接未释放导致的,手动关闭session后问题解决。
  • 解决问题的过程中又发现了另外两种调用方式,
  1. 直接用EntityManager的createStoredProcedureQuery()方法调用 (推荐)
  2. 通过如下方式获取Session来调用,这种方式不需要手动关闭Session来释放连接,具体原因我也没搞明白,有知道的朋友欢迎指点

    Session session = entityManager.unwrap(Session.class);
  • 完整代码
  1. package com.hzjd.produre.repository;
  2. import javax.persistence.EntityManager;
  3. import javax.persistence.EntityManagerFactory;
  4. import javax.persistence.ParameterMode;
  5. import javax.persistence.PersistenceContext;
  6. import javax.persistence.StoredProcedureQuery;
  7. import org.hibernate.Session;
  8. import org.hibernate.SessionFactory;
  9. import org.hibernate.procedure.ProcedureCall;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.stereotype.Repository;
  12. import com.hzjd.produre.bean.QueryResponse;
  13. import com.hzjd.produre.utils.Assistant;
  14. @Repository
  15. public class ProdureDAO {
  16. public final static String PUBLIC_PAG_SYS_GETNEXTID = "PUBLIC_PAG.SYS_GETNEXTID";
  17. public final static String PSBC_QUERYBILL = "PSBCPAY.QUERYBILL";
  18. @PersistenceContext
  19. EntityManager entityManager;
  20. @Autowired
  21. EntityManagerFactory entityManagerFactory;
  22. public Session getSession() {
  23. return entityManagerFactory.unwrap(SessionFactory.class).openSession();
  24. }
  25. /**
  26. * 使用entityManager调用存储过程
  27. *
  28. * @param pay_ID
  29. * @return
  30. */
  31. public QueryResponse queryBill1(String pay_ID) throws Exception {
  32. QueryResponse queryResponse = new QueryResponse();
  33. StoredProcedureQuery call = entityManager.createStoredProcedureQuery(PSBC_QUERYBILL);
  34. call.registerStoredProcedureParameter(1, String.class, ParameterMode.IN).setParameter(1, pay_ID);
  35. call.registerStoredProcedureParameter(2, String.class, ParameterMode.OUT);
  36. call.registerStoredProcedureParameter(3, String.class, ParameterMode.OUT);
  37. call.registerStoredProcedureParameter(4, String.class, ParameterMode.OUT);
  38. call.registerStoredProcedureParameter(5, String.class, ParameterMode.OUT);
  39. call.registerStoredProcedureParameter(6, String.class, ParameterMode.OUT);
  40. call.registerStoredProcedureParameter(7, String.class, ParameterMode.OUT);
  41. call.registerStoredProcedureParameter(8, String.class, ParameterMode.OUT);
  42. call.registerStoredProcedureParameter(9, String.class, ParameterMode.OUT);
  43. call.registerStoredProcedureParameter(10, String.class, ParameterMode.OUT);
  44. call.execute();
  45. queryResponse.getBody().setPAY_ID(pay_ID);
  46. queryResponse.getBody().setCUSTNAME(Assistant.nullToEmpty(call.getOutputParameterValue(2)));
  47. queryResponse.getBody().setHOME_ADDR(Assistant.nullToEmpty(call.getOutputParameterValue(3)));
  48. queryResponse.getBody().setTRAN_AMT(Assistant.nullToEmpty(call.getOutputParameterValue(5)));
  49. queryResponse.getBody().setTOTAL_AMT(Assistant.nullToEmpty(call.getOutputParameterValue(6)));
  50. queryResponse.getBody().setBALANCE(Assistant.nullToEmpty(call.getOutputParameterValue(8)));
  51. int errorcode = Assistant.nullToInt(call.getOutputParameterValue(9));
  52. String errormsg = Assistant.nullToEmpty(call.getOutputParameterValue(10));
  53. if (errorcode == 0) {
  54. return queryResponse;
  55. } else {
  56. throw new Exception(errormsg);
  57. }
  58. }
  59. /**
  60. * 使用sessionFactory开启Session调用存储过程
  61. *
  62. * @param pay_ID
  63. * @return
  64. */
  65. public QueryResponse queryBill2(String pay_ID) throws Exception {
  66. QueryResponse queryResponse = new QueryResponse();
  67. // 调用完成后需关闭Session否则会出现连接失效
  68. try (Session session = getSession();) {
  69. ProcedureCall call = session.createStoredProcedureCall(PSBC_QUERYBILL);
  70. call.registerParameter(1, String.class, ParameterMode.IN).bindValue(pay_ID);
  71. call.registerParameter(2, String.class, ParameterMode.OUT);
  72. call.registerParameter(3, String.class, ParameterMode.OUT);
  73. call.registerParameter(4, String.class, ParameterMode.OUT);
  74. call.registerParameter(5, String.class, ParameterMode.OUT);
  75. call.registerParameter(6, String.class, ParameterMode.OUT);
  76. call.registerParameter(7, String.class, ParameterMode.OUT);
  77. call.registerParameter(8, String.class, ParameterMode.OUT);
  78. call.registerParameter(9, String.class, ParameterMode.OUT);
  79. call.registerParameter(10, String.class, ParameterMode.OUT);
  80. queryResponse.getBody().setPAY_ID(pay_ID);
  81. queryResponse.getBody().setCUSTNAME(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(2)));
  82. queryResponse.getBody().setHOME_ADDR(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(3)));
  83. queryResponse.getBody().setTRAN_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(5)));
  84. queryResponse.getBody().setTOTAL_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(6)));
  85. queryResponse.getBody().setBALANCE(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(8)));
  86. int errorcode = Assistant.nullToInt(call.getOutputs().getOutputParameterValue(9));
  87. String errormsg = Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(10));
  88. if (errorcode == 0) {
  89. return queryResponse;
  90. } else {
  91. throw new Exception(errormsg);
  92. }
  93. }
  94. }
  95. /**
  96. * 使用sessionFactory开启Session调用存储过程
  97. *
  98. * @param pay_ID
  99. * @return
  100. */
  101. public QueryResponse queryBill3(String pay_ID) throws Exception {
  102. QueryResponse queryResponse = new QueryResponse();
  103. Session session = entityManager.unwrap(Session.class);
  104. ProcedureCall call = session.createStoredProcedureCall(PSBC_QUERYBILL);
  105. call.registerParameter(1, String.class, ParameterMode.IN).bindValue(pay_ID);
  106. call.registerParameter(2, String.class, ParameterMode.OUT);
  107. call.registerParameter(3, String.class, ParameterMode.OUT);
  108. call.registerParameter(4, String.class, ParameterMode.OUT);
  109. call.registerParameter(5, String.class, ParameterMode.OUT);
  110. call.registerParameter(6, String.class, ParameterMode.OUT);
  111. call.registerParameter(7, String.class, ParameterMode.OUT);
  112. call.registerParameter(8, String.class, ParameterMode.OUT);
  113. call.registerParameter(9, String.class, ParameterMode.OUT);
  114. call.registerParameter(10, String.class, ParameterMode.OUT);
  115. queryResponse.getBody().setPAY_ID(pay_ID);
  116. queryResponse.getBody().setCUSTNAME(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(2)));
  117. queryResponse.getBody().setHOME_ADDR(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(3)));
  118. queryResponse.getBody().setTRAN_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(5)));
  119. queryResponse.getBody().setTOTAL_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(6)));
  120. queryResponse.getBody().setBALANCE(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(8)));
  121. int errorcode = Assistant.nullToInt(call.getOutputs().getOutputParameterValue(9));
  122. String errormsg = Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(10));
  123. if (errorcode == 0) {
  124. return queryResponse;
  125. } else {
  126. throw new Exception(errormsg);
  127. }
  128. }
  129. }

Springboot调用Oracle存储过程的几种方式的更多相关文章

  1. 123 c#调用oracle存储过程返回数据集 --通过oracle存储过程返回数据集

    c#调用oracle存储过程返回数据集 2008-12-20 10:59:57|  分类: net|字号 订阅   CREATE OR REPLACE PACKAGE pkg_tableTypeIS  ...

  2. Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例

    Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13|  分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...

  3. MyBatis调用Oracle存储过程

    MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...

  4. 调用sed命令的三种方式

    调用sed命令的三种方式 调用sed有三种方式,一种为Shell命令行方式,另外两种是将sed命令写入脚本文件,然后执行该脚本文件. 三种方式的命令格式归纳如下: 一.在Shell命令行输入命令调用s ...

  5. Java调用oracle存储过程通过游标返回临时表数据

    注:本文来源于 <  Java调用oracle存储过程通过游标返回临时表数据   > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...

  6. .Net 中读写Oracle数据库常用两种方式

    .net中连接Oracle 的两种方式:OracleClient,OleDb转载 2015年04月24日 00:00:24 10820.Net 中读写Oracle数据库常用两种方式:OracleCli ...

  7. plsql 连接oracle数据库的2种方式

      plsql 连接oracle数据库的2种方式 CreationTime--2018年8月10日09点50分 Author:Marydon 方式一:配置tnsnames.ora 该文件在instan ...

  8. C#调用Oracle存储过程

    C#调用Oracle存储过程的代码如下所示: using System; using System.Collections.Generic; using System.Collections.Obje ...

  9. C#调用 oracle存储过程

    C#调用oracle 存储过程与调用Sql server存储过程类似,比较简单:直接给出示例: /// <summary> /// 判断物料类型是不是总部管控 /// </summa ...

随机推荐

  1. 享元模式(c++实现)

    享元模式 目录 享元模式 模式定义 模式动机 UML类图 源码实现 优点 缺点 模式定义 享元模式(Flyweight),运用共享技术有效的支持大量细粒度的对象. 模式动机 如果一个应用使用了大量的对 ...

  2. [spring] -- bean作用域跟生命周期篇

    作用域 singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的. prototype : 每次请求都会创建一个新的 bean 实例. request : 每一次HT ...

  3. python下载及安装方法

    打开 http://www.python.org   找到Downlodas 点击windows   下载安装

  4. springboot+redis做事件过期通知业务

    springboot+redis做事件过期通知 博主也是初次体验,不足之处多多指教 我的业务场景 系统管理员要给维护员分配巡查路口设施的工作,由于路口比较多,管理员不知道哪些路口已经被分配了,况且过了 ...

  5. EOJ Monthly 2019.11 A(进制转换)

    "欢迎您乘坐东方航空公司航班 MU5692 由银川前往上海......" "我们的飞机很快就要起飞了,请收起小桌板,摘下耳机......" 收起了小桌板,摘下了 ...

  6. 如何消灭飞机的“黑色十分钟”,AI来帮忙

    近年来,“AI的应用和落地”逐渐成了具化的关键词,它和很多事物很多行业结合在一起,形成了奇妙的“化学反应”.例如,在日常生活中,AI可以推送我们喜欢的新闻或视频,可以在拍照的时候识别场景提升照片的美感 ...

  7. 关系数据可视化gephi

    表示对象之间的关系,可通过gephi软件实现,软件下载官方地址https://gephi.org/users/download/ 如何来表示两个对象之间的关系? 把对象变成点,点的大小.颜色可以是它的 ...

  8. js原声代码 轮播图

    js轮播图 html部分:建立div,内嵌img标签,可以设置大小, <!doctype html> <html> <head> <meta charset= ...

  9. Azure AD(五)使用多租户应用程序模式让任何 Azure Active Directory 用户登录

    一,引言 距离上次分享关于 “Azure AD" 的知识过去差不多2个多月了, 今天最近刚好也是学习,分享一下关于Azure AD 使用多租户应用程序模式让任何 Azure Active D ...

  10. PHP date_interval_format() 函数

    ------------恢复内容开始------------ 计算两个日期间的间隔,然后格式化时间间隔: 实例 <?php $date1=date_create("2013-01-01 ...