Прошло много времени. В настоящее время я изо всех сил пытаюсь оптимизировать производительность своего приложения. Вот фрагмент, похожий на то, что у меня сейчас есть.
Хранимая процедура с этим запросом:
SELECT field_a, field_b, field_c
FROM table_a
WHERE field_a = param_a
AND field_b = param_b;
В Java у меня есть ArrayList
из SampleParameterClass
с атрибутами paramA
и paramB
, объявленными как String
.
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
утверждение.
-Я не нашел подобного вопроса, если я что-то пропустил. Пожалуйста, опубликуйте URL-адрес этого вопроса, и я отмечу его как ответ на этот вопрос.
-Я не нашел материалов для чтения, например передачи списка в процедуре.
Спасибо, любой ответ очень ценится.
PreparedStatement
и, вероятно, немного облегчить себе жизнь. - person Tom Anderson   schedule 14.05.2013PreparedStatement
не решает эту проблему. Но ответ пользователя 2310289 дает решение, которое работает как дляCallableStatement
, так и дляPreparedStatement
. - person Tom Anderson   schedule 14.05.2013