2013-04-17 4 views
7

3 년 동안 제대로 작동했지만 응용 프로그램을 작성했지만! 그들은이 응용 프로그램을 실행하려고 오늘, 예기치 않은 예외가 발생합니다 : MySQLConnectionPatch.java/SearchInCache이불행한 Java 예외 : java.lang.NoSuchMethodError

private Connection SearchInCache(String key) { 

    Connection result = null; 
    try{ 
     if (!connections.isEmpty()) 
      result = connections.get(key); 
    } catch (Exception ex){ 
    } 
    if (result != null){ 
     boolean isValid = false; /** THIS IS LINE 103 WHERE EXCEPTION RAISED **/ 
     try { 
      Statement s = result.createStatement(); 
      if (s.execute("SHOW STATUS;")){ 
       isValid = true; 
      } 
      s.close(); 
     } catch (Exception ex) { 
      isValid = false; 
     } 

     if (!isValid){ 
      connections.remove(key); 
      messageLog.stdwar("MySQL_PATCH: ONE CONNECTION EXPIRED :: force close"); 
      try { 
       result.close(); 
      } catch (SQLException ex) { 
       messageLog.stderr("MySQL_PATCH: CLOSING CONNECTION ERROR: "+ex.getMessage()); 
      } 
      result = null; 
     } 
    } 
    return result; 
} 

입니다

INFO | jvm 1 | 2013/04/17 10:02:40 | Exception in thread "Thread-1" java.lang.NoSuchMethodError: java.sql.Connection.isValid(I)Z 
INFO | jvm 1 | 2013/04/17 10:02:40 | at lib.MySQLConnectionPatch.SearchInCache(MySQLConnectionPatch.java:103) 
INFO | jvm 1 | 2013/04/17 10:02:40 | at lib.MySQLConnectionPatch.getConnection(MySQLConnectionPatch.java:79) 
INFO | jvm 1 | 2013/04/17 10:02:40 | at lib.SQLManager.establishSqlConnection(SQLManager.java:62) 
INFO | jvm 1 | 2013/04/17 10:02:40 | at lib.SQLManager.establishSqlConnection(SQLManager.java:30) 
INFO | jvm 1 | 2013/04/17 10:02:40 | at lib.tasks.classes.sql.executeQuery.execute(executeQuery.java:49) 
INFO | jvm 1 | 2013/04/17 10:02:40 | at Components.TTask.run(TTask.java:86) 
INFO | jvm 1 | 2013/04/17 10:02:40 | at Components.ThreadTask.run(ThreadTask.java:29) 
INFO | jvm 1 | 2013/04/17 10:02:40 | at lib.tasks.classes.fori.execute(fori.java:66) 
INFO | jvm 1 | 2013/04/17 10:02:40 | at Components.TTask.run(TTask.java:86) 
INFO | jvm 1 | 2013/04/17 10:02:40 | at Components.ThreadTask.run(ThreadTask.java:29) 
INFO | jvm 1 | 2013/04/17 10:02:40 | at lib.tasks.classes.fori.execute(fori.java:66) 
INFO | jvm 1 | 2013/04/17 10:02:40 | at Components.TTask.run(TTask.java:86) 
INFO | jvm 1 | 2013/04/17 10:02:40 | at Components.ThreadTask.run(ThreadTask.java:29) 
INFO | jvm 1 | 2013/04/17 10:02:40 | at Components.ThreadTask.run(ThreadTask.java:44) 
INFO | jvm 1 | 2013/04/17 10:02:40 | at LauncherService.LaunchService.run(LaunchService.java:38) 

코드 의 내가 왜 boolean isValid = false; 인상 예외 java.lang.NoSuchMethodError: java.sql.Connection.isValid(I)Z을 궁금해. 유일한 것은 다른

는 (구 1.6, 그리고 새로운 1.7이다)

+1

응용 프로그램이 3 년간 정상적으로 작동하고 있으며 이제 충돌이 발생합니까? 무언가가 코드/시스템/종속 라이브러리 – Apurv

+0

을 변경 했어야합니다. MySQL jdbc 라이브러리를 변경 했습니까? –

+1

응용 프로그램이 1.5가 아닌 1.7을 사용하고 있습니까? 이 방법은 1.6 이후에만 존재했습니다. –

답변

0

수정 됨 !! 그리고 무엇을 맞춰라! A copy of old jre (1.5.08)은 HP 프린터 드라이버에 포함되었으며 주소는 PATH 환경 변수에 추가되었습니다!

+0

그렇기 때문에 나는 하나의 프로젝트에 대해서도 jre를 사용하고, 어떤 종류의 system-default가 아닌이 프로젝트로 시작한다. 축하합니다. 그걸 발견했습니다 ;-) – Sammy

5

홀수 JRE입니다. 사람들은 int로 해당 java.sql.Connection.isValid(I)Z

(I) 및 부울 (Z), java.sql.Conneciton의 방법에 대한 정확한 서명 : 그것은 분명히 나는 ​​또한 I와 Z를 참조하여 스택 트레이스에 java.sql.Connection

에서 isValid(int) 방법을 참조 할 것 . 따라서 메소드가 확실히 호출되고 있습니다. 주 : 괄호의 오른쪽에있는 문자는 메서드의 반환 유형을 나타내며이 메서드는 부울 (z)을 반환합니다. 여기

은 내가 생각할 수있는 유일한 아이디어입니다 : 당신은 실제로 사용자 환경에서 실행중인 무엇에 해당하지 않는되게

  1. 소스 코드. (예를 들면, 어쩌면 당신의 "패치" 정말 적용되지 않습니다?) 또한

  2. , 환경은 isValid(int) 방법은

1

죄송합니다 자바 6까지 표시되지 않기 때문에, 자바 5 실행 중일 수 있습니다 , 나는 논평 할 수 없다.

방금 ​​jvm을 대체하고 클래스 파일을 대체하지 않았습니까? IDE에서 소스를 시도하십시오 (의존성 등을 대체해야 함). 따라서 소스가 다시 컴파일되고 1.7과 함께 제공되는 새로운 시그니처에 대해 알 수 있습니다.

나머지는 Julius Davies와 함께합니다. Java는 isValid()를 호출해야합니다 (재미있을 것입니다. 부울 nameOtherThanAMethodOfConnection = false로 변경하면 어떻게됩니까?).

관련 문제