2015-02-22 8 views
5

Sono bloccato in un problema relativo agli oggetti di origine dati in java. Ho impostato i parametri di connessione dell'origine dati nell'oggetto origine dati (org.apache.tomcat.jdbc.pool.DataSource). Voglio ottenere quei parametri dall'oggetto di origine dati prima di chiamare le informazioni di debug significative del log del metodo getConnection all'interno di catch se rilevano un'eccezione.Come ottenere le configurazioni del database utilizzando l'oggetto origine dati in java

Di seguito è riportato il codice che ho provato finora. Posso ottenere tutti i parametri di connessione dai metadati come segue [es: - connection.getMetaData(). GetURL()], ma voglio rilevare l'eccezione e registrare url, password, username come log se getConnection() genera un'eccezione. Pertanto, ho bisogno di ottenere quelle informazioni dall'oggetto di origine dati prima che provi a creare la connessione db.

try { 
     // try to get the lookup name. If error empty string will be returned 
     jndiLookupName = connectionProperties.getProperty(RDBMSConstants.PROP_JNDI_LOOKUP_NAME); 
     datasource = InitialContext.doLookup(jndiLookupName); 

     connection = datasource.getConnection(); // WHEN THIS THROWS EXCEPTION... 

     logger.info(connection.getMetaData().getURL()); // these won't work since exception already thrown. 
     logger.info(connection.getMetaData().getUserName()); 
     logger.info(connection.getMetaData().getDriverName()); 
     logger.info(connection.getMetaData().getDriverVersion()); 

     isConnected = true; // if no errors 
     logger.info("JDBC connection established with jndi config " + jndiLookupName); 

    } catch (SQLException e) { 

     //...I WANT ALL CONNECTION PARAMETERS (URL,PASSWORD,USERNAME) HERE 

     throw new SQLException("Connecting to database failed with jndi lookup", e); 
    } 

Quando ho debug remoto ottengo oggetto origine dati come segue ..

[email protected]{ConnectionPool[defaultAutoCommit=null; defaultReadOnly=null; defaultTransactionIsolation=-1; defaultCatalog=null; driverClassName=com.mysql.jdbc.Driver; maxActive=100; maxIdle=8; minIdle=0; initialSize=0; maxWait=30000; testOnBorrow=false; testOnReturn=false; timeBetweenEvictionRunsMillis=5000; numTestsPerEvictionRun=0; minEvictableIdleTimeMillis=60000; testWhileIdle=false; testOnConnect=false; password=********; url=jdbc:mysql://localhost/wso2_mb_1; username=a; validationQuery=null; validationQueryTimeout=-1; validatorClassName=null; validationInterval=30000; accessToUnderlyingConnectionAllowed=true; removeAbandoned=false; removeAbandonedTimeout=60; logAbandoned=false; connectionProperties=null; initSQL=null; jdbcInterceptors=ConnectionState;StatementFinalizer;org.wso2.carbon.ndatasource.rdbms.ConnectionRollbackOnReturnInterceptor;; jmxEnabled=true; fairQueue=true; useEquals=true; abandonWhenPercentageFull=0; maxAge=0; useLock=false; dataSource=null; dataSourceJNDI=null; suspectTimeout=0; alternateUsernameAllowed=false; commitOnReturn=false; rollbackOnReturn=false; useDisposableConnectionFacade=true; logValidationErrors=false; propagateInterruptState=false; ignoreExceptionOnPreLoad=false; } 

posso vedere tutti i parametri URL, nome utente e password sono lì, ma non riesco a ottenere quelle. C'è un modo per ottenere questi valori dall'oggetto di origine dati.

risposta

5

Fusioni alla realizzazione concreta del DataSource - il gatto pool origine dati fornisce l'accesso a username, url ecc (vedi DataSource per i dettagli):

if (dataSource instanceof org.apache.tomcat.jdbc.pool.DataSource) { 
    org.apache.tomcat.jdbc.pool.DataSource tcDataSource = (org.apache.tomcat.jdbc.pool.DataSource)dataSource; 
    logger.info(tcDataSource.getUrl()); 
    logger.info(tcDataSource.getUsername()); 
    ... 
} 
+0

ha funzionato. Grazie, grazie .. !!! – plr

+0

Qual è l'implementazione DataSource in Glassfish/Payara? –

+1

Non ne ho idea. È possibile utilizzare il debugger per ottenere l'implementazione effettiva ... – fateddy

-1

Non penso che si possa fare ciò poiché DataSource è solo un'astrazione e implementata da un fornitore di driver, solo una fabbrica di connessioni. Si dovrebbe cercare di ottenere i parametri altrove come un file di proprietà di configurazione o tali

+2

ma quell'oggetto di origine dati contiene tutti i parametri di connessione db. dovrebbe esserci un modo per ottenerli. Non riesco a ottenerli da nessun'altra parte poiché sto eseguendo il looping di molti oggetti di origine dati per diversi db. Devo cambiare il design se devo ottenere quelle configurazioni separatamente. – plr

Problemi correlati