Oracle JDBC Driver 深藏的 Bug

项目架构:

       Webwork + Spring + Hibernate + Oracle10g

问题描述:

       数据库中某个表中的一个字段为 Date类型,PO中映射类型为 java.sql.Date,保存一个特殊的日期的时候出现问题,这个日期为 1940-6-3  ,通过PLSQL 查询数据中的日期数据正确(1940-6-3),但是再通过程序将数据取出,这是这个日期就会变成 1940-6-2 ,而且只有这个日期会出现问题,其他的日期存取都正常。

问题原因:

       经过分析初步怀疑是 Hibernate 在Date类型转换中出现的问题或是Hibernate缓存问题,按照这个思路将Hibernate缓存去掉,再试问题依旧。

      由于对使用了很久的Oracle JDBC Driver 很信任,认为 Driver不会出现问题,但还是报着试试看的想法写了一段直接用JDBC 存取数据的代码,令人惊讶的是这个日期问题依旧, 用 ResultSet的getDate方法和getString方法取出的数据就是不同的,用getString取出的数据是 1940-6-3 ,是正确的,用getDate取出的日期是1940-6-2是错误的,  问题终于找到了,去Oracle网站找新的驱动(其实我们用的驱动也不是很旧),浏览Oracle的网站才发现,Oracle10g的不同的小版本如:Oracle 10.2.0.1 至 Oracle 10.2.0.4 都提供了不同的驱动程序。

解决方法:

      针对不同的数据库版本下载对应的驱动,问题解决!

          http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/index.html

             写了一段小程序,从1900年开始向数据库插入200年的数据(每天一条),然后取出逐条对比没有发现问题!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值