`
lovejuan1314
  • 浏览: 338432 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于更换jdbc驱动的一些碎碎念

阅读更多
关于更换jdbc驱动的一些碎碎念

由于项目中代码对中文支持不好,而且用户在使用时会不经意间粘贴一些特殊字符,一旦将这些字符放在一个链接里时,就会出现乱码.主要问题集中反应在Orcle 10g的jdbc驱动中一个方法在对字符做转换时抛出异常.据Oracle官方说,该异常是该驱动版本的一个bug,而且bug list中写的很明确.在进一步搜索后发现,11g的最新驱动ojdbc6已经修复了这个问题,于是马上换上这个驱动进行测试,结果所有都显示正常.

然而,就是在更换驱动的时候,出现了问题.

第一,我们使用的数据库是Oracle 10g.

第二,程序不能增删改查,体现在插入时出现主键id冲突.

我觉得,单纯从更换数据库驱动的角度来说,新版本的驱动不会造成这个问题.它的升级只能说功能的增强,不应该会出现连增删改查都完成不了! 如果说数据库版本不一致的话,只会出现你调用了新版本特性的特定功能而数据库不支持所返回的异常,更不应该是这个异常了.

经过仔细分析,我们的程序为了保证程序可以支持不同的数据而没有使用到数据库的特殊特定功能,比如Oracle的Sequence或者Postgresql的serial等.而且程序使用了proxool连接池.

所以,我觉得,问题出现在服务器的缓存机制,即我们打破服务器缓存机制的平衡.举例说,用户A刚新插入一条记录,连接池会缓存其数据库链接存入池中备用,而且我觉得服务器还会缓存一个最大值的数值(这个是代码里的),当再有人想插入的时候,它会直接从池中重用这个链接然后中拿到这个最大值,如果链接失效或者数值不是最新的它才会重新建立链接,或者再重用链接来更新缓存.

而现在的问题时,他重用的时候拿到的这个最大值不是最新的,所以才会造成服务器日志里抛出的主键冲突异常.而实际上,它又隐性的执行了重新获取最大值的请求而完成了插入工作,也就是它实际上是成功了,但是一堆的日志报错以及页面的反应延迟还是让人很郁闷.

因此,在我们彻底清空服务器缓存,包括tomcat的缓存,以及proxy等的缓存再重新测试时,一切都又正常了.

后来问题的反复还是因为管理员在重新部署新版本的时候,忘记清理缓存而导致的.

因此更换使用最新jdbc驱动的时候,一定要记得清理服务器的缓存(如果使用和数据库版本一致的驱动则一般来说不用做这些工作).否则,在盲目打乱它的缓存机制后,它只会给你许多意想不到的异常.
仅对必要而且必须更换和升级jdbc驱动时推荐的做法,一般而言,还是使用和数据库版本一致的驱动,免去诸多麻烦.

对很多地方理解的不是很深刻,小记一下,自娱自乐.

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics