Java >> Java チュートリアル >  >> Tag >> Jdbc

1 つの Java アプリケーションで複数の Oracle JDBC ドライバーを使用していますか?

ドライバーを登録しないと、同じクラスローダーによってドライバーがロードされるのを回避できます。

次に、2 つの異なるドライバーを別々のクラスローダーを介してロードすることにより、それらを使用して接続を作成できます。

// 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);

次に、Oracle 12 ドライバーに対して同じことを行います。

できる DriverManager まで「その他」のドライバーを引き続き使用することもできます 、しかしそれについてはよくわかりません。

Oracle 固有のクラスへのアクセスが少し複雑になるまれなケースもありますが、一般的には、これによって作成された接続を問題なく使用できます。


星座ごとに 2 つの異なる解が見えます。

(通常、異なるバージョンで同じ (?) クラスを使用することは、OSGi の理想的な使用例です。アプリケーションが NetBeans RCP の場合は、モジュラー システムです。これは、ソフトウェアをモジュールに分割するクラス ローダーを使用して機能します。異なるモジュールでは、同じ製品の異なるバージョンで異なる jar をロードする場合があります。)

(または、RMI を使用してアクセスされる独自の Oracle jar を持つ別のアプリケーションを使用することもできます。)

同じ手法を使用することもできます:独自の委譲 ClassLoader を作成するか 適切なjarをロードするか、概念的に単純な RMI を使用します ただし、システム リソースの管理が必要です。

だから

<オール> <リ>

ベンダーからのインポートは使用しないでください。これは、JDBC のベンダー非依存性に反します。

<リ>

javax.sql であることを確認してください インターフェイスは java-ee jar から取得されます。

ClassLoader ソリューションの選択:

独自の委任ドライバーにプロトコル jdbc:myswitch:8: ... を使用させるのが最善です .その後、2 つの異なるクラス ローダー インスタンスを使用できます。たとえば、file:/... で URLClassLoader を使用する

カスタム委任ドライバーの 2 つの個別のインスタンスを作成できるため、1 つは委任パターンを使用できます。

public static class MySwitchDriver implements Driver {

    private final String oraURIPrefix;
    private final Driver delegateDriver;

    public MySwitchDriver(String oraURIPrefix) {
        this.oraURIPrefix = oraURIPrefix; // "8:" or "12:"
        String jarFileURI = oraURIPrefi.equals("8")
            ? "file:/... .jar" : "file:/... .jar";
        URLClassLoader classLoader = new URLClassLoader(...);
        delegateDriver = classLoader.loadClass(
                "oracle.jdbc.driver.OracleDriver", true);
        DriverManager.registerDriver(this);
    }

    private String delegateURL(String url) {
        // Something safer than this:
        return "jdbc:" + url.substring(
                "jdbc:myswitch".length
                + oraURIPrefix.length);
    }

    @Override
    public Connection connect(String url, Properties info)
            throws SQLException {
        String url2 = delegateURL(url);
        Properties info2 = info;
        return delegateDriver.connect(url2, info2);
    }

    @Override
    public boolean acceptsURL(String url) throws SQLException {
        return url.startsWith("jdbc:myswitch:" + oraURIPrefix)
            && delegateDriver.acceptsURL(delegateURL(url));
    }
...
}

Java タグ