2012-03-07 28 views
5

Mi sono imbattuto in un grosso problema ieri. Nel mio progetto attuale uso l'implementazione di ojdbc6 di JDBC di Oracle per una connessione, ma dovrei anche gestire per esempio i database di Oracle 8, il che è totalmente impossibile con questo JAR. Direi che dovrei usare ojdbc14 per esempio che era vero per alcuni test, ma supponiamo che in seguito avrò bisogno di gestire 2 tipi di database dallo stesso fornitore, ma sappiamo che non esiste un'implementazione esistente per ENTRAMBI e ho bisogno di avere quelli contemporaneamente caricato. Stessa interfaccia (e bene, non solo la stessa interfaccia, stessa struttura di classe, solo implementazione diversa all'interno!), Stesso prefisso di connessione URL -> Connessione JDBC utilizzerà un driver, ma non riesco a caricarne più. Così quello che ora?Gestire più driver JDBC dallo SAME VENDOR

  • mia prima idea era di caricare i vasi con differenti classloaders, forse ho potuto caricare la stessa struttura del pacchetto con le stesse classi separate l'una dall'altra? Non lo penso davvero, forse è stata una mia sciocca idea. Questo potrebbe anche essere un problema generale dopo non solo con i driver JDBC, quindi anche se non puoi rispondere alla mia domanda ma sai cosa manca qui per favore dimmi

  • Anche se potessi fare un caricamento separato di implementazioni di classe di gli stessi nomi di classe, come posso dire al DriverManager quando creo una connessione per usare il driver EXACT invece di trovarne uno basato sul prefisso della url della connessione? (dove intendo jdbc: oracle: thin ad esempio).

mi sento come un totale muto ora perché credo che questo non è un'idea del tutto straordinaria per gestire nel mondo Java, ma io assolutamente non sanno come gestire.

Grazie per tutti voi in anticipo

+1

Non lo so, utilizzando Oracle 8 * è * abbastanza straordinario. – skaffman

risposta

5

in realtà hanno un paio di opzioni:

  1. Si può cercare di caricare i driver di diversi caricatori di classe. Funzionerà se hai bisogno solo di JDBC puro nella tua applicazione. Dubito che Hibernate possa funzionare con un setup del genere.

    Alla fine, dovrai eseguire il codice dove dovrai vedere le istanze di entrambi i classloader e qui otterrai ClassCastException s (due classi con lo stesso nome completo sono diverse quando sono state caricate da caricatori di classi diverse) .

  2. È possibile dividere l'applicazione in due. Il secondo sarebbe un piccolo server che prende i comandi dalla tua app originale e li traduce in JDBC per il database. Il piccolo server parla con Oracle 8 mentre la tua app parla solo con un database.

    Questo approccio consentirebbe di mantenere le due preoccupazioni completamente separati, ma non sarà in grado di eseguire unisce le due basi di dati.

  3. È possibile collegare il vecchio database Oracle 8 nel nuovo database utilizzando CREATE DATABASE LINK. Ciò rende le vecchie tabelle visibili come se fossero parte del nuovo database. L'app parla solo con un DB e Oracle gestisce i dettagli internamente.

    Forse Oracle 8 è troppo vecchio per farlo funzionare, ma ci proverei sicuramente.

  4. I driver JDBC Oracle sono più compatibili di quanto ci si possa aspettare.Quando dici "che è totalmente impossibile con questo JAR", hai provato lo ? Ho usato un driver Oracle 10 per connettermi a Oracle 7 in passato. Non tutte le funzionalità erano supportate, ma potevo eseguire query e aggiornamenti standard.

+0

Grazie per la risposta. Prenderò la prima versione come seconda sarebbe troppo lenta per i nostri scopi, 3 è totalmente inaccettabile (questo sarà uno strumento generale per connettere luoghi indipendenti) e 4. beh sì, forse aspetterò con l'implementazione del tuo primo commento se riesco a superare le cose con i conducenti che sono abbastanza buone per noi. L'unico problema con il 4o approccio è che potrei voler avere non solo driver JDBC simultaneamente nel sistema, forse altre API hanno problemi di compatibilità e forse la prossima volta avrò bisogno di 2 o 3 versioni di ciascuno, ecc. – newhouse

+0

per ora solo la domanda aperta è che il primo commento non dice come gestire il caso JDBC dove, ok, posso caricare i diversi driver con gli stessi nomi di classi ecc, ma come posso superare il problema di DriverManager che carica il driver indipendentemente da me? Non posso dire a più driver di gestire lo stesso URL. Ma almeno so che l'approccio e l'idea sono nel modo giusto – newhouse

+0

Ovviamente con la soluzione n. 1, non puoi più usare 'DriverManager'. 'DriverManager' è una variabile globale e proviene dal classloader genitore e ogni driver proverebbe a installarsi usando lo stesso URL di base (' jdbc: oracle: '). Dovrai creare manualmente le connessioni usando 'OracleDataSource'. –

-1
#jdbc.properties 
oracle.driver=oracle.jdbc.OracleDriver 
oracle.url=jdbc:oracle:thin:@//localhost/xe 
oracle.user=scott 
oracle.password=tiger 

mysql.driver=com.mysql.jdbc.Driver 
mysql.url=jdbc:mysql://localhost/sales 
mysql.user=root 

mssql.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver 
mssql.url=jdbc:sqlserver://192.168.1.175;databaseName=sales 
mssql.user=dbviewer 
mssql.password=dbviewer 

E poi leggere il file delle proprietà:

class QueryTest2 { 

    public static void main(String[] args) throws Exception{ 
     Properties settings = new Properties(); 
     FileInputStream fin = new FileInputStream("jdbc.properties"); 
     settings.load(fin); 
     fin.close(); 
     String dvr = settings.getProperty(args[0] + ".driver"); 
     String url = settings.getProperty(args[0] + ".url"); 
     String usr = settings.getProperty(args[0] + ".user"); 
     String pwd = settings.getProperty(args[0] + ".password"); 
     Class.forName(dvr); 
     Connection con = DriverManager.getConnection(url, usr, pwd); 
     Statement stmt = con.createStatement(); 
     ResultSet rs = stmt.executeQuery("select pno,price,stock from products"); 
     while(rs.next()){ 
      System.out.printf("%d\t%.2f\t%d%n", rs.getInt(1), rs.getDouble(2), rs.getInt("stock")); 
     } 
     rs.close(); 
     stmt.close(); 
     con.close(); 
    } 
} 
+0

aggiungi leggi questo file di proprietà via in questo modo --- –

Problemi correlati