2012-03-07 15 views
5

Wczoraj natknąłem się na duży problem. W moim obecnym projekcie używam ojdbc6 implementacji JDBC Oracle dla połączenia, ale także potrzebowałbym obsługiwać na przykład bazy danych Oracle 8, co jest całkowicie niemożliwe z tym JARem. Powiedziałbyś, że powinienem użyć na przykład ojdbc14, co było prawdą w przypadku niektórych testów, ale załóżmy, że później będę musiał obsługiwać 2 rodzaje baz danych od tego samego dostawcy, ale wiemy, że nie istnieje żadna istniejąca implementacja dla BOTH i muszę mieć załadowane te . Ten sam interfejs (i dobrze, nie tylko ten sam interfejs, ta sama struktura klasowa, tylko inne implementacje wewnątrz!), Ten sam prefiks połączenia URL -> Połączenie JDBC będzie używać jednego sterownika, ale nie mogę załadować wielu z nich. Co teraz?Obsługa wielu sterowników JDBC od SAMEGO VENDORA

  • Moim pierwszym pomysłem było załadować słoików z różnymi classloaders, mógłbym załadować taką samą strukturę pakietów z tych samych klas oddzielonych od siebie? Tak naprawdę nie sądzę, może to był mój głupi pomysł. Może to być również ogólny problem później, nie tylko ze sterownikami JDBC, więc nawet jeśli nie możesz odpowiedzieć na moje pytanie, ale wiesz, czego tu nie ma, proszę, powiedz

  • Nawet gdybym mógł wykonać oddzielne ładowanie implementacji klasowych te same nazwy klas, w jaki sposób mogę komunikować się z DriverManagerem podczas tworzenia połączenia, aby użyć sterownika EXACT zamiast znajdować go na podstawie prefiksu adresu URL połączenia? (gdzie mam na myśli jdbc: oracle: thin na przykład).

czuję się jak w sumie głupi teraz, ponieważ myślę, że nie jest to zupełnie niezwykły pomysł, aby obsłużyć w świecie Java, ale zupełnie nie wiem, jak obsługiwać.

Dzięki za was wszystkich z góry

+1

Nie wiem, przy użyciu Oracle * 8 * jest dość niezwykłe. – skaffman

Odpowiedz

5

rzeczywiście mają kilka opcji:

  1. można spróbować załadować sterowniki z różnych ładowarek klasy. To zadziała, jeśli potrzebujesz tylko czystego JDBC w swojej aplikacji. Wątpię, że dostaniesz Hibernate do pracy z taką konfiguracją.

    W końcu będziesz musiał uruchomić kod, w którym będziesz musiał zobaczyć wystąpienia z obu programów ładujących klasy, a tutaj uzyskasz ClassCastException s (dwie klasy o tej samej pełnej kwalifikowanej nazwie są różne, gdy zostały załadowane z różnych ładowników klasy) .

  2. Możesz podzielić swoją aplikację na dwie części. Drugi to mały serwer, który pobiera polecenia z oryginalnej aplikacji i tłumaczy je na bazę danych JDBC. Mały serwer rozmawia z Oracle 8, podczas gdy Twoja aplikacja rozmawia tylko z jedną bazą danych.

    Takie podejście pozwoliłoby na zachowanie dwóch odrębnych kwestii, ale nie będzie można uruchamiać połączeń w obu bazach danych.

  3. Możesz połączyć stare bazy danych Oracle 8 w nowej bazie danych, używając CREATE DATABASE LINK. To sprawia, że ​​stare tabele są widoczne, jakby były częścią nowej bazy danych. Twoja aplikacja rozmawia tylko z jednym DB, a Oracle wewnętrznie obsługuje dane.

    Może Oracle 8 jest za stary, żeby to działało, ale zdecydowanie spróbuję.

  4. Sterowniki Oracle JDBC są bardziej kompatybilne, niż można się było spodziewać.Kiedy mówisz "co jest całkowicie niemożliwe z tym JAR", czy zrobiłeś wypróbować to? Użyłem sterownika Oracle 10 do łączenia się z Oracle 7 w przeszłości. Nie wszystkie funkcje były obsługiwane, ale mogłem uruchamiać standardowe zapytania i aktualizacje.

+0

Dzięki za odpowiedź. Zrobiłbym pierwszą wersję, ponieważ druga byłaby zbyt powolna dla naszych celów, 3 jest całkowicie nie do przyjęcia (to będzie ogólne narzędzie do łączenia niezależnych miejsc) i 4. dobrze, tak, może poczekam z wdrożeniem twojego pierwszego komentarza jeśli uda mi się rozwiązać problemy z kierowcami, które są dla nas wystarczająco dobre. Jedynym problemem związanym z czwartym podejściem jest to, że mogę chcieć mieć w swoim systemie nie tylko sterowniki JDBC, może inne interfejsy API mają problemy z kompatybilnością i może następnym razem będę potrzebować 2 lub 3 wersje każdego z nich itp. – newhouse

+0

jedyne otwarte pytanie na razie to to, że pierwszy komentarz nie wskazywał jak sobie poradzić z przypadkiem JDBC, gdzie, ok, mogę załadować różne sterowniki z tymi samymi nazwami klas itp., ale jak mogę rozwiązać problem DriverManagera, który ładuje sterownik niezależnie od mnie? Nie mogę nakazać wielu sterownikom obsługi tego samego adresu URL. Ale przynajmniej wiem, że podejście i pomysł są we właściwy sposób. – newhouse

+0

Oczywiście z rozwiązaniem nr 1 nie można już używać 'DriverManager'. 'DriverManager' jest zmienną globalną i pochodzi z nadrzędnego modułu ładującego klasy, a każdy sterownik próbowałby sam się zainstalować przy użyciu tego samego podstawowego adresu URL (' jdbc: oracle: '). Będziesz musiał utworzyć połączenia ręcznie za pomocą '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 

a następnie odczytać pliku właściwości:

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

dodaj przeczytaj ten plik właściwości za pośrednictwem tego --- –