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

    Session session = entityManager.unwrap(Session.class);
  • 完整代码
package com.hzjd.produre.repository;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.ParameterMode;
import javax.persistence.PersistenceContext;
import javax.persistence.StoredProcedureQuery; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.procedure.ProcedureCall;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository; import com.hzjd.produre.bean.QueryResponse;
import com.hzjd.produre.utils.Assistant; @Repository
public class ProdureDAO {
public final static String PUBLIC_PAG_SYS_GETNEXTID = "PUBLIC_PAG.SYS_GETNEXTID";
public final static String PSBC_QUERYBILL = "PSBCPAY.QUERYBILL";
@PersistenceContext
EntityManager entityManager;
@Autowired
EntityManagerFactory entityManagerFactory; public Session getSession() {
return entityManagerFactory.unwrap(SessionFactory.class).openSession();
} /**
* 使用entityManager调用存储过程
*
* @param pay_ID
* @return
*/
public QueryResponse queryBill1(String pay_ID) throws Exception {
QueryResponse queryResponse = new QueryResponse();
StoredProcedureQuery call = entityManager.createStoredProcedureQuery(PSBC_QUERYBILL);
call.registerStoredProcedureParameter(1, String.class, ParameterMode.IN).setParameter(1, pay_ID);
call.registerStoredProcedureParameter(2, String.class, ParameterMode.OUT);
call.registerStoredProcedureParameter(3, String.class, ParameterMode.OUT);
call.registerStoredProcedureParameter(4, String.class, ParameterMode.OUT);
call.registerStoredProcedureParameter(5, String.class, ParameterMode.OUT);
call.registerStoredProcedureParameter(6, String.class, ParameterMode.OUT);
call.registerStoredProcedureParameter(7, String.class, ParameterMode.OUT);
call.registerStoredProcedureParameter(8, String.class, ParameterMode.OUT);
call.registerStoredProcedureParameter(9, String.class, ParameterMode.OUT);
call.registerStoredProcedureParameter(10, String.class, ParameterMode.OUT);
call.execute();
queryResponse.getBody().setPAY_ID(pay_ID);
queryResponse.getBody().setCUSTNAME(Assistant.nullToEmpty(call.getOutputParameterValue(2)));
queryResponse.getBody().setHOME_ADDR(Assistant.nullToEmpty(call.getOutputParameterValue(3)));
queryResponse.getBody().setTRAN_AMT(Assistant.nullToEmpty(call.getOutputParameterValue(5)));
queryResponse.getBody().setTOTAL_AMT(Assistant.nullToEmpty(call.getOutputParameterValue(6)));
queryResponse.getBody().setBALANCE(Assistant.nullToEmpty(call.getOutputParameterValue(8)));
int errorcode = Assistant.nullToInt(call.getOutputParameterValue(9));
String errormsg = Assistant.nullToEmpty(call.getOutputParameterValue(10));
if (errorcode == 0) {
return queryResponse;
} else {
throw new Exception(errormsg);
}
} /**
* 使用sessionFactory开启Session调用存储过程
*
* @param pay_ID
* @return
*/
public QueryResponse queryBill2(String pay_ID) throws Exception {
QueryResponse queryResponse = new QueryResponse();
// 调用完成后需关闭Session否则会出现连接失效
try (Session session = getSession();) {
ProcedureCall call = session.createStoredProcedureCall(PSBC_QUERYBILL);
call.registerParameter(1, String.class, ParameterMode.IN).bindValue(pay_ID);
call.registerParameter(2, String.class, ParameterMode.OUT);
call.registerParameter(3, String.class, ParameterMode.OUT);
call.registerParameter(4, String.class, ParameterMode.OUT);
call.registerParameter(5, String.class, ParameterMode.OUT);
call.registerParameter(6, String.class, ParameterMode.OUT);
call.registerParameter(7, String.class, ParameterMode.OUT);
call.registerParameter(8, String.class, ParameterMode.OUT);
call.registerParameter(9, String.class, ParameterMode.OUT);
call.registerParameter(10, String.class, ParameterMode.OUT);
queryResponse.getBody().setPAY_ID(pay_ID);
queryResponse.getBody().setCUSTNAME(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(2)));
queryResponse.getBody().setHOME_ADDR(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(3)));
queryResponse.getBody().setTRAN_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(5)));
queryResponse.getBody().setTOTAL_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(6)));
queryResponse.getBody().setBALANCE(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(8)));
int errorcode = Assistant.nullToInt(call.getOutputs().getOutputParameterValue(9));
String errormsg = Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(10));
if (errorcode == 0) {
return queryResponse;
} else {
throw new Exception(errormsg);
}
}
} /**
* 使用sessionFactory开启Session调用存储过程
*
* @param pay_ID
* @return
*/
public QueryResponse queryBill3(String pay_ID) throws Exception {
QueryResponse queryResponse = new QueryResponse();
Session session = entityManager.unwrap(Session.class);
ProcedureCall call = session.createStoredProcedureCall(PSBC_QUERYBILL);
call.registerParameter(1, String.class, ParameterMode.IN).bindValue(pay_ID);
call.registerParameter(2, String.class, ParameterMode.OUT);
call.registerParameter(3, String.class, ParameterMode.OUT);
call.registerParameter(4, String.class, ParameterMode.OUT);
call.registerParameter(5, String.class, ParameterMode.OUT);
call.registerParameter(6, String.class, ParameterMode.OUT);
call.registerParameter(7, String.class, ParameterMode.OUT);
call.registerParameter(8, String.class, ParameterMode.OUT);
call.registerParameter(9, String.class, ParameterMode.OUT);
call.registerParameter(10, String.class, ParameterMode.OUT);
queryResponse.getBody().setPAY_ID(pay_ID);
queryResponse.getBody().setCUSTNAME(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(2)));
queryResponse.getBody().setHOME_ADDR(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(3)));
queryResponse.getBody().setTRAN_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(5)));
queryResponse.getBody().setTOTAL_AMT(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(6)));
queryResponse.getBody().setBALANCE(Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(8)));
int errorcode = Assistant.nullToInt(call.getOutputs().getOutputParameterValue(9));
String errormsg = Assistant.nullToEmpty(call.getOutputs().getOutputParameterValue(10));
if (errorcode == 0) {
return queryResponse;
} else {
throw new Exception(errormsg);
}
}
}

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++语法小记---函数模板

    函数模板 函数模板的目的是代码复用 普通函数和模板函数可以形成重载,调时优先调用普通函数,其次调用模板函数 模板函数要编译两次,第一次是具现出具体的函数,第二次是对具现出的函数进行编译 函数模板调用特 ...

  2. 题解 洛谷 P4547 【[THUWC2017]随机二分图】

    根据题意,题目中所求的即为所有\(n!\)种完美匹配的各自的出现概率之和再乘上\(2^n\)的值. 发现\(n\)很小,考虑状压\(DP\).设\(f_{S,T}\)为左部图匹配情况为\(S\),右部 ...

  3. twitch游戏直播(【国外】平台)如何绑定二次验证码_虚拟MFA?

    一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 twitch游戏直播([国外]平台)如何绑定二次验证码_虚拟MFA? 二次验证码小程序于谷歌身份验证器APP的优势(更多见官网 ...

  4. python golang中grpc 使用示例代码详解

    python 1.使用前准备,安装这三个库 pip install grpcio pip install protobuf pip install grpcio_tools 2.建立一个proto文件 ...

  5. Java Web(2)-jQuery上

    一.jQuery初体验 使用jQuery给一个按钮绑定单击事件 <!DOCTYPE html> <html lang="en"> <head> ...

  6. Nginx安全优化与性能调优

    目录 Nginx基本安全优化 隐藏Nginx软件版本号信息 更改源码隐藏Nginx软件名及版本号 修改Nginx服务的默认用户 修改参数优化Nginx服务性能 优化Nginx服务的worker进程数 ...

  7. laravel 资源控制器方法列表

    以 PostController 控制器的每个方法都有对应的请求方式.路由命名.URL.方法名和业务逻辑约定. HTTP请求方式 URL 控制器方法 路由命名 业务逻辑描述 GET post inde ...

  8. macOS 遇到 svnadmin无法使用的情况

    首先,我在网上查了很多资料,大多数开发者都是表明了mac内置svn,然后直接使用svnadmin来创建仓库,但是我用命令行敲入svnadmin却显示找不到svnadmin.最开始,有个资料说用whic ...

  9. ASP.NET Core中的响应压缩

    介绍     响应压缩技术是目前Web开发领域中比较常用的技术,在带宽资源受限的情况下,使用压缩技术是提升带宽负载的首选方案.我们熟悉的Web服务器,比如IIS.Tomcat.Nginx.Apache ...

  10. 一分钟玩转 Spring IoC!

    前言 「上一篇文章」我们对 Spring 有了初步的认识,而 Spring 全家桶中几乎所有组件都是依赖于 IoC 的. 刚开始听到 IoC,会觉得特别高大上,但其实掰开了很简单. 跟着我的脚步,一文 ...