有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有这样一个问题:

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

  1. # 1 楼答案

    你为什么要同时做呢?你打算如何处理结果

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

  2. # 2 楼答案

    我自己从来没有用Java函数尝试过。但方法应如下所示:

    使用并行提示运行查询:

    select /*+ PARALLEL(t) */ samplePackage.prepareMessage(t.message) as text 
    from sampleSchema.sampleTable t;
    

    为了成功地并行执行SELECT,Oracle需要知道Java函数对此是安全的。因此,您必须将其声明为PARALLEL_ENABLE或提供RESTRICT_引用

    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尝试过。但这就是方向

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

  3. # 3 楼答案

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