2012-11-17 15 views
17

Ho una connessione a un programma Java a un database MySQL, come posso cambiare il database corrente con uno diverso sulla stessa connessione?Java, come cambiare il database corrente in un altro?

ho connettersi a MySQL come questo:

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

Dopo alcune operazioni che voglio per connettersi a un database mysql diverso sulla stessa connessione. Come lo posso fare?

Ho cercato di usare:

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

Ma questo non cambia il database da utilizzare.

risposta

26

Come descritto nello MySQL documentation è necessario utilizzare Connection.setCatalog() per passare a un altro database. Inoltre, afferma esplicitamente che è necessario non eseguire uno USE <databasename> per passare.

Il motivo di questo avviso è che JDBC è un'interfaccia generica per i database e quindi fornisce i metodi per le attività più comuni, tra cui la commutazione catalogs (o databases come sono in MySQL). La specifica JDBC/javadoc dice anche esplicitamente che le persone dovrebbero usare l'API su comandi specifici del database (se entrambi sono disponibili). Ci sono diversi motivi per questo: 1) promuove il codice indipendente dal database, e 2) il driver potrebbe fare altre cose internamente in risposta a uno dei metodi API. L'utilizzo di comandi specifici del database potrebbe comportare un comportamento anomalo del driver in quanto il suo stato interno non corrisponde allo stato del database.

Una chiamata a setCatalog(String) non influirà dichiarazioni esistenti, come specificato nella documentazione delle API JDBC:

Calling setCatalog ha alcun effetto sul creato in precedenza o preparati Statement oggetti. Viene definita l'implementazione se un'operazione di preparazione del DBMS viene eseguita immediatamente quando viene invocato il metodo ConnectionprepareStatement o prepareCall. Per la massima portabilità, è necessario chiamare prima di creare o preparare uno Statement.

+0

ringrazio molto :) – ognistysztorm

+0

Va aggiunto che le dichiarazioni che sono stati creati prima del 'Connection.setCatalog() 'è stato chiamato continuerà ad accedere al database precedente. – Max

+0

@Max Sapete se è specificato nella specifica JDBC o è una regola specifica dell'implementazione MySQL? Di solito lavoro con Firebird e dato che non ha cataloghi di solito mi glorio su questi tipi di dettagli;) –

4

È possibile anteporre il nome del database ai nomi delle tabelle in questo modo.

Per esempio: db1 has table1 e db2 has table2

select * from db1.table1, db2.table2; 

Questo vi permetterà di fare banca dati croce interroga

Problemi correlati