【IT168技术文档】
如果你目前正使用Oracle作为数据库并且想要升级现有的Java应用程序到Java 5上去,请小心.
Oracle JDBC驱动有一个bug,下面是示例:
首先,创建一个简单的表:
程序代码:CREATE TABLE TEST_TABLE ( VALUE NUMBER )
配置:public static void main(String[] args) throws Exception ...{ Class.forName ("oracle.jdbc.OracleDriver"); Connection connection = null; try ...{ connection = (Connection) DriverManager.getConnection ("some_oci_url",
"user", "****"); String query = "insert into test_table values (?)"; PreparedStatement stmt = connection.prepareStatement(query); BigDecimal bd = new BigDecimal(new Double(12500000).toString()); stmt.setBigDecimal(1, bd); stmt.execute(); } finally ...{ if(connection != null) connection.close(); } }
Oracle 9.2,Java 1.5,JDBC 驱动是从Oracle官方网站上提供的ojdbc14.jar.
所有的都准备好以后,从test_table表中查询数据:
我们发现上面的数字丢了一个0,这个问题仅仅出现在一个小的范围内,如果数字在1250000到125000000之间,结果就是正确的,在Java1.4的版本中就不会存在这个问题.select * from test_table VALUE ----- 1250000
我们把这个bug报告给Oracle技术支持,他们在Oracle 10g上进行了测试,其结果更是糟糕,12500000变成了12,1250000是正确的,125000000变成了12.
Oracle的建议是:
等待在11g的驱动中进行修复或者使用JDK1.4
许多人(一些ORM框架)使用BigDecimal来处理double型数据,上面我使用的例子确实是用来处理double到数字类型转换的Castor JDO方式.如果你最近升级你的JVM到Java 5,就有可能存在这个严重的bug,不幸的是,Oracle准备在11g中修复这个bug,看起来Oracle将会在11g中支持JDK1.5.
很多公司对数据的升级是很慢的,我相信现在很多公司并没有使用10g.我猜测人们可能在2010年以后才可能是用11g,难道我们等到11g支持Java5那个使用才使用Java 5吗?