2017-09-14 78 views
0

使用結構時,我有一個春天啓動應用程序,我主持幾個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); 

所以一切都工作得很好。

+0

它們不被釋放,因爲它們不受Spring控制。您正在打開/請求自己的新連接,因此應該自己關閉它們。基本上,如果你開始做'getJdbcTemplate()。getDataSource()。getConnection()'',然後從鍵盤退後一步並重新思考。而是使用Spring的'ConnectionCallback'。 –

+0

這是我能找到的唯一工作示例。你能否指點我正確的方向?我想做得很好 – facundop

+0

我已經指出你在正確的方向,使用'ConnectionCallback'。 –

回答

0

我能夠通過實施AbstractSqlTypeValue(),其具有通過數據源的連接的方法來解決它。這樣,我不必手動獲得連接。然後我簡單地將structArray添加到輸入映射中。

SqlTypeValue structArray = new AbstractSqlTypeValue() { 
       @Override 
       protected Object createTypeValue(Connection connection, int arg1, String arg2) throws SQLException { 
        Object[] modelArray = new Object[request.getArray().size()]; 
        int i = 0; 
        for (Iterator<Model> iterator = request.getArray().iterator(); iterator.hasNext();) { 
         Model model = (Model) iterator.next(); 
         Struct s = connection.createStruct("TEST_REC", new Object[] { 
          // All attributes go here 
         }); 
         modelArray[i++] = s; 
        } 
        Array structArray = ((OracleConnection) connection).createOracleArray("TEST_STRUCT", 
          modelArray); 
        return structArray ; 
       } 
      };