1

已經有一段時間了。我目前正在努力優化我的應用程序的性能。這裏有一個類似於我目前的片段。Java/PostgreSQL - 性能數據優化

存儲過程與此查詢:

SELECT field_a, field_b, field_c 
FROM table_a 
WHERE field_a = param_a 
AND field_b = param_b; 

在Java中,我有這個ArrayListSampleParameterClass有聲明爲StringparamAparamB屬性。

ArrayList<SampleParameterClass> sampleParams = new ArrayList<SampleParameterClass>(); 

sampleParams.add(new SampleParameterClass(stringValueForParamA, stringValueForParamB); 

我們假設sampleParams由數百個元素填充。

try 
    { 
     conn = ConnectionPool.getConnection(); 

     con.setAutoCommit(false); 

     CallableStatement myProcedure = connection.prepareCall("{ ? = call my_proc_name(?, ?) }"); 

     for(int paramCounter = 0; paramCounter < sampleParams.size(); paramCounter ++){ 

      myProcedure.registerOutParameter(1, Types.OTHER); 
      myProcedure.setObject(2, sampleParams.get(paramCounter).getParamA); 
      myProcedure.setObject(3, sampleParams.get(paramCounter).getParamB); 
      myProcedure.execute(); 

      ResultSet rs = (ResultSet) myProcedure.getObject(1); 

      while (rs.next()) { 

       String resultA = rs.getString("param_a"); 
       String resultB = rs.getString("param_b"); 
       String resultC = rs.getString("param_c"); 

       myArrayListOfResult.add(new Result(resultA, resultB, resultC); 

      } 
     } 

    } 
    catch (SQLException e) { 
     myProcedure.close(); 
     conn.close(); 
    } 
} 

基本上,上面的代碼所做的是在整個循環中ArrayList所有參數和調用存儲過程的每個參數。如果我有成千上萬的數據需要處理,它會很慢,因爲蝸牛不是嗎?

我的問題是:
1)即使我有成千上萬的隊列參數,是否可以調用過程一次?類似於傳遞參數的整個ArrayList
2)如果上述問題無法解答,有什麼方法可以最大限度地減少過程?

注意:
- 與INSERT聲明的程序相同的問題。
- 我還沒有發現類似的問題,如果我錯過了什麼。請確保發佈該問題的網址,並將其標記爲對此問題的答案。
- 我還沒有找到一份閱讀材料,就像在程序中傳遞一個列表一樣。

謝謝,任何答案非常感謝。

+1

在你寫的,我看不出有任何理由爲這是一個存儲過程。你可以使用普通的'PreparedStatement',並且可能讓你的生活變得更容易。 – 2013-05-14 08:42:00

+0

謝謝湯姆。上面寫的存儲過程是爲了我的問題。目前,該程序實際上至少包括8個表格。另一方面,關於你的建議,這不就像是一個程序一樣嗎?查詢也將根據我的sampleParams中元素的數量來調用? – 2013-05-14 08:48:41

+0

你說得對,使用'PreparedStatement'不能解決這個問題。但user2310289的答案給出了一個適用於'CallableStatement'和'PreparedStatement'的解決方案。 – 2013-05-14 17:30:24

回答

2

爲什麼不將參數作爲分隔字符串傳遞,然後在postgresql端使用string_to_array(text,text [,text])將字符串轉換爲數組。

http://www.postgresql.org/docs/9.1/static/functions-array.html

Postgres integer arrays as parameters?

+0

謝謝!我會檢查出來的。 – 2013-05-14 07:58:38

+1

您甚至不需要將數組編碼爲字符串 - PostgreSQL JDBC驅動程序將接受它們作爲['java.sql.Array']的實例(http://docs.oracle.com/javase/7/docs /api/java/sql/Array.html)。您可以使用['Connection#createArrayOf'](http://docs.oracle.com/javase/7/docs/api/java/sql/Connection。html#createArrayOf%28java.lang.String,%20java.lang.Object []%29)並將它們與['PreparedStatement#setArray']一起使用(http://docs.oracle.com/javase/7/docs/api /java/sql/PreparedStatement.html#setArray%28int,%20java.sql.Array%29)。 – 2013-05-14 08:40:43

+0

在JDBC教程中有[使用數組對象]一節(http://docs.oracle.com/javase/tutorial/jdbc/basics/array.html)。 – 2013-05-14 08:46:04