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 с атрибутами 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-адрес этого вопроса, и я отмечу его как ответ на этот вопрос.
-Я не нашел материалов для чтения, например передачи списка в процедуре.

Спасибо, любой ответ очень ценится.


person Michael 'Maik' Ardan    schedule 14.05.2013    source источник
comment
В том, что вы написали, я не вижу причин для того, чтобы это была хранимая процедура. Вы могли бы использовать обычный PreparedStatement и, вероятно, немного облегчить себе жизнь.   -  person Tom Anderson    schedule 14.05.2013
comment
Спасибо, Том. Сохраненная процедура, написанная выше, предназначена для моего вопроса. В настоящее время процедура фактически включает не менее 8 таблиц. С другой стороны, что касается вашего предложения, разве это не то же самое, что если бы это была процедура? Запрос также будет вызываться на основе количества элементов в моих параметрах sampleParams?   -  person Michael 'Maik' Ardan    schedule 14.05.2013
comment
Вы правы, что использование PreparedStatement не решает эту проблему. Но ответ пользователя 2310289 дает решение, которое работает как для CallableStatement, так и для PreparedStatement.   -  person Tom Anderson    schedule 14.05.2013
comment
Спасибо, Том! Сейчас я работаю над этим. Как только я закончу, я отмечу его ответ.   -  person Michael 'Maik' Ardan    schedule 15.05.2013


Ответы (1)


Почему бы не передать параметры в виде строки с разделителями, а затем использовать string_to_array(text, text [, text]) на стороне postgresql для преобразования строки в массив.

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

и

Целые массивы Postgres в качестве параметров?

person Scary Wombat    schedule 14.05.2013
comment
Благодарю вас! Я проверю это. - person Michael 'Maik' Ardan; 14.05.2013
comment
Вам даже не нужно кодировать массив как строку — драйвер JDBC PostgreSQL примет их как экземпляры java.sql.Array. Вы можете создать их с помощью Connection#createArrayOf и использовать их с PreparedStatement#setArray. - person Tom Anderson; 14.05.2013
comment
В руководстве по JDBC есть раздел Использование объектов-массивов. - person Tom Anderson; 14.05.2013
comment
Отмечено как отвеченное. Спасибо пользователю 2310289. Я хотел бы поблагодарить вас от вашего имени. - person Michael 'Maik' Ardan; 15.05.2013