问题描述
团队,
在当前项目中,出于多线程目的,在Java层中调用了批处理过程之一。作为当前要求,我们需要在PLSQL层而不是Java层中调用相同的存储过程。我们尝试使用DBMS_JOB方法来实现,但是它的效率不如Java层。
我们是否有任何方法可以在线程中运行存储过程。请解释 ..
在当前项目中,出于多线程目的,在Java层中调用了批处理过程之一。作为当前要求,我们需要在PLSQL层而不是Java层中调用相同的存储过程。我们尝试使用DBMS_JOB方法来实现,但是它的效率不如Java层。
我们是否有任何方法可以在线程中运行存储过程。请解释 ..
专家解答
查看DBMS_PARALLEL_EXECUTE。
但是我要检查的第一件事是-Java经常使用多线程,因为逐行进行处理。如果您可以通过SQL将其更改为基于设置的操作,则通常根本不需要多线程的复杂性。
这里有一个微不足道的演示 .... 我们从一个例程开始 “修复” 行值,我们需要调用它1000000次,这样我们就能很快想到多线程解决方案,而只是一个更新就可以了。
但是我要检查的第一件事是-Java经常使用多线程,因为逐行进行处理。如果您可以通过SQL将其更改为基于设置的操作,则通常根本不需要多线程的复杂性。
这里有一个微不足道的演示 .... 我们从一个例程开始 “修复” 行值,我们需要调用它1000000次,这样我们就能很快想到多线程解决方案,而只是一个更新就可以了。
SQL> create table t as select rownum pk, d.* from dba_objects d, 2 ( select 1 from dual connect by level <= 20 ); Table created. SQL> SQL> create index ix on t ( pk ); Index created. SQL> SQL> SQL> create or replace 2 procedure fix_row(p_idx int, p_new_val varchar2) is 3 begin 4 update t 5 set owner = p_new_val 6 where pk = p_idx; 7 end; 8 / Procedure created. SQL> SQL> set timing on SQL> begin 2 for i in 1 .. 1000000 3 loop 4 fix_row(i,upper(i)); 5 end loop; 6 end; 7 / PL/SQL procedure successfully completed. Elapsed: 00:00:36.10 SQL> SQL> update t 2 set owner = upper(pk) 3 where pk <= 1000000; 1000000 rows updated. Elapsed: 00:00:02.52 SQL> SQL>
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




