【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吗?
