一尘不染

从SAME VENDOR处理多个JDBC驱动程序

jar

昨天我遇到了一个大问题。在我当前的项目中,我使用Oracle JDBC的ojdbc6实现进行连接,但是我还需要处理例如oracle 8数据库,而使用此JAR完全不可能。您可能会说我应该使用ojdbc14例如,这在某些测试中是正确的,但是让我们假设以后我将需要处理来自同一供应商的2种数据库,但是我们知道BOTH和我都没有现有的实现需要同时加载它们。相同的接口(而且,不仅是相同的接口,相同的类结构,内部只是不同的实现!),相同的URL连接前缀-> JDBC连接将使用一个驱动程序,但我无法加载多个驱动程序。所以现在怎么办?

我的第一个想法是使用不同的类加载器加载JAR,也许我可以使用彼此分离的相同类加载相同的包结构?我并不这么认为,也许那是我的一个愚蠢想法。以后,不仅是JDBC驱动程序,这可能也是一个普遍的问题,所以即使您不能回答我的问题,但是您知道这里缺少什么,请告诉我

即使我可以单独加载具有相同类名的类实现,也可以在创建使用EXACT驱动程序的连接时而不是根据连接URL的前缀查找驱动程序时如何告诉DriverManager?(例如,我的意思是jdbc:oracle:thin)。

我现在感觉很愚蠢,因为我认为这在Java世界中并不是一个完全不寻常的想法,但是我完全不知道如何处理。

谢谢大家


阅读 444

收藏
2020-09-27

共1个答案

一尘不染

实际上,您有两种选择:

您可以尝试从不同的类加载器加载驱动程序。如果您在应用程序中仅需要纯JDBC,那将起作用。我怀疑您将让Hibernate使用这样的设置。

最终,您将必须运行代码,在该代码中需要从两个类加载器中查看实例,在这里,您将得到ClassCastExceptions(具有相同全限定名的两个类从不同的类加载器中加载时是不同的)。

您可以将应用程序拆分为两个。第二个服务器是一台小型服务器,该服务器从原始应用程序获取命令,并将这些命令转换为数据库的JDBC。小型服务器与Oracle 8通讯,而您的应用仅与一个数据库通讯。

这种方法将允许您将两个问题完全分开,但是您将无法在两个数据库上运行联接。

您可以使用CREATE DATABASE LINK在新数据库中链接旧的Oracle 8数据库。这样可以使旧表可见,就好像它们是新数据库的一部分一样。您的应用仅与一个数据库对话,而Oracle在内部处理细节。

也许Oracle 8太旧了,无法使用,但是我绝对会尝试一下。

Oracle JDBC驱动程序可能会更加兼容。当您说“使用此JAR完全不可能”时,您尝试过吗?我过去使用Oracle 10驱动程序连接到Oracle 7。并非所有功能都受支持,但我可以运行标准查询和更新。

2020-09-27