簡體   English   中英

在 Oracle 19c Java 存儲過程中使用 java.nio 出現問題

[英]Problem with using java.nio in Oracle 19c Java Stored Procedures

我正在嘗試從保存到 Oracle 數據庫 19.3 的 java function 連接到我的本地 kafka 服務器。 問題是我無法訪問服務器。 在數據庫跟蹤文件中,我看到 kafka 庫正在使用 java.nio package 連接到服務器。 任何連接嘗試都以“連接被拒絕”結束。 我也承認我可以從命令行工具向主題發送數據。

要檢查來自數據庫的請求是否傳入端口 9092 的 localhost 服務器,我運行了 Hercules TCP 服務器並將其設置為偵聽此端口。 然后,當我使用我的 java function 時,什么也沒有發生。 我編寫了一些“測試”函數來只簡單地連接到我的本地服務器,看看是否有一些網絡問題。 The function where i use java.net package is working and i can see that i receive connection requests from database, but the function where i use java.nio package is returning always "Connection refused"

我已將 java.net.SocketPermission 授予我的數據庫用戶:

exec dbms_java.grant_permission( 'KAFKA', 'SYS:java.net.SocketPermission', '*', 'connect,resolve' );
commit;

Are there needed some special permissions to use java.nio package into oracle database java functions or maybe i'm doing something wrong?

這是我的 java “測試”功能代碼:

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "testTCP" AS
import java.net.Socket;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SocketChannel;

public class testTCP {

    public static String conn_nio(){
        
        String response;
        try {
            InetSocketAddress hostAddress = new InetSocketAddress("localhost", 9092);
            SocketChannel client = SocketChannel.open(hostAddress);
            client.close();
            response = "OK";
        }
        catch(Exception e){
            response = "Message: " + e.getMessage() + " Cause: " + e.getCause();
        }
        return response;
    }

    public static String conn_net() {
        String response;
        try
        {
            Socket socket = new Socket( "localhost", 9092 );
            socket.close();
            response = "OK";
        }
        catch( Exception e )
        {
            response = "Message: " + e.getMessage() + " Cause: " + e.getCause();
        }
        
        return response;

    }

}

無法重現。 我將它指向我開始使用的本地 HTTP 服務器的端口 8080

python -m SimpleHTTPServer 8080

兩種連接方法都可以:

CREATE OR REPLACE FUNCTION test_net RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'testTCP.conn_net() return java.lang.String';
/

CREATE OR REPLACE FUNCTION test_nio RETURN VARCHAR2 AS
LANGUAGE JAVA NAME 'testTCP.conn_nio() return java.lang.String';
/

SELECT test_net FROM DUAL;
OK

SELECT test_nio FROM DUAL;
OK

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM