2012-11-17 2 views
17

Mam połączenie programu Java z bazą danych MySQL, w jaki sposób mogę zmienić bieżącą bazę danych na inną w tym samym połączeniu?Java, jak zmienić aktualną bazę danych na inną?

mogę podłączyć do MySQL tak:

DriverManager.getConnection("jdbc:mysql://"+server+"/",log,pass); 

Po kilku operacjach chcę podłączyć do innej bazy mysql w tym samym związku. Jak mogę to zrobić?

Próbowałem użyć:

Statement stat= con.createStatement(); 
ResultSet r=stat.executeQuery("use mysql"); 

Ale to nie zmienia baza danych ma być używany.

Odpowiedz

26

Zgodnie z opisem w MySQL documentation należy użyć Connection.setCatalog(), aby przełączyć się do innej bazy danych. Mówi również wyraźnie, że powinieneś nie wykonać USE <databasename>, aby przełączyć.

Powodem tego ostrzeżenia jest to, że JDBC jest ogólnym interfejsem dla baz danych i dlatego zapewnia metody dla większości typowych zadań, w tym przełączania catalogs (lub databases, ponieważ są one w MySQL). Specyfikacja JDBC/javadoc wyraźnie mówi również, że ludzie powinni używać interfejsu API względem komend określonych przez bazę danych (jeśli oba są dostępne). Jest kilka przyczyn: 1) promuje kod niezależny od bazy danych, a 2) może wewnętrznie wykonać dodatkowe czynności w odpowiedzi na jedną z metod API. Używanie poleceń specyficznych dla bazy danych może spowodować nieprawidłowe działanie sterownika, ponieważ jego stan wewnętrzny nie jest zgodny ze stanem bazy danych.

Wywołanie setCatalog(String) nie wpłynie na istniejące oświadczenia, określone w dokumentacji API JDBC:

Wywołanie setCatalog nie ma wpływu na wcześniej stworzone lub sporządzone Statement obiektów. Jest to implementacja zdefiniowana, czy operacja przygotowania DBMS ma miejsce natychmiast po wywołaniu metody Connection lub . Aby uzyskać maksymalną przenośność, należy wywołać setCatalog przed utworzeniem lub przygotowaniem Statement.

+0

bardzo dziękuję :) – ognistysztorm

+0

Należy dodać, że oświadczenia, które zostały utworzone przed 'Connection.setCatalog() 'został wywołany nadal będzie mieć dostęp do wcześniejszej bazy danych. – Max

+0

@Max Czy wiesz, czy jest to określone w specyfikacji JDBC, czy jest to reguła specyficzna dla implementacji MySQL? Zwykle pracuję z Firebirdem, a ponieważ nie ma katalogów, zwykle błyszczę nad tymi szczegółami;) –

4

Możesz poprzedzić nazwę bazy danych przy nazwach takich jak ta.

Na przykład: db1 has table1 i db2 has table2

select * from db1.table1, db2.table2; 

Pozwoli to zrobić przekrój bazy danych zapytań