Oracle JDBC驱动程序版本混乱问题

20
Oracle为什么要为每个数据库版本提供不同的JDBC驱动程序版本(例如ojdbc14.jar)?这些文件的大小都不同,因此内容也可能不同。
背景:当保存数据时(我们猜测是时间戳),我们会收到一个随机且看起来无法重现的“无效数字”错误。但它不是特定的语句。大多数情况下,保存正常。只有一次每月出现一个看似无害的语句将失败。
因此,我更仔细地查看了Oracle的下载站点,并注意到尽管文件共享相同的名称,但没有一个文件大小匹配。
我们的产品在由客户维护的数据库上运行,即客户正在运行的版本和补丁就是它的版本。
那么我们使用哪个驱动程序呢?最新的(Oracle 11g)-尽管通常是9i和10g数据库?
为什么他们不将所有版本链接到相同的“一种驱动适用于所有”文件中呢?或者是否存在微小的差异导致类似于我们的随机错误的影响?
编辑:我对9i数据库的说法是错误的。

4
驱动程序文件名中的“版本”指的是它们针对的Java版本,而不是驱动程序自身的版本。我养成了在下载它们时将带有驱动程序版本的jar文件保存的习惯,例如ojdbc6-11.2.0.3.0.jar。只需选择最新的驱动程序即可。 - user330315
3个回答

26

这些驱动程序“可以与”几乎任何现代数据库版本进行通信。所以你是说我只需选择最新版本并祈祷它具有我需要的所有错误修复? ...而我对9i的看法是错误的。我们在去年退役了它们。 - Stroboskop
我怀疑这不是JDBC驱动程序的错误。我会检查代码中是否存在数字转换错误,例如“数字转字符串”,“字符串转日期”等。我们是在谈论ORA-01722,无效数字吗?如果是这样,我会检查调试日志,而不关心驱动程序版本冲突。 - Oliver Michels
1
是的,这是ORA-01722错误。我们使用PreparedStatements,这意味着类型转换都由驱动程序完成。而且同样的语句99.9%的时间都能正常工作。当然,我们首先查看了我们的代码,但似乎没有什么异常情况。 - Stroboskop
随机的ORA-01722错误往往是由于依赖隐式数据类型转换引起的。不要这样做。传递正确的值/对象,永远不要依赖于隐式转换。即使不同的NLS设置也可能导致此错误(因此它可能在A系统上工作,但在B系统上不起作用)。 - user330315

14
在 ojdbc14.jar、ojdbc5.jar、ojdbc6.jar、ojdbc7.jar 和 ojdbc8.jar 中的数字,指的是所使用的 Java 编译器的版本。随着每个 Java 版本的推出,都会带来新的 JDBC API,因此这些数字对于了解可以期望什么非常有用。例如,在 Java 8 中,有一个称为 executeLargeUpdate 的新方法在 java.sql.PreparedStatement 中。该方法将在 ojdbc8.jar 中实现但不会在 ojdbc7.jar 中实现。同时如果你的运行时使用的是 Java 7,则不能使用 ojdbc8.jar 否则会遇到 java.lang.UnsupportedClassVersionError 错误。这就是 Oracle 在 jar 文件名中包含这些数字的原因。还需注意,如果想知道该 jar 来自哪个 Oracle 数据库版本,可以运行 java -jar ojdbc8.jar。数据库和驱动程序向后兼容(最多向后兼容 1 个主要版本),因此尽管建议如此,但不必在两个层面上使用同一产品版本。

1
ojdbc14 jar 是使用哪个 Java 编译器编译的? - Gaurav
1
使用JDK 1.4中的编译器。 - Jean de Lavarene

3
当我们将Oracle数据库从8.1.7升级到10.2.0时,我能够使用相同的Oracle jdbc驱动程序(ojdbc14.jar)。因此,他们的jdbc驱动程序同时支持相当多的版本。当然,某些驱动程序可能存在缺陷,但计划是同时支持更多的版本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接