Вызов Oracle метода Java на другом компьютере

Мне не разрешено компилировать класс java в экземпляр Oracle, на котором мы работаем, по запросу архитекторов, поэтому я ищу альтернативы. Требование состоит в том, чтобы использовать библиотеку Java, расположенную на сервере приложений в сети. Можно ли вызвать из PL/SQL метод Java, расположенный на другом компьютере? Я нашел эту статью, в которой говорится о внешних процедурах в Oracle, но я не уверен, что он это позволяет. Кроме того, производительность также должна быть достаточно высокой, чтобы ее можно было использовать для пакетной обработки тысяч или миллионов вызовов.


person Alex    schedule 29.08.2012    source источник


Ответы (2)


Я подозреваю, что лучшее, что вы можете сделать, это добавить записи в другую таблицу, которую ваш процесс Java опрашивает, чтобы получить каждое или несколько сообщений. Oracle на самом деле не предназначен для обработки сообщений.

В любом случае, я бы обсудил это с вашим Архитектором, что делать, поскольку он эксперт. ;)

Если ваша система Oracle не может выполнить эту работу, вам может потребоваться решение, не использующее Oracle.

person Peter Lawrey    schedule 29.08.2012
comment
Спасибо. В настоящее время мы обсуждаем этот вопрос, и есть альтернатива, аналогичная вашей, но с пошаговым планированием вместо опроса. Мне любопытно, почему вы исключили подход с внешней процедурой? - person Alex; 29.08.2012
comment
@Alex В основном потому, что в последний раз, когда я использовал его (десять с лишним лет назад), он был очень медленным. Сейчас, наверное, лучше. - person Peter Lawrey; 29.08.2012
comment
Теперь это выглядит лучше, но у вас все еще есть проблема, заключающаяся в том, что ваши коммуникации должны быть достаточно быстрыми, поэтому не лучше использовать вашу библиотеку в качестве внешней процедуры. - person Peter Lawrey; 29.08.2012
comment
Я надеялся, что будет какой-то способ кэшировать внешнюю процедуру для локального запуска после первого вызова или просто загрузить ее из удаленного места для локального запуска, но я думаю, что это невозможно. Спасибо за ваше понимание. - person Alex; 29.08.2012
comment
Вы можете кэшировать часть работы, которую он выполняет, однако он всегда будет иметь некоторые накладные расходы, и если вы не вызовете метод асинхронно, это займет больше времени, чем вызов библиотеки как внешней процедуры. - person Peter Lawrey; 29.08.2012

У вас есть три варианта:

1.) Мы решили аналогичную проблему, заставив PL/SQL вызывать HTTP с использованием UTL_HTTP, а затем позволить серверу приложений вызывать процедуру Java. Мы сделали это, чтобы связать нашу базу данных Oracle с Oracle Reports. PL/SQL запустил HTTP-запрос, который был получен сервером приложений, который вызвал Java. Java может вызывать PL/SQL через обычный JDBC.

2.) Возможно, вы не сможете загрузить этот java-процесс, но, возможно, вы можете создать какую-то другую хранимую процедуру java, которая может вызывать ее с помощью RMI.

3.) AQ — еще один метод. По сути, вы можете поставить сообщение в очередь с помощью AQ и использовать JMS на сервере приложений, чтобы исключить его из очереди и использовать.

Вариант 3 будет самым быстрым, хотя мы пробовали вариант 1, и задержка для него не так велика, как вы могли бы. Он также предлагает способ выполнения некоторой параллельной обработки путем параллельного запуска нескольких запросов.

person VikrantY    schedule 29.08.2012