前言
因工作需要將公司SSH項目改為Spingboot項目,將項目中部分需要調用存儲過程的部分用entityManagerFactory.unwrap(SessionFactory.class).openSession()來獲取Session實現后發現項目訪問數據庫超過十次就會掛掉,原因是Springboot連接池數量默認為10,猜測是每次訪問數據庫后連接未釋放導致的,手動關閉session后問題解決。
解決問題的過程中又發現了另外兩種調用方式:
- 直接用EntityManager的createStoredProcedureQuery()方法調用 (推薦)
-
通過如下方式獲取Session來調用,這種方式不需要手動關閉Session來釋放連接,具體原因我也沒搞明白,有知道的朋友歡迎指點
Session session = entityManager.unwrap(Session.class);
完整代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
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); } } } |
總結
到此這篇關于Spring boot調用Oracle存儲過程的兩種方式及完整代碼的文章就介紹到這了,更多相關Springboot調用Oracle存儲過程內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/tiro996/p/13485980.html