2014-05-15 2 views
1

현재 IBM DB2 v10.1 Enterprise Edition으로 작업 중입니다. Java Stored Procedure를 만들어야하는데, 이는 원격 TCP 서버 (다시 Java로)에 연결합니다. 따라서, 나는 (파일 이름이 SystemClient.java입니다) 자바에 다음 클래스를 코딩 한 :DB2 Java 저장 프로 시저 NoSuchMethodError

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 

public class SystemClient { 

    public static void callSystemML(String serverIPAddress, Integer serverPort, 
      String script, String args) throws IOException, ClassNotFoundException { 

     Socket socket = new Socket(serverIPAddress, serverPort); 
     PrintWriter writer = new PrintWriter(socket.getOutputStream(), true); 
     BufferedReader reader = new BufferedReader(
      new InputStreamReader(socket.getInputStream())); 
     writer.println(script + "|" + args); 
     String line = reader.readLine(); 
     writer.close(); 
     reader.close(); 
     socket.close(); 
    } 

} 

그래서, 나는 다음과 같은 명령을 위의 클래스에 대한 JAR 파일을 작성합니다

javac SystemClient.java 
jar cvf SystemClient.jar SystemClient.class 

및 나는 다음과 같은 명령을 호출하는 DB2 명령 행에서 : 그 후

db2 "call sqlj.install_jar('file:/path/to/jar/SystemClient.jar','SYSTEM_ML_CLIENT_JAR', 0) 

를, 나는 실행하여 내 JAR가 올바르게 등록되어 있는지 확인합니다

db2 "select jar_id from sysibm.sysjarcontents" 

새 Jar가 등록되었는지 확인하십시오. 그럼,이 절차를 저장 내 SQL을 작성하는 다음 스크립트가

CREATE OR REPLACE PROCEDURE DB2INST1.ML_CLIENT_CALL(
    IN serverIPAddress VARCHAR(255), 
    IN serverPort INTEGER, 
    IN script VARCHAR(255), 
    IN args VARCHAR(255)) 
LANGUAGE java 
PARAMETER STYLE java 
FENCED THREADSAFE 
EXTERNAL NAME 'SYSTEM_ML_CLIENT_JAR:SystemClient.callSystemML(java.lang.String, java.lang.Integer, java.lang.String, java.lang.String)'; 

을 그리고 다시, 나는 다음과 같은 스크립트 내 절차가 만들어 졌는지 확인하기 위해 실행합니다 (파일 이름 : - 시스템 call.sql을 만들 수) :

db2 "select routinename from syscat.routines where language='JAVA'" 

거기에 ML_CLIENT_CALL의 이름이 있습니다. 나는 다음과 같은 명령을 사용하여 명령 줄에서 새 프로 시저를 호출 할 때 문제가 발생합니다 :

나는 다음과 같은 출력받을 수있다
db2 "call ml_client_call('localhost',4444,'sample.dml','someargs')" 

:

SQL4306N Java stored procedure or user-defined function 
"DB2INST1.ML_CLIENT_CAL", specific name "SQL140514162506200" could not call 
Java method "callSystemML", signature "(Ljava/lang/Str". SQLSTATE=42724 

나는 ~/SQLLIB/db2dump를 확인을 정확한 오류에 대한 /db2diag.log 나는 다음을 참조 : 나는 FO 이후는 JNI 대해서 GetMethodID 메시지를 실패 얻을 왜 지금

2014-05-15-09.17.23.080944-420 I944034E848   LEVEL: Warning 
PID  : 2987     TID : 139759180494592 PROC : db2fmp (
INSTANCE: db2inst1    NODE : 000 
APPID : *LOCAL.db2inst1.140515154559 
HOSTNAME: oxiro 
FUNCTION: DB2 UDB, BSU Java support, sqlejCallJavaRoutine_dll, probe:130 
MESSAGE : JNI GetMethodID failed. class: 
DATA #1 : Hexdump, 81 bytes 
0x00007F1C3AD73480 : 2F68 6F6D 652F 6462 3269 6E73 7431 2F73 /home/db2inst1/s 
0x00007F1C3AD73490 : 716C 6C69 622F 6675 6E63 7469 6F6E 2F6A qllib/function/j 
0x00007F1C3AD734A0 : 6172 2F44 4232 494E 5354 312F 5359 5354 ar/DB2INST1/SYST 
0x00007F1C3AD734B0 : 454D 5F4D 4C5F 434C 4945 4E54 5F4A 4152 EM_ML_CLIENT_JAR 
0x00007F1C3AD734C0 : 2E6A 6172 3A53 7973 7465 6D43 6C69 656E .jar:SystemClien 
0x00007F1C3AD734D0 : 74           t 

2014-05-15-09.17.23.081203-420 I944883E455   LEVEL: Warning 
PID  : 2987     TID : 139759180494592 PROC : db2fmp (
INSTANCE: db2inst1    NODE : 000 
APPID : *LOCAL.db2inst1.140515154559 
HOSTNAME: oxiro 
FUNCTION: DB2 UDB, BSU Java support, sqlejCallJavaRoutine_dll, probe:140 
MESSAGE : JNI GetMethodID failed. method: 
DATA #1 : Hexdump, 12 bytes 
0x00007F1C3AD734D2 : 6361 6C6C 5379 7374 656D 4D4C    callSystemML 

2014-05-15-09.17.23.081294-420 I945339E699   LEVEL: Warning 
PID  : 2987     TID : 139759180494592 PROC : db2fmp (
INSTANCE: db2inst1    NODE : 000 
APPID : *LOCAL.db2inst1.140515154559 
HOSTNAME: oxiro 
FUNCTION: DB2 UDB, BSU Java support, sqlejCallJavaRoutine_dll, probe:150 
MESSAGE : JNI GetMethodID failed. signature: 
DATA #1 : Hexdump, 58 bytes 
0x00007F1C3AD73560 : 284C 6A61 7661 2F6C 616E 672F 5374 7269 (Ljava/lang/Stri 
0x00007F1C3AD73570 : 6E67 3B49 4C6A 6176 612F 6C61 6E67 2F53 ng;ILjava/lang/S 
0x00007F1C3AD73580 : 7472 696E 673B 4C6A 6176 612F 6C61 6E67 tring;Ljava/lang 
0x00007F1C3AD73590 : 2F53 7472 696E 673B 2956     /String;)V 
2014-05-15-09.17.23.081575-420 E946039E433   LEVEL: Warning 
PID  : 2987     TID : 139759180494592 PROC : db2fmp (
INSTANCE: db2inst1    NODE : 000 
APPID : *LOCAL.db2inst1.140515154559 
HOSTNAME: oxiro 
FUNCTION: DB2 UDB, BSU Java support, sqlejLogException, probe:10 
MESSAGE : ADM10000W A Java exception has been caught. The Java stack 
     traceback has been written to the db2diag log file. 

2014-05-15-09.17.23.081835-420 I946473E518   LEVEL: Warning 
PID  : 2987     TID : 139759180494592 PROC : db2fmp (
INSTANCE: db2inst1    NODE : 000 
APPID : *LOCAL.db2inst1.140515154559 
HOSTNAME: oxiro 
FUNCTION: DB2 UDB, BSU Java support, sqlejLogException, probe:10 
MESSAGE : java.lang.NoSuchMethodError: SystemClient.callSystemML(Ljava/lang /String;ILjava/lang/String;Ljava/lang/String;)V 
DATA #1 : Hexdump, 4 bytes 
0x00007F1C384E9B00 : 0000 0000         .... 

2014-05-15-09.17.23.081961-420 I946992E445   LEVEL: Warning 
PID  : 2987     TID : 139759180494592 PROC : db2fmp (
INSTANCE: db2inst1    NODE : 000 
APPID : *LOCAL.db2inst1.140515154559 
HOSTNAME: oxiro 
FUNCTION: DB2 UDB, routine_infrastructure, sqlerJavaCallRoutine, probe:30 
MESSAGE : Error from DB2ER CallUDF. RC: 
DATA #1 : Hexdump, 4 bytes 
0x00007F1C384EA6A0 : 2EEF FFFF         .... 

, 나는 이해하지 않으며 java.lang.NoSuchMethodError 내 JAR 등록을위한 적절한 단계를 수행하십시오.

은 내가 다음 단계에 뭔가가 잘못되면 확인하고 싶어서, 그래서 간단한 자바 클래스에 대해 동일했다 :

public class TestUdf { 
    public static void testMethod(String inStr1, String inStr2, String inStr3, int[] out) { 
     String someString = inStr1 + inStr2 + inStr3; 
     out[0] = 1; 
    } 
} 

및 생성 SQL 스크립트를

CREATE PROCEDURE DB2INST1.TESTMETHOD(IN str1 VARCHAR(255), IN str2 
VARCHAR(255), IN str3 VARCHAR(255), OUT out1 INTEGER) 
LANGUAGE java 
PARAMETER STYLE java 
FENCED THREADSAFE 
EXTERNAL NAME 
'TESTUDF:TestUdf.testMethod(java.lang.String, java.lang.String, java.lang.String, java.lang.Integer[])'; 

및 그것은 완벽하게 잘 작동합니다.

따라서 제 질문은 : 첫 번째 경우에 무엇을 잘못하고 내 프로 시저가 실행되지 않습니까? 내 JDK를 가지고 무엇인가해야합니까? 나는 IBM의 JDK를 사용하고 있으며이 디렉토리에 설치됩니다 마지막으로

[email protected]:~$ db2 get dbm cfg 

      Database Manager Configuration 

    Node type = Enterprise Server Edition with local and remote clients 

Database manager configuration release level   = 0x0f00 

Java Development Kit installation path  (JDK_PATH) = /opt/ibm/java-x86_64-71/ 

, 나는 내가 일하고 있다고 말하고 싶다 : 또한

/opt/ibm/java-x86_64-71/ 

, DB2 구성 관리자는이 다음 반환 우분투 12 (64 비트) 컴퓨터.

감사합니다. 긴 게시물에 대해 사과드립니다.

답변

1

DB2는 서명 (String, int, String, String)와 방법을 찾고있다 :

(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V 

참고 "나는"두 번째 매개 변수 유형으로, 그렇지 않은 "Ljava/랭/정수".

데이터 형식이 int 인 SQL INTEGER에 매핑되므로 메서드 서명을 변경해야합니다.

+0

대단히 감사합니다. 그것은 실제로 문제였습니다. 나는 java.lang.Integer와 int가 DB2에서 똑같이 작동한다고 생각했다. 나는 그들이하지 않았다을 추측한다. 대단히 감사합니다. –

관련 문제