Springboot调用Oracle存储过程的几种方式
- 因工作需要将公司SSH项目改为Spingboot项目,将项目中部分需要调用存储过程的部分用entityManagerFactory.unwrap(SessionFactory.class).openSession()来获取Session实现后发现项目访问数据库超过十次就会挂掉,原因是Springboot连接池数量默认为10,猜测是每次访问数据库后连接未释放导致的,手动关闭session后问题解决。
- 解决问题的过程中又发现了另外两种调用方式,
- 直接用EntityManager的createStoredProcedureQuery()方法调用 (推荐)
- 通过如下方式获取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存储过程的几种方式的更多相关文章
- 123 c#调用oracle存储过程返回数据集 --通过oracle存储过程返回数据集
c#调用oracle存储过程返回数据集 2008-12-20 10:59:57| 分类: net|字号 订阅 CREATE OR REPLACE PACKAGE pkg_tableTypeIS ...
- Oracle创建表语句(Create table)语法详解及示例、、 C# 调用Oracle 存储过程返回数据集 实例
Oracle创建表语句(Create table)语法详解及示例 2010-06-28 13:59:13| 分类: Oracle PL/SQL|字号 订阅 创建表(Create table)语法详解 ...
- MyBatis调用Oracle存储过程
MyBatis调用Oracle存储过程 1.无输入和输出参数的存储过程 2.带有输入和输出参数的存储过程 3.返回游标的存储过程 mybatis中的配置文件代码 <resultMap type= ...
- 调用sed命令的三种方式
调用sed命令的三种方式 调用sed有三种方式,一种为Shell命令行方式,另外两种是将sed命令写入脚本文件,然后执行该脚本文件. 三种方式的命令格式归纳如下: 一.在Shell命令行输入命令调用s ...
- Java调用oracle存储过程通过游标返回临时表数据
注:本文来源于 < Java调用oracle存储过程通过游标返回临时表数据 > Java调用oracle存储过程通过游标返回临时表数据 项目开发过程中,不可避免的会用到存储过程返回结 ...
- .Net 中读写Oracle数据库常用两种方式
.net中连接Oracle 的两种方式:OracleClient,OleDb转载 2015年04月24日 00:00:24 10820.Net 中读写Oracle数据库常用两种方式:OracleCli ...
- plsql 连接oracle数据库的2种方式
plsql 连接oracle数据库的2种方式 CreationTime--2018年8月10日09点50分 Author:Marydon 方式一:配置tnsnames.ora 该文件在instan ...
- C#调用Oracle存储过程
C#调用Oracle存储过程的代码如下所示: using System; using System.Collections.Generic; using System.Collections.Obje ...
- C#调用 oracle存储过程
C#调用oracle 存储过程与调用Sql server存储过程类似,比较简单:直接给出示例: /// <summary> /// 判断物料类型是不是总部管控 /// </summa ...
随机推荐
- T3 成绩单 题解
这个题本来不归我讲,但我A完之后觉得太坑了,还是讲一下吧. 首先这个题有个重要的地方:(字典顺序,学号全为小写字母,从小到大排列) 字典序和字典顺序是不一样的!!! 我以为是字典序……,wa了,字典顺 ...
- Java 线程与同步的性能优化
本文探讨的主题是,如何挖掘出Java线程和同步设施的最大性能. 1.线程池与ThreadPoolExecutor 1)线程池与ThreadPoolExecutor 线程池的实现可能有所不同,但基本概念 ...
- 《java常用设计模式之----单例模式》
一.简介 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创 ...
- 组件缓存注意事项 ---keep-alive
- spring学习(五)详细介绍AOP
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待 它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封 ...
- Android集成Zxing
1.在build文件中添加依赖 dependencies { //ZXing implementation 'com.google.zxing:core:3.3.3' implementation(' ...
- Dom运用2
1.登录系统 <!--输入框创建--> 账号:<input class="ipt" type="text"><br> 密码: ...
- 记node,elementui,formidable上传图片
卡了很久甚至心态爆炸,搞了半天才能成功上传图片,结果图片上传的位置也有问题.头大 https://www.jianshu.com/p/3a61318c24d1 先是参考这个来弄好大致的部署. 然后中途 ...
- pandas_时间序列和常用操作
# 时间序列和常用操作 import pandas as pd # 每隔五天--5D pd.date_range(start = '',end = '',freq = '5D') ''' Dateti ...
- PHP idate() 函数
------------恢复内容开始------------ 实例 格式化本地时间/日期为整数.测试所有不同的格式: <?phpecho idate("B") . " ...