如何在Java 5和6中使JDBC驱动程序工作?

Java 6附带JDBC 4,它与以前版本的Java附带的JDBC不向后兼容。

我们有一个JDBC驱动程序,它必须同时支持Java 5和Java 6.如果我在驱动程序中实现新接口,它在Java 5中不起作用,因为接口也使用新类。 所以我们有两个版本的驱动程序。 有没有办法让Java 5和6都有一个jar?

如果您实现JDBC 3.0驱动程序,并且您的客户端在Java 6中运行它,那么如果它们调用任何新的JDBC 4.0方法,它们将会出错。 这种情况很少见,因为这些新方法并不经常使用,但如果你想要万无一失,下面的解决方案(这是一个黑客攻击)应该可以解决这个问题:

  1. 使用java 5编译(如果使用java 6编译并在java 5中运行,则会出现版本不匹配错误)
  2. 实现您的普通JDBC 3.0驱动程序,但也包括新JDBC 4.0方法的实现(注意:这将导致编译错误,因为java 5没有定义像java.sql.NClob这样的类型)
  3. 在一个单独的项目中创建新的JDBC 4.0接口(如java.sql.NClob)的精确副本(所以现在有2个项目:原始项目和这个项目)
  4. 将两个项目一起编译,并为每个项目创建一个单独的jar:
    • 你的JDBC驱动程序实现(保持这个jar)
    • 新的JDBC 4.0接口(丢弃此jar)

我们可以丢弃JDBC 4.0接口jar,因为:

  • 在Java 6中,定义了那些新的JDBC 4.0接口
  • 在Java 5中,JDBC 3.0接口没有定义新方法(如Connection.createNClob()),因此您的用户不会调用它们

唯一可能的问题可能是java 5类加载器。 如果找不到新的JDBC 4.0接口(如java.sql.NClob),它可能会失败。 我不认为这会在Sun JVM中发生,除非你调用一个返回其中一个新接口的方法,所以你应该很好。 如果我错了,这是一个问题,那么在Java 5中运行时,只需将丢弃的jar(定义新的JDBC 4.0接口的jar)放在类路径上。