使用結構時,我有一個春天啓動應用程序,我主持幾個REST和SOAP Web服務被釋放。我的客戶的最新請求是執行一個接收多個參數和3個自定義數組的存儲過程。連接Spring不引導和Oracle
它似乎做工精細,但經過5個處決,我得到以下錯誤:
Timeout: Pool empty. Unable to fetch a connection in 30 seconds, none available[size:5; busy:5; idle:0; lastwait:30000].
我不明白爲什麼使用這個特定功能時連接沒有被釋放。
我從春季延伸StoredProcedure
:
public class OracleArrayStoredProcedure extends StoredProcedure {
在那之後,我有我的參數一堆最終字符串(超過50個),然後我有構造函數:
public OracleArrayStoredProcedure(DataSource ds) {
super(ds, PROC_NAME);
在構造函數中我有參數,其中還包括陣列:
declareParameter(new SqlParameter(PARAM1, OracleTypes.NUMBER));
// Arrays
declareParameter(new SqlInOutParameter(ARRAY1, OracleTypes.ARRAY, "ARRAY1"));
declareParameter(new SqlInOutParameter(ARRAY2, OracleTypes.ARRAY, "ARRAY2"));
declareParameter(new SqlInOutParameter(ARRAY3, OracleTypes.ARRAY, "ARRAY3"));
compile();
我已在執行,這就是我得到的方面,我不能釋放:
public ArrayResponse execute(ArrayRequest arrayRequest) {
ArrayResponse response = new ArrayResponse();
Map<String, Object> inputs = new HashMap<String, Object>();
try {
OracleConnection connection = getJdbcTemplate().getDataSource().getConnection()
.unwrap(OracleConnection.class);
// ARRAY1
ArrayDescriptor arrayFirstDescriptor = new ArrayDescriptor(ARRAY1, connection);
StructDescriptor recFirstDescriptor = new StructDescriptor("FIRSTREC", connection);
Object[] arrayFirstStruct = new Object[arrayRequest.getArray1().size()];
int i = 0;
for (Iterator<Array1> iterator = arrayRequest.getArray1().iterator(); iterator
.hasNext();) {
Model1 model1 = (Model1) iterator.next();
STRUCT s = new STRUCT(arrayFirstDescriptor, connection, new Object[] {
// Bunch of attributes
arrayStructArray[i++] = s;
}
ARRAY inStructArray = new ARRAY(arrayDescriptor, connection, array1Struct);
最後我把陣列和參數的輸入,地圖和執行:
inputs.put(ARRAY1, inStructArray);
Map<String, Object> out = super.execute(inputs);
的這種方法的問題是,我不能釋放連接(即使我使用connection.close()),所以5次執行後,它不再工作。我究竟做錯了什麼?
當我沒有使用結構,我不需要使用
OracleConnection connection = getJdbcTemplate().getDataSource().getConnection()
.unwrap(OracleConnection.class);
所以一切都工作得很好。
它們不被釋放,因爲它們不受Spring控制。您正在打開/請求自己的新連接,因此應該自己關閉它們。基本上,如果你開始做'getJdbcTemplate()。getDataSource()。getConnection()'',然後從鍵盤退後一步並重新思考。而是使用Spring的'ConnectionCallback'。 –
這是我能找到的唯一工作示例。你能否指點我正確的方向?我想做得很好 – facundop
我已經指出你在正確的方向,使用'ConnectionCallback'。 –