java的一个变态问题,怀疑是JVM的BUG 原来是这样子,在开发中用IBM的很多吗?呵呵!顶..学习中.... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可能是db2有特殊要求吧?必须使用 DB2PreparedStatement 这个ibm实现Statement接口的类,直接用con.prepareStatement返回的Statement接口不符合要求。 好像是驱动的问题,DB2很怪,一定要用你安装的数据库自己的带的 JDBC驱动,否则会出很多莫名其妙的问题。甚至连不上。只要你的JDBC是原装的驱动,是不会有问题的。一个原则:如果没有极特殊的情况,不要使用跟数据库有关的native code即使出了问题,也是其他的问题。 我使用了原装的JDBC驱动啊。另外我看了DB2PreparedStatement是implement了PreparedStatement interface的,这样照理代码两种情况执行的结果一定是一样的。 怎么会是这样呢. 真奇怪. JVM是什么版本的? 与DB2的驱动支持的版本是否一致? 用的是J2sdk 1.4.2DB2 8.1 ==不一定的,也许在继承了以后对借口内容做了修改。不明白,我做了classname的打印,DB2PreparedStatement pstat = (DB2PreparedStatement) con.prepareStatement("UPDATE EMPLOYEE SET PHONENO=? WHERE EMPNO=?");// PreparedStatement pstat = con.prepareStatement("UPDATE EMPLOYEE SET PHONENO=? WHERE EMPNO=?"); System.out.println(pstat.getClass().getName());结果是一样的:COM.ibm.db2.jdbc.app.DB2PreparedStatement 有可能是这样的问题,我去查了db2的文档,他实现的是JDBC 2 而getParameterMetaData是JDBC 3.0的Method,而同时呢DB2的这个东东又实现了其它接口,或者自己独特的Method:getParameterMetaData,这样它就没有实现PreparedStatement的getParameterMetaData而是实现了其它interface或者自己的getParameterMetaData,就出现了如上的怪问题。那位达人证实我的猜想。 我估计应该是你的db2的驱动不支持jdk.1.4.2, 找一下他最新的驱动看看. 换一个JVM就不行了,因为这个接口是jdk1.4才有的。那位有最新的驱动啊? 虽然DB2PreparedStatement继承了PrepareStatement但是由于它返回的是PrepareStatement所以在调用内部方法的时候,有可能有方法没有重写所以就会调用PrepareStatement的方法应该是DB2驱动和jdbc驱动版本不一致的原因你应该去查文档 这个压根就与JVM没有关系,别冤枉他,这个是驱动程序没有提供这个版本的JDBC方法,(比如你用低版本比如DB2符合JDBC2以下的驱动,却去引用在JDBC3的接口方法)当然出错。我以前用过DB2,在6.1版本中缺省安装的是JDBC1,要装JDBC2.0的话,要自己安装呢 现在讨论驱动的问题已经不重要了,问题是这种情况出现了,正不正常,是不是JVM的bug,如果不是为什么会出现这样的结果。因为DB2PreparedStatement是实现了PreparedStatement,而且实现了getParameterMethod这个Method,我看了这个class的bytecode。达人们,继续讨论。 不要怀疑JVM,其实,JVM用谁的都一样,他是用来把字节码解释为本地机器码的一个虚拟CPU罢了,与JDK的版本无关,JDK的版本区别其实是提供的API的区别,这个就象你的CPU是奔几的与你跑WIN95、98、2000、XP等无关一样。不要认为很多驱动程序提供了类似某一个版本的方法头就认为他一定实现了这个方法,我过去反编译过好多驱动程序看过,好多他不实现这个方法,于是方法体中就只有一条语句,抛出异常,够狠吧。 java关于主窗体和子窗体之间的控制 在日历日期仲添加备注,不知怎么实现 2个小问题 public interface Factory<T> {T create();} 这句话,无法编译通过??? 读取xml文件问题! 关于java性能问题,如何在双cpu下提高性能? 请到此领分! 求教,为什么我写的Applet动画运行越来越慢? 大虾版主帮忙看看!! 如何禁止编辑文本框内的消息!谢谢! JDesktopPane和JInternalFrame的问题 jb9调用对象的极初级的问题 一个类调用另一个类内容的问题
否则会出很多莫名其妙的问题。甚至连不上。
只要你的JDBC是原装的驱动,是不会有问题的。
一个原则:如果没有极特殊的情况,不要使用跟数据库有关的native code
即使出了问题,也是其他的问题。
另外我看了DB2PreparedStatement是implement了PreparedStatement interface的,这样照理代码两种情况执行的结果一定是一样的。
DB2 8.1
不明白,我做了classname的打印,
DB2PreparedStatement pstat = (DB2PreparedStatement) con.prepareStatement("UPDATE EMPLOYEE SET PHONENO=? WHERE EMPNO=?");
// PreparedStatement pstat = con.prepareStatement("UPDATE EMPLOYEE SET PHONENO=? WHERE EMPNO=?");
System.out.println(pstat.getClass().getName());
结果是一样的:COM.ibm.db2.jdbc.app.DB2PreparedStatement
那位达人证实我的猜想。
那位有最新的驱动啊?
但是由于它返回的是PrepareStatement所以在调用内部方法的时候,有可能有方法没有重写
所以就会调用PrepareStatement的方法应该是DB2驱动和jdbc驱动版本不一致的原因
你应该去查文档
我以前用过DB2,在6.1版本中缺省安装的是JDBC1,要装JDBC2.0的话,要自己安装呢
因为DB2PreparedStatement是实现了PreparedStatement,而且实现了getParameterMethod这个Method,我看了这个class的bytecode。
达人们,继续讨论。