关于更换jdbc驱动的一些碎碎念
由于项目中代码对中文支持不好,而且用户在使用时会不经意间粘贴一些特殊字符,一旦将这些字符放在一个链接里时,就会出现乱码.主要问题集中反应在Orcle 10g的jdbc驱动中一个方法在对字符做转换时抛出异常.据Oracle官方说,该异常是该驱动版本的一个bug,而且bug list中写的很明确.在进一步搜索后发现,11g的最新驱动ojdbc6已经修复了这个问题,于是马上换上这个驱动进行测试,结果所有都显示正常.
然而,就是在更换驱动的时候,出现了问题.
第一,我们使用的数据库是Oracle 10g.
第二,程序不能增删改查,体现在插入时出现主键id冲突.
我觉得,单纯从更换数据库驱动的角度来说,新版本的驱动不会造成这个问题.它的升级只能说功能的增强,不应该会出现连增删改查都完成不了! 如果说数据库版本不一致的话,只会出现你调用了新版本特性的特定功能而数据库不支持所返回的异常,更不应该是这个异常了.
经过仔细分析,我们的程序为了保证程序可以支持不同的数据而没有使用到数据库的特殊特定功能,比如Oracle的Sequence或者Postgresql的serial等.而且程序使用了proxool连接池.
所以,我觉得,问题出现在服务器的缓存机制,即我们打破服务器缓存机制的平衡.举例说,用户A刚新插入一条记录,连接池会缓存其数据库链接存入池中备用,而且我觉得服务器还会缓存一个最大值的数值(这个是代码里的),当再有人想插入的时候,它会直接从池中重用这个链接然后中拿到这个最大值,如果链接失效或者数值不是最新的它才会重新建立链接,或者再重用链接来更新缓存.
而现在的问题时,他重用的时候拿到的这个最大值不是最新的,所以才会造成服务器日志里抛出的主键冲突异常.而实际上,它又隐性的执行了重新获取最大值的请求而完成了插入工作,也就是它实际上是成功了,但是一堆的日志报错以及页面的反应延迟还是让人很郁闷.
因此,在我们彻底清空服务器缓存,包括tomcat的缓存,以及proxy等的缓存再重新测试时,一切都又正常了.
后来问题的反复还是因为管理员在重新部署新版本的时候,忘记清理缓存而导致的.
因此更换使用最新jdbc驱动的时候,一定要记得清理服务器的缓存(如果使用和数据库版本一致的驱动则一般来说不用做这些工作).否则,在盲目打乱它的缓存机制后,它只会给你许多意想不到的异常.
仅对必要而且必须更换和升级jdbc驱动时推荐的做法,一般而言,还是使用和数据库版本一致的驱动,免去诸多麻烦.
对很多地方理解的不是很深刻,小记一下,自娱自乐.
分享到:
相关推荐
mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上版本数据库 mysql jdbc 驱动 适用于5.7及以上...
Oracle12C JDBC驱动是连接Java应用程序与Oracle数据库12c Release 2 (12.2.0.1) 的关键组件。JDBC(Java Database Connectivity)是Java平台中的一个标准API,它允许Java程序通过Java语言来访问和操作数据库。在...
Access的JDBC驱动是Java数据库连接(Java Database Connectivity, JDBC)的一种实现,它允许Java程序与Microsoft Access数据库进行交互。在JDK 1.8之后,Oracle公司不再默认提供对ODBC(Open Database Connectivity...
Oracle 12c JDBC驱动包是Oracle数据库与Java应用程序之间的桥梁,它允许Java开发者通过编写Java代码来访问和操作Oracle数据库。在Java编程环境中,JDBC(Java Database Connectivity)是标准API,用于连接各种类型的...
mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及...
在本压缩包"impala数据库JDBC驱动集"中,我们很显然会找到用于连接和操作Impala数据库的JDBC驱动程序。 Impala的主要特点包括其并行查询执行模型,它能够快速地处理PB级别的数据,而无需将数据从HDFS或HBase中提取...
在本文中,我们将深入探讨Sybase数据库与JDBC驱动的相关知识点。 首先,JDBC驱动是Java应用程序与数据库之间通信的桥梁,它提供了Java API来执行SQL语句并处理结果。对于Sybase数据库,JDBC驱动主要有以下几种类型...
本篇将详细介绍达梦数据库JDBC驱动包及其在与MySQL数据库交互中的作用。首先,我们需要了解JDBC(Java Database Connectivity),它是Java语言连接数据库的标准接口,由Oracle公司开发,使得Java开发者能够通过标准...
本压缩包包含了适用于不同数据库系统的JDBC驱动,包括sqlserver2005-jdbc驱动、sqlserver2008-jdbc驱动、mysql-jdbc驱动以及oracle驱动,这使得开发者能够方便地与这些数据库进行通信。 1. SQL Server JDBC驱动: ...
在Java应用中,JDBC驱动程序扮演着至关重要的角色,它作为Java代码和数据库之间的桥梁,使得数据的查询、更新、插入和删除等操作变得简单。 "jdbc驱动jar包.zip"是一个包含JDBC驱动程序的压缩文件。通常,这个...
MySQL 8.0 JDBC驱动是Java应用程序连接MySQL数据库的关键组件,它允许程序通过Java Database Connectivity (JDBC) API与MySQL数据库进行交互。JDBC是一种Java编程接口,它为开发人员提供了一种标准的方法来访问各种...
KingbaseV8 JDBC驱动是连接KingbaseV8数据库的重要组件,允许Java应用程序通过JDBC(Java Database Connectivity)接口与数据库进行交互。JDBC是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了...
SQL Server 2008 JDBC驱动还支持一些高级特性,如读写分离、分布式事务、大数据类型处理(如XML和二进制数据)、JDBC批处理以及SQL Server特有的功能(如Service Broker或Integration Services)。 9. **错误处理*...
本文将详细探讨“mysql5.7.20的jdbc驱动”这一主题,包括其重要性、功能、版本兼容性以及如何在Java项目中使用。 首先,MySQL 5.7.20 JDBC驱动程序是Java应用程序连接到MySQL数据库的关键组件。它提供了Java API,...
数据库JDBC驱动程序包是一个非常重要的组件,尤其对于Java Web开发者而言,它是连接各种数据库的基础。JDBC(Java Database Connectivity)是Java编程语言中的一个标准API,它允许Java应用程序与各种类型的数据库...
Oracle JDBC驱动包是用于Java应用程序与Oracle数据库之间通信的重要组件。它遵循Java Database Connectivity (JDBC) API标准,使得开发者可以使用Java语言高效地访问Oracle数据库。本文将深入探讨Oracle JDBC驱动的...
PostgreSQL JDBC 驱动包,最新的基于 jdk 1.6 的 jdbc 驱动包
同时,驱动还支持一些高级特性,如批处理、游标、存储过程调用、事务隔离级别设置等,以满足复杂的应用场景需求。因此,对于那些基于Java平台并需要与SQL Server 2008交互的项目,这个驱动包是不可或缺的工具。
《神通通用数据库JDBC驱动与手册详解》 神通通用数据库是一款在中国广泛应用的数据库管理系统,它提供了高效、稳定的数据存储和处理能力。在Java应用程序中,我们通常会利用Java Database Connectivity(JDBC)技术...