7

私はアプリケーションを書きましたが、それは 3 年間正常に動作していましたが、! 今日、彼らがこのアプリケーションを実行しようとすると、予期しない例外が発生しました:

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)

MySQLConnectionPatch.java/SearchInCacheのコードは

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;
}

なぜboolean isValid = false;Exception を発生させるのだろうかjava.lang.NoSuchMethodError: java.sql.Connection.isValid(I)Z

唯一の違いは JRE であることに注意してください (以前は 1.6 で、新しいものは 1.7 です)。

4

3 に答える 3

5

奇数。明らかにisValid(int)メソッドを参照していますjava.sql.Connection

あなたのスタックトレースには、I と Z も表示されます。 java.sql.Connection.isValid(I)Z

これらは int (I) と boolean (Z) に対応し、 のメソッドの正確なシグネチャですjava.sql.Conneciton。したがって、メソッドは間違いなく呼び出されています。注: 括弧の右側の文字はメソッドの戻り値の型を示し、このメソッドはブール値 (Z) を返します。

私が考えることができる唯一のアイデアは次のとおりです。

  1. あなたが提示したソースコードは、あなたの環境で実際に実行されているものに対応していません. (たとえば、「パッチ」が実際に適用されていない可能性がありますか?)

  2. また、isValid(int)メソッドは Java 6 まで表示されないため、環境で Java 5 が実行されている可能性があります。

于 2013-04-17T06:52:04.470 に答える
1

すみません、コメントできません。

jvmを置き換えただけで、クラスファイルは置き換えませんでしたか? ソースを IDE で試してください (依存関係なども置き換えることを忘れないでください)。これにより、ソースが再コンパイルされ、1.7 に付属する新しい署名について知ることができます。

残りはジュリアス・デイビスと一緒に行きます。Java は isValid() を呼び出す必要があります (ブール値の nameOtherThanAMethodOfConnection = false; に変更するとどうなるか、興味深いでしょう)。

于 2013-04-17T07:20:04.830 に答える