Oracle PL / SQL网络请求并行化

时间:2011-04-21 19:00:44

标签: oracle plsql

我有一个PL / SQL脚本,它使用SYS.UTL_HTTP通过HTTP获取一些XML数据。 但网络很慢。 我会打开5到10个同时HTTP连接,获取5-10页并处理它。 如何在PL / SQL中并行化这些网络请求?

2 个答案:

答案 0 :(得分:2)

最简单的选择可能是生成多个数据库作业,并让每个作业都调用一部分。根据Oracle版本,您可以使用DBMS_JOBDBMS_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_PARALLEL_EXECUTE package自动将工作分配给多个DBMS_SCHEDULER作业。

答案 1 :(得分:0)

单个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);
...

实际上是否工作得更快取决于另一端的服务器。但是,在这种情况下处理错误可能会很痛苦。