2012-06-08 3 views
7

현재 Oracle에서 Java 저장 프로 시저로 작업 중이며 Java 내에서 연결을 시도 할 때 이상한 동작이 나타납니다. 암호.Oracle 11.2.0.2.0 (64 비트)에서 연결을 시도 할 때 java.lang.ArithmeticException이 발생했습니다.

Java가 jar 파일로 패키징 된 후 loadjava 명령 줄 유틸리티를 사용하여 Oracle에 배치됩니다. 그런 다음 데이터베이스에 package이 생성되어 지정된 Java 클래스의 각 메소드를 호출 스펙을 통해 PL/SQL 함수에 매핑합니다.

제가 작업하고있는 열 중 일부는 CLOB입니다. 자바에서 나는이 CLOB의 값을 추출하려고 시도 String로 (oracle.sql.CLOB로 전화 사양에 매핑) :

private static String getStringFromCLOB(CLOB clob) throws SQLException { 
    long length = clob.length(); 
    return clob.getSubString(1, (int) length); 
} 

나는 다음과 같은 스택 추적 플러스 * SQL에 표시 얻을이 코드를 실행하면 :

난 그냥 Exception의 메시지가 표시되기 전에
java.lang.ArithmeticException:/by zero 
    at oracle.jdbc.driver.T2SConnection.<init>(T2SConnection.java:107) 
    at oracle.jdbc.driver.T2SDriverExtension.getConnection(T2SDriverExtension.java:31) 
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:481) 
    at oracle.jdbc.driver.OracleDriver.defaultConnection(OracleDriver.java:505) 
    at oracle.sql.DatumWithConnection.getPhysicalConnection(DatumWithConnection.java:53) 
    at oracle.sql.DatumWithConnection.getInternalConnection(DatumWithConnection.java:177) 
    at oracle.sql.CLOB.getDBAccess(CLOB.java:1383) 
    at oracle.sql.CLOB.length(CLOB.java:197) 

그래서 나는 그래서이 System.out의 전체 스택 추적을 덤프 수있는 try/catch과 잘못된 방법의 내용을 감쌌다.

이 작업은 Oracle 11.2.0.1.0 (32 비트)에서 수행했지만 Oracle 11.2.0.2.0 (64 비트)에서는 작동하지 않습니다.

다른 Java 지원 PL/SQL function도 문제없이 작동했습니다. 실패한 연결을 시도하는 것은 유일한 것입니다.

나는 <ORACLE_HOME>\jdbc\lib을 보았고 항아리는 동일한 이름이지만이 두 가지 배포판에서는 서로 다른 것처럼 보입니다. (| 1천9백83킬로바이트 1,950킬로바이트)

  • ojdbc5_g.jar (3,010킬로바이트 | 3천2백71킬로바이트)
    • ojdbc5.jar : 디렉토리에있는 항아리 (11.2.0.1.0 크기와 11.2.0.2.0 크기 표시)입니다
    • ojdbc5dms.jar (2,374킬로바이트 | 2천4백89킬로바이트)
    • ojdbc5dms_g.jar (3,030킬로바이트 | 3천2백91킬로바이트)
    • ojdbc6.jar (2,062킬로바이트 | 2천1백2킬로바이트)
    • ojdbc6_g.jar (3,323킬로바이트 | 3,782킬로바이트)
    • ojdbc6dms.jar (2,594KB | 2천6백98킬로바이트)
    • ojdbc6dms_g.jar (3천3백44킬로바이트 | 3천8백5킬로바이트)
    • simplefan.jar (20킬로바이트 | 20킬로바이트) < - 아마

      이 항아리의 매니페스트 파일

    같은 그들이 특정 버전에 내장되어 확인 즉 11.2.0.1.0 또는 11.2.0.2.0입니다. 11.2.0.2.0에 버그가 도입되었을 가능성이 있습니까? 또는 사용자가 될 가능성이 더 큽니다. 예 : my : error :-)

    또한 oracle.jdbc.driver.T2SConnection 클래스는 어디에 있습니까?

    도움/안내 매우 감사합니다. 자세한 정보가 필요하면 알려주십시오.

    +0

    드라이버에서 버그가있는 것 같습니다. oracle에보고하거나 try/catch, ignore ... (또는 둘 다) – bestsss

    답변

    0

    이 문제점을 해결하기 위해 오라클 내에서 JVM 설치가 손상된 것으로 밝혀졌습니다. 이것은 잘못된 설치로 인해 발생했을 수 있습니다.

    Oracle의 JVM 측면을 다시 설치하면 명시 적으로 호출되거나 다른 호출 스택의 일부로 호출되는지 여부에 상관없이 oracle.jdbc.driver.OracleConnection.defaultConnection()이 아무런 문제없이 실행될 수있었습니다. oracle.sql.CLOB.length().

    2

    최근 Oracle JDBC 드라이버와 비슷한 문제가 있습니다. 11.2.0.1의 ojdbc6.jar와 11.2.0.3의 oi18n.jar와 같이 11.2.0.1과 11.2.0.3과 같은 다른 버전의 jar를 혼합하는 경우 문제가있는 것 같습니다. 좋은 방법 중 하나는 Oracle JDBC 드라이버의 전체 병을 디 컴파일하고 오류를 발생시키는 소스 코드의 행을 보는 것입니다. 오류/버그에 대한 팁을 제공 할 수 있습니다.

    두 클라이언트 컴퓨터에서 동일한 JDBC 드라이버 버전을 사용해보십시오.

    oracle.jdbc.driver.T2CConnection은 ojdbc5.jar과 같은 드라이버의 주 jar에 있습니다.

    +0

    David에게 감사드립니다. 나는 모든 항아리가 11.2.0.2에 대한 것이 확실하지만 재확인 할 것이다. 오라클은'oracle.jdbc.driver.T2SConnection' (** S **보다는 C) 클래스가 어디에 있는지 알고 있습니다. – jabclab

    +0

    맞아요, 실수예요. 'oracle.jdbc.driver.T2CConnection'은 모든 jar 파일에 존재합니다. jar 파일의 내용을 일반 ZIP 파일로 나열하면 알 수 있습니다. Oracle JDBC 드라이버 11.2.0. *의 jar 파일에서 'oracle.jdbc.driver.T2SConnection'을 찾을 수 없습니다. 서버에있는 항아리에있는 클래스 리스팅 jar 내용을 찾으십시오. 단지/lib에있을뿐입니다. –

    +0

    답장을 보내 주셔서 감사합니다. 'oracle.jdbc.driver.T2SConnection'은 ''내의 모든 jar 파일에 존재하지 않습니다. 그것은 동적으로 생성 될 수 있습니까? – jabclab

    4

    비밀번호가 만료되었을 때이 문제가 발생했습니다. 암호 만 바꾸면 해결됩니다.

    1

    자바/JDBC 코드가 갑자기 하루 종일 작동하지 않습니다.

    여기에도 같은 문제가 있습니다. 만료 된 암호. 나는 ojdbc6과 ojdbc7을 시도했다. 내 VM 환경을 업그레이드했습니다. 코드는 다른 데이터베이스에 대해 잘 작동했습니다.

    target_user="c##ora$rman_bkp" 
    Placeholder START_DATE=20170422 
    Placeholder START_DATE_TIME=2017Apr22-20h47m13s 
    jdbcURL='jdbc:oracle:oci8:@twelve_static' 
    Exception in thread "main" java.lang.ArithmeticException:/by zero 
         at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:1387) 
         at oracle.jdbc.driver.T2CPreparedStatement.<init>(T2CPreparedStatement.java:109) 
         at oracle.jdbc.driver.T2CDriverExtension.allocatePreparedStatement(T2CDriverExtension.java:81) 
         at oracle.jdbc.driver.PhysicalConnection.prepareStatementInternal(PhysicalConnection.java:2013) 
         at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:1960) 
         at oracle.jdbc.driver.T2CConnection.prepareStatement(T2CConnection.java:57) 
         at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:1866) 
         at oracle.jdbc.driver.T2CConnection.prepareStatement(T2CConnection.java:57) 
         at LV.verifyLicensedDbId(LV.java:238) 
         at RmanJ.<init>(RmanJ.java:1891) 
         at RmanJ.main(RmanJ.java:1809) 
    
    [email protected]:SQL> select account_status from dba_users where username='c##ora$rman_bkp'; 
    
    ACCOUNT_STATUS 
    -------------------------------- 
    EXPIRED(GRACE) 
    
    [email protected]:SQL> connect "c##ora$rman_bkp" 
    Enter password: 
    ERROR: 
    ORA-28002: the password will expire within 5 days 
    
    
    Connected. 
    c##[email protected]:SQL> password 
    Changing password for "c##ora$rman_bkp" 
    Old password: 
    New password: 
    Retype new password: 
    Password changed 
    

    내 코드가 테스트되었으며 다시 정상적으로 작동했습니다. 오라클 소프트웨어의 또 다른 믿을 수없는 버그. 그들의 품질 보증은 절대로 바르게하지 않습니다. 나는 그들이 심지어 정확한 테스트 계획조차 가지고 있지 않다는 것을 확신하고있다. 그렇지 않으면 만료 된 패스워드를 0으로 나눈 것과 같은 심각한 오류를 잡을 것이다.