2014-10-18 10 views
7

Come si può ottenere il nome del nome del database da oggetto di connessionePrendi il nome del database mysql collegato (JDBC)

try { 
    this.ds = (DataSource) new InitialContext().lookup("java:comp/env/jdbc/amger"); 
} catch (NamingException ne) { 
} 
Connection conObj = ds.getConnection(); 

Come faccio ad avere quel nome database dal con

+0

possibile duplicato di http://stackoverflow.com/questions/5718952/how-to-get-database-url-from- java-sql-connection – SMA

+0

@almasshaikh "Come ottenere l'url del database da java.sql.Connection?" non può mai essere uguale al nome del database – Paullo

+0

idea è da url puoi ottenere il nome del database? – SMA

risposta

11

Probabilmente il modo più semplice per ottenere il nome del database da JDBC oggetto di connessione stessa è tramite il metodo getCatalog():

Connection#getCatalog()

Tuttavia, come Konstantin ha sottolineato nel suo commento bel ow, quel valore non cambierà se l'attuale database MySQL viene modificato emettendo un'istruzione USE dbname.

getCatalog() potrebbe ancora essere utile in un'applicazione che

  • non cambia i database, o
  • fa le cose "la via JDBC" utilizzando setCatalog() per modificare il database corrente,

ma per MySQL, usare SELECT DATABASE() sembra essere più sicuro in generale.

Si noti inoltre che questa discrepanza potenziale tra getCatalog() e il database attuale corrente dipende dal comportamento del particolare driver JDBC. Per curiosità ho provato qualcosa di simile con Microsoft JDBC Driver 4.0 per SQL Server e .getCatalog() era effettivamente a conoscenza della modifica al database corrente subito dopo aver eseguito un'istruzione USE dbname. Cioè, il codice

String connectionUrl = "jdbc:sqlserver://localhost:52865;" 
     + "databaseName=myDb;" + "integratedSecurity=true"; 
try (Connection con = DriverManager.getConnection(connectionUrl)) { 
    System.out.println(String.format(
      "getCatalog() returns: %s", 
      con.getCatalog())); 
    try (Statement s = con.createStatement()) { 
     System.out.println("   Executing: USE master"); 
     s.execute("USE master"); 
    } 
    System.out.println(String.format(
      "getCatalog() returns: %s", 
      con.getCatalog())); 
} catch (Exception e) { 
    e.printStackTrace(System.out); 
} 

prodotto i seguenti risultati:

getCatalog() returns: myDb 
      Executing: USE master 
getCatalog() returns: master 
+2

Potrebbe essere pericoloso a volte http://bugs.mysql.com/bug.php?id=1599 –

+1

@Gord Thompson, sono d'accordo con te. Crediti a Konstantin V. Salikhov per il suo momento saliente. Mi sento più a mio agio con l'approccio di Konstantin V. Salikhov (SELECT DATABASE()) soprattutto per la soluzione specifica di MySQL. Ma come giustamente dici "fa le cose" The Way JDBC ""; Connection # getCatalog() sarà più accettabile per la portabilità che è uno dei punti di forza di Java. – Paullo

+2

@ KonstantinV.Salikhov Questo è uno dei motivi per cui l'API doc di JDBC dice esplicitamente di non usare comandi di database (come 'USE') se esiste un equivalente JDBC (' setCatalog'). –

2

Se si sa che DB è Mysql si può semplicemente eseguire SELECT DATABASE() sulla connessione e leggere il resulset con il nome del database corrente al suo interno.

Qui è description della funzione DATABASE.

+0

hai menzionato "Se sai che DB è Mysql". Cosa ti ha fatto dire questo? – Paullo

+1

Apprezzo il tuo contributo e il puntatore al problema che è associato all'approccio di @Gord Thompson. La tua soluzione è la migliore per il meglio quando si tratta di MySQL. Accetto Gord Thompson solo per motivi di portabilità, anche se sono consapevole del suo possibile effetto collaterale. Grazie mille fratello – Paullo

+1

Prego. Ho menzionato "Se sai che DB è Mysql" perché qualsiasi RDBMS può essere collegato all'origine dati JDBC, ma la tua domanda specifica aveva tag mysql e DATABASE() è una funzione specifica di mysql. Ho pensato che questa soluzione potrebbe essere utile. –

1

Supponiamo che hai usato URL, "jdbc: mysql: // localhost/test"

quindi effettuare le seguenti:

DatabaseMetaData dmd = connection.getMetaData(); 
String url = dmd.getURL(); 
System.out.println(url.substring(url.lastIndexOf("/") + 1)); 
+1

Che non funzionerà se il database è stato modificato usando il comando 'use' o tramite l'API JDBC' setCatalog() ' –

+0

Concordato ma non penso che OP abbia menzionato lo stesso. – SMA

Problemi correlati