已經有一段時間了。我目前正在努力優化我的應用程序的性能。這裏有一個類似於我目前的片段。Java/PostgreSQL - 性能數據優化
存儲過程與此查詢:
SELECT field_a, field_b, field_c
FROM table_a
WHERE field_a = param_a
AND field_b = param_b;
在Java中,我有這個ArrayList
的SampleParameterClass
有聲明爲String
的paramA
和paramB
屬性。
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
聲明的程序相同的問題。
- 我還沒有發現類似的問題,如果我錯過了什麼。請確保發佈該問題的網址,並將其標記爲對此問題的答案。
- 我還沒有找到一份閱讀材料,就像在程序中傳遞一個列表一樣。
謝謝,任何答案非常感謝。
在你寫的,我看不出有任何理由爲這是一個存儲過程。你可以使用普通的'PreparedStatement',並且可能讓你的生活變得更容易。 – 2013-05-14 08:42:00
謝謝湯姆。上面寫的存儲過程是爲了我的問題。目前,該程序實際上至少包括8個表格。另一方面,關於你的建議,這不就像是一個程序一樣嗎?查詢也將根據我的sampleParams中元素的數量來調用? – 2013-05-14 08:48:41
你說得對,使用'PreparedStatement'不能解決這個問題。但user2310289的答案給出了一個適用於'CallableStatement'和'PreparedStatement'的解決方案。 – 2013-05-14 17:30:24