如何并行执行oracle java存储过程

时间:2011-12-15 07:52:09

标签: java oracle parallel-processing procedure

我有这样的查询:

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 个答案:

答案 0 :(得分:3)

我自己从未尝试过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。但那是方向。

更新:我已将代码从使用包更改为使用函数。它应该更简单。

答案 1 :(得分:2)

使用Oracle的预先打包的API之一DBMS_JOB包将多个作业提交到作业队列,然后并行运行它们。

答案 2 :(得分:0)

为什么要并行执行?你打算怎么处理结果?

我认为并行运行它的唯一想法是在一个线程中执行它,然后数据库服务器将返回ResultSet。此ResultSet可以是将检索部分数据库响应的线程的参数(例如,每个线程将读取1M行)。