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. 此外,您的环境可能正在运行 Java 5,因为该isValid(int)方法直到 Java 6 才出现。

于 2013-04-17T06:52:04.470 回答
1

抱歉,我无法发表评论。

您是否只是替换了 jvm 而没有替换任何类文件?请在 IDE 中尝试您的源代码(记得替换依赖项等),以便重新编译您的源代码并了解 1.7 附带的新签名。

其余的,我和朱利叶斯戴维斯一起去。Java 应该调用 isValid() (如果将其更改为布尔值 nameOtherThanAMethodOfConnection = false; 会发生什么会很有趣)。

于 2013-04-17T07:20:04.830 回答
0

固定的!!你猜怎么着!A copy of old jre(1.5.08) 嵌入在 HP 打印机驱动程序中,并将地址添加到PATH环境变量中!

于 2013-05-06T14:42:31.447 回答