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 ...
随机推荐
- Python Ethical Hacking - KEYLOGGER(3)
Object-Oriented Programming Keylogger Classes Way of modeling program(blueprint). Logically group fu ...
- JVM调优工具Arthas的使用
Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱.在线排查问题,无需重启:动态跟踪Java代码:实时监控JVM状态. Arthas 支持JDK6+,支持Linux/Mac/Wind ...
- pta习题:退休日期推算
6-3 退休日期推算 (10分) 关于日期的结构定义如下: struct DateG{ int yy,mm,dd;}; 编写两个函数,一个计算自公元1年1月1日到指定的日期共经历了多少天.另一个是 ...
- Git的自定义和特殊文件配置
目录 备注: 知识点 自定义Git 忽略特殊文件 .gitignore忽略文件 忽略文件的原则是: 忽略文件示例 .gitignore文件查看和强制添加 备注: 本文参考于廖雪峰老师的博客Git教程. ...
- 一起学Blazor WebAssembly 开发(2)
上篇文章讲了Blazor的两种模式的区别及各自的使用场景,本篇就开始学习WebAssembly模式,本篇主要学习的是创建项目及认识项目结构: 创建项目 选择Blazor应用 选择WebAssembly ...
- 题解 洛谷 P4632 【[APIO2018] New Home 新家】
首先考虑可以用二分答案来解决询问,可以二分一个长度\(len\),若在区间\([x-len,x+len]\)内包含了所有\(k\)种的商店,那么这个\(len\)就是合法的,可以通过二分来求其最小值. ...
- 题解 洛谷 P3825 【[NOI2017]游戏】
从题面中四元组\((i,h_i,j,h_j)\)限制选择车子型号,不难想到这题要用\(2-SAT\)解决. 考虑转化为\(2-SAT\)模型,发现除地图\(x\)外,其他地图都只有两种车子型号可以参加 ...
- Netty 学习笔记(3) ------ ChannelPipeline 和 ChannelHandler
ChannelPipeline通过责任链设计模式组织逻辑代码(ChannelHandler),ChannelHander就如同Servlet的Filter一样一层层处理Channel的读写数据. Ch ...
- Python操作adb命令脚本
一.脚本代码(有错误,抓紧改进中) import os import datetime date1=datetime.datetime.now().strftime('%Y%m%d') date2=d ...
- HTML基础和标签
HTML 1.属性 在开始标签中写的键值对 2.颜色 ①英文 ②16进制代码 例如: #cccccc #ccc (缩写) #000000 ③Rgba(0~255,255,255,0~1) 0~1代 ...