Как выполнить хранимую процедуру Oracle Java параллельно - PullRequest
3 голосов
/ 15 декабря 2011

У меня такой запрос:

select samplePackage.prepareMessage(t.message) as text 
from 
sampleSchema.sampleTable t;

sampleTable содержит большие данные (количество строк 30M) prepareMessage - это хранимая процедура Java.

private static String prepareMessage(String message) {
   //do some things...
   return preparedMessage;
}

Я пытаюсь выполнить этот запрос параллельно.Как я могу это сделать?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 15 декабря 2011

Я никогда не пробовал это с функцией Java самостоятельно. Но подход должен быть следующим:

Запустите ваш запрос с подсказкой PARALLEL:

select /*+ PARALLEL(t) */ samplePackage.prepareMessage(t.message) as text 
from sampleSchema.sampleTable t;

Чтобы успешно выполнить SELECT параллельно, Oracle необходимо знать, что ваша функция Java безопасна для этого. Поэтому вы должны объявить его как PARALLEL_ENABLE или предоставить RESTRICT_REFERENCES.

CREATE OR REPLACE FUNCTION PREPARE_MESSAGE(message IN VARCHAR2) RETURN VARCHAR2 PARALLEL_ENABLE
AS LANGUAGE JAVA
    NAME 'sampleSchema.samplePackage.prepareMessage(Java.lang.String) return Java.lang.String';

Запрос становится:

select /*+ PARALLEL(t) */ PREPARE_MESSAGE(t.message) as text 
from sampleSchema.sampleTable t;

Существуют дополнительные ограничения, применимые к функции, например, он не может выполнять операторы DML. В противном случае параллельное выполнение невозможно.

Как я уже сказал: я не пробовал это с Java. Но это направление идти.

Обновление: Я изменил код с использования пакета на использование функции. Так должно быть проще.

2 голосов
/ 15 декабря 2011

Используйте один из предварительно упакованных API-интерфейсов Oracle, пакет DBMS_JOB, чтобы отправить несколько заданий в очередь заданий, а затем запустить их параллельно.

0 голосов
/ 15 декабря 2011

Почему вы хотите сделать это параллельно? Что вы собираетесь делать с результатами?

Единственное, что я думаю о том, чтобы запустить его параллельно, - это выполнить его в одном потоке, тогда сервер базы данных вернет ResultSet. Этот ResultSet может быть аргументом для потоков, которые будут извлекать часть ответа базы данных (например, каждый поток будет читать 1M строк).

...