提取动态加载的JDBC驱动程序的版本

时间:2013-08-12 13:27:38

标签: java jdbc classloader

我正在尝试以编程方式提取不同JDBC驱动程序的次要/主要版本。这些驱动程序在jar文件中动态提供,并按如下方式加载:

URLClassLoader loader = new URLClassLoader(new URL[] { new URL("theNameOfTheJar") });
Driver driver = (Driver) Class.forName("theClassNameOfTheDriver", true, loader).newInstance();

System.out.println(driver.getMajorVersion());
System.out.println(driver.getMinorVersion());

我遇到的问题是,如果应用程序本身使用的是Oracle 11g驱动程序(首先在DriverManager中注册),则之后无法提取正确的Oracle 10g驱动程序版本。在这种情况下,上面的代码总是显示11g驱动程序版本而不是正确的10g版本。

我还试图首先注销所有驱动程序,但没有成功:

    Enumeration<Driver> drivers = DriverManager.getDrivers();

    while(drivers.hasMoreElements()) {

        Driver d = drivers.nextElement();

        try {
            DriverManager.deregisterDriver(d);
        } catch (SQLException ex) {
            // TODO Auto-generated catch block
            ex.printStackTrace();
        }
    }

是否有可能提取正确的驱动程序信息?

2 个答案:

答案 0 :(得分:2)

好的,我终于找到了问题。这只是一个类加载器问题。

默认情况下,类加载器首先询问其父级是否可以加载该类。在我的情况下,“默认”类加载器已经加载了驱动程序。所以URLClassLoader没有从jar文件中加载它。解决方案是将父类加载器显式设置为null:

URLClassLoader loader = URLClassLoader.newInstance(new URL[] { url },
            null);

非常感谢@Evgeniy Dorofeev将我推向正确的方向。

答案 1 :(得分:1)

如果您有2个不同版本但具有相同类名的驱动程序,则只会加载其中一个。您需要两个不同的类加载器来加载这两个类。

相关问题