2013-04-17 28 views
7

Bir uygulama yazdım, 3 yıl boyunca iyi çalışıyordu, ama! bu uygulamayı çalıştırmak için deneyin bugün beklenmedik bir durum oluşturuldu: MySQLConnectionPatch.java/SearchInCacheTalihsiz Java İstisnası: 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; 
} 

olduğunu

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) 

kod I niçin boolean isValid = false; zam İstisna java.lang.NoSuchMethodError: java.sql.Connection.isValid(I)Z merak ediyorum. tek şey farklı

Not (eski 1.6 idi ve yeni 1,7 olan)

+1

Uygulama 3 yıldır iyi çalışıyordu ve şimdi çöküyor? Bir şey MySQL jdbc kitaplığını değiştirdiniz kod/sistem/bağımlı kitaplığı – Apurv

+0

değiştirmiş olmalı? –

+1

Uygulamanızın bir şekilde 1.7 değil 1.5 olduğunu mu kullanıyorsunuz? Bu yöntem sadece 1.6'dan beri var olmuştur. –

cevap

0

Sabit! Ve tahmin et ne oldu! A copy of old jre (1.5.08), HP Yazıcı sürücüsüne yerleştirildi ve adres, ortam değişkenine eklendi!

+0

Bu yüzden, sadece tek bir proje için jre kullanıyorum ve bunu herhangi bir sistem varsayılanı ile değil de bununla başlatacağım. Tebrikler; – Sammy

5

Tek JRE. Bunlar int karşılık java.sql.Connection.isValid(I)Z

(I) ve boolean (Z), java.sql.Conneciton içinde yöntem için tam imza: Açıkça Ben de bir I ve Z bakın sizin stacktrace olarak java.sql.Connection

yılında isValid(int) yöntemine başvuru oluyor . Yani kesinlikle bir yöntem çağrılıyor. Not: parantezin sağındaki karakter, yöntemin dönüş türünü gösterir ve bu yöntem, boolean (Z) değerini döndürür. İşte

Aklıma gelen tek fikir: gerçekte ortamda çalışan ne karşılık gelmez sunulan

  1. kaynak kodu. (Örneğin, belki "yama" gerçekten uygulanan asla?) Ayrıca

  2. , ortamınızın isValid(int) yöntem

1

Maalesef Java 6. kadar görünmüyor çünkü Java 5 çalışıyor olabilir Yorum yapamam.

Sadece jvm'yi ve sınıf dosyalarınızın hiçbirini değiştirmediniz mi? Lütfen kaynakları bir IDE'de (ayrıca bağımlılıkların yerini almayı unutmayın), kaynakların yeniden derlenmesi ve 1.7 ile gelen yeni imzalar hakkında bilgi edinmesini sağlayın.

Diğerleri için, Julius Davies ile giderim. Java isValid() 'i çağırmalıdır (ilginç olur, ne olur, eğer boolean name olarak değiştirirsenizOtherThanAMethodOfConnection = false;).

İlgili konular