我写了一个应用程序,它工作了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;引发异常java.lang.NoSuchMethodError:java.sql.Connection.isValid(I)Z.
请注意,唯一不同的是JRE(前者是1.6,新的是1.7)
解决方法
奇.它显然引用了java.sql.Connection中的
isValid(int)
方法
在你的堆栈跟踪中我也看到了一个I和一个Z:java.sql.Connection.isValid(I)Z
那些对应于int(I)和boolean(Z),这是java.sql.Conneciton中方法的确切签名.所以一种方法肯定被称为.注意:括号右边的字符表示方法的返回类型,此方法返回boolean(Z).
以下是我能想到的唯一想法:
>您提供的源代码与您环境中实际运行的代码不对应. (例如,也许你的“补丁”是从来没有真正申请?)>此外,您的环境可能正在运行Java 5,因为isValid(int)方法在Java 6之前不会显示.