服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

使用oracle和java 5时出现的bug


    如果你目前正使用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_tablevalue-----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吗?

扫描关注微信公众号