Java >> Java tutorial >  >> Tag >> Jdbc

Bruger du flere Oracle JDBC-drivere i én Java-applikation?

Hvis du ikke registrerer driverne, undgår du, at de indlæses af den samme klasseindlæser.

Derefter kan du oprette forbindelser ved at bruge de to forskellige drivere ved at indlæse dem gennem separate klasseindlæsere:

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

Gør derefter det samme for Oracle 12-driveren.

Du måske også stadig kunne bruge den "anden" driver gennem DriverManager , men det er jeg ikke sikker på.

Der er nogle hjørnetilfælde, hvor det bliver en smule kompliceret at få adgang til Oracle-specifikke klasser, men generelt kan du bruge de forbindelser, der er oprettet gennem dette uden problemer.


Jeg ser to forskellige løsninger til forskellige konstellationer.

(Brug af samme (?) klasser med forskellige versioner ville normalt være en ideel brugssag for OSGi, eller hvis din applikation er en NetBeans RCP, deres modulære system. Dette fungerer ved at bruge klasseindlæsere, der adskiller softwaren i moduler, så en i forskellige moduler kan fylde forskellige krukker med forskellige versioner af det samme produkt.)

(Alternativt kan man have en anden applikation med sin egen Oracle-krukke, der tilgås ved hjælp af RMI.)

Du kan bruge den samme teknik:enten skriv din egen delegerende ClassLoader der indlæser den rigtige jar, eller brug den konceptuelt enklere RMI der dog kræver styring af systemressourcer.

  1. Brug ikke import fra leverandørerne; det er i modstrid med JDBC's leverandøruafhængighed.

  2. Sørg for, at javax.sql grænseflader kommer fra en java-ee jar.

Valg af ClassLoader-løsningen:

Det ville være bedst at få din egen delegerende driver til at sige med en protokol jdbc:myswitch:8: ... . Det kunne derefter bruge to forskellige klasseindlæserforekomster. For eksempel ved at bruge en URLClassLoader med en file:/... sti.

Man kunne lave to separate forekomster af den tilpassede delegeringsdriver, så man kan bruge Delegate-mønsteret.

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 tag