关于更换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及以上...
这样的集成意味着开发者可以利用JDBC驱动包在这些环境中执行数据库操作,而无需担心驱动与应用服务器之间的兼容性问题。 除了核心功能外,该JDBC驱动包还提供了诸如连接池管理、自动重连以及高级连接属性配置等高级...
Access的JDBC驱动是Java数据库连接(Java Database Connectivity, JDBC)的一种实现,它允许Java程序与Microsoft Access数据库进行交互。在JDK 1.8之后,Oracle公司不再默认提供对ODBC(Open Database Connectivity...
为了实现Java应用程序与Oracle数据库之间的连接,Oracle公司提供了JDBC(Java Database Connectivity)驱动。JDBC是一种Java API,用于连接和执行查询与数据库的操作。随着技术的不断更新,Oracle数据库也在不断地...
Oracle12C JDBC驱动是连接Java应用程序与Oracle数据库12c Release 2 (12.2.0.1) 的关键组件。JDBC(Java Database Connectivity)是Java平台中的一个标准API,它允许Java程序通过Java语言来访问和操作数据库。在...
mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及以下数据库 mysql jdbc 驱动 适用于5.6版本及...
SQL Server JDBC驱动是Microsoft公司为SQL Server数据库开发的一套Java数据库连接驱动,它允许Java应用程序通过Java数据库连接API(JDBC)与SQL Server数据库进行交互。JDBC是Java中用于数据库交互的标准API,它提供...
Oracle 12c JDBC驱动包是Oracle数据库与Java应用程序之间的桥梁,它允许Java开发者通过编写Java代码来访问和操作Oracle数据库。在Java编程环境中,JDBC(Java Database Connectivity)是标准API,用于连接各种类型的...
在本文中,我们将深入探讨Sybase数据库与JDBC驱动的相关知识点。 首先,JDBC驱动是Java应用程序与数据库之间通信的桥梁,它提供了Java API来执行SQL语句并处理结果。对于Sybase数据库,JDBC驱动主要有以下几种类型...
在本压缩包"impala数据库JDBC驱动集"中,我们很显然会找到用于连接和操作Impala数据库的JDBC驱动程序。 Impala的主要特点包括其并行查询执行模型,它能够快速地处理PB级别的数据,而无需将数据从HDFS或HBase中提取...
本篇将详细介绍达梦数据库JDBC驱动包及其在与MySQL数据库交互中的作用。首先,我们需要了解JDBC(Java Database Connectivity),它是Java语言连接数据库的标准接口,由Oracle公司开发,使得Java开发者能够通过标准...
SQL Server 2000 JDBC驱动是用于Java应用程序与Microsoft SQL Server 2000数据库进行交互的一种关键组件。在Java编程中,JDBC(Java Database Connectivity)接口提供了标准的方法来连接、查询和操作数据库。对于SQL...
本压缩包包含了适用于不同数据库系统的JDBC驱动,包括sqlserver2005-jdbc驱动、sqlserver2008-jdbc驱动、mysql-jdbc驱动以及oracle驱动,这使得开发者能够方便地与这些数据库进行通信。 1. SQL Server JDBC驱动: ...
MySQL 8.0 JDBC驱动是Java应用程序连接MySQL数据库的关键组件,它允许程序通过Java Database Connectivity (JDBC) API与MySQL数据库进行交互。JDBC是一种Java编程接口,它为开发人员提供了一种标准的方法来访问各种...
在Java应用中,JDBC驱动程序扮演着至关重要的角色,它作为Java代码和数据库之间的桥梁,使得数据的查询、更新、插入和删除等操作变得简单。 "jdbc驱动jar包.zip"是一个包含JDBC驱动程序的压缩文件。通常,这个...
Oracle JDBC驱动包是用于Java应用程序与Oracle数据库之间通信的重要组件。它遵循Java Database Connectivity (JDBC) API标准,使得开发者可以使用Java语言高效地访问Oracle数据库。本文将深入探讨Oracle JDBC驱动的...
KingbaseV8 JDBC驱动是连接KingbaseV8数据库的重要组件,允许Java应用程序通过JDBC(Java Database Connectivity)接口与数据库进行交互。JDBC是Java语言中用来规范客户端程序如何访问数据库的应用程序接口,提供了...
关于JDBC驱动: JDBC驱动有四种类型:Type 1(纯Java驱动)、Type 2(混合驱动)、Type 3(网络协议驱动)和Type 4(纯Java网络驱动)。Informix JDBC驱动通常属于Type 4,它完全用Java编写,能直接与数据库的网络...
SQL Server 2008 JDBC驱动还支持一些高级特性,如读写分离、分布式事务、大数据类型处理(如XML和二进制数据)、JDBC批处理以及SQL Server特有的功能(如Service Broker或Integration Services)。 9. **错误处理*...