技术开发 频道

使用Oracle和Java 5时出现的Bug


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表中查询数据:
select * from test_table VALUE ----- 1250000
    我们发现上面的数字丢了一个0,这个问题仅仅出现在一个小的范围内,如果数字在1250000到125000000之间,结果就是正确的,在Java1.4的版本中就不会存在这个问题. 

    我们把这个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吗?


0
相关文章