在一个Java应用程序中使用多个Oracle JDBC驱动程序?

tsc*_*ein 6 java oracle jdbc

我想通过JDBC连接到两个不同的Oracle数据库(一个8.0.5.0.0和一个12c).我有两个JDBC驱动程序,可以通过简单的"hello world"应用程序单独成功连接到相应的DB.下面,我将它们放在一个Java应用程序中,遗憾的是它不再起作用(两个驱动程序都被加载).

我已经阅读过这篇文章:处理来自SAME VENDOR的多个JDBC驱动程序.提到的选项1可能有办法,但似乎有一个主要问题:

它似乎OracleDataSource在旧版本8驱动程序中尚不存在,并且仅在更高版本中引入(在12c版本驱动程序中存在).

关于如何使用一个Java应用程序和两个JDBC驱动程序连接这两个Oracle数据库的任何提示?

import java.sql.*;

class db {
    public static void main (String args []) throws SQLException {

        // Oracle 8 connection
        DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
        Connection c1 = DriverManager.getConnection(
                "jdbc:oracle:thin:@some-oracle-8-server:port:sid",
                "my-user",
                "my-password");
        Statement s1 = c1.createStatement ();
        ResultSet r1 = s1.executeQuery ("SELECT banner FROM V$VERSION WHERE banner LIKE 'Oracle%'");
        while (r1.next ()) {
            System.out.println(r1.getString (1));
        }
        c1.close();

        // Oracle 12 connection
        Connection c2 = DriverManager.getConnection(
                "jdbc:oracle:thin:@some-oracle-12-server:port:sid",
                "my-user",
                "my-password");
        Statement s2 = c2.createStatement ();
        ResultSet r2 = s2.executeQuery ("SELECT banner FROM V$VERSION WHERE banner LIKE 'Oracle%'");
        while (r2.next ()) {
            System.out.println(r2.getString (1));
        }
        c2.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢你!

a_h*_*ame 7

如果您没有注册驱动程序,则可以避免它们被同一个类加载器加载.

然后,您可以使用两个不同的驱动程序通过单独的类加载器加载它们来创建连接:

// Oracle 8 connection
File jar = new File("/path/to/oracle8.jar");
URL[] cp = new URL[1];
cp[0] = jar.toURI().toURL();
URLClassLoader ora8loader = new URLClassLoader(cp, ClassLoader.getSystemClassLoader());
Class drvClass = ora8loader.loadClass("oracle.jdbc.driver.OracleDriver");
Driver ora8driver = (Driver)drvClass.newInstance();

Properties props = new Properties();
// "user" instead of "username"
props.setProperty("user", "my-user");
props.setProperty("password", "my-password");
Connection ora8conn = ora8driver.connect("jdbc:oracle:thin:@some-oracle-8-server:port:sid",props);
Run Code Online (Sandbox Code Playgroud)

然后对Oracle 12驱动程序执行相同操作.

也许还可以使用"其他"驱动程序DriverManager,但我不确定.

在某些极端情况下,访问Oracle特定类有点复杂,但一般情况下,您可以使用通过此创建的连接而不会出现任何问题.