Распараллеливание сетевых запросов Oracle PL / SQL - PullRequest
3 голосов
/ 21 апреля 2011

У меня есть скрипт PL / SQL, который извлекает некоторые данные XML через HTTP, используя SYS.UTL_HTTP. Но сеть работает медленно. Я бы открывал до 5-10 одновременных HTTP-соединений, извлекал 5-10 страниц и обрабатывал их. Как я могу распараллелить эти сетевые запросы в PL / SQL?

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Самый простой вариант, вероятно, состоит в том, чтобы порождать несколько заданий базы данных и каждое из них делает подмножество вызовов. В зависимости от версии Oracle, вы можете использовать пакет DBMS_JOB или DBMS_SCHEDULER для создания своих собственных заданий, т.е.

FOR x IN (SELECT url_to_access FROM table_of_urls)
LOOP
  dbms_job.submit( l_jobid,
                   'BEGIN procedure_to_access_url(' || x.url_to_access || '); END;' );
END LOOP;

Однако, если вы используете 11.2, Oracle предоставил платформу, позволяющую базе данных автоматически распределять работу по ряду DBMS_SCHEDULER заданий, используя пакет DBMS_PARALLEL_EXECUTE .

0 голосов
/ 22 апреля 2011

Один PL / SQL не может легко порождать потоки. То, что вы можете сделать, это иметь несколько переменных utl_http.req. Тогда вы

v_req1 := utl_http.begin_request('http....');
v_req2 := utl_http.begin_request('http....');
v_req3 := utl_http.begin_request('http....');
v_req4 := utl_http.begin_request('http....');
v_resp := utl_http.get_response(v_req1);
...
v_resp := utl_http.get_response(v_req2);
...
v_resp := utl_http.get_response(v_req3);
...
v_resp := utl_http.get_response(v_req4);
...

Будет ли это работать быстрее, зависит от сервера на другом конце. Хотя в этом сценарии может быть сложно справиться с ошибками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...