Comment obtenir le nom de la classe du pilote (pas le nom du pilote) depuis une connexion jdbc

J’ai un fichier context.xml au format ci-dessous

 WEB-INF/web.xml  

De ce contex.xml je dois obtenir mon nom de pilote CLASS.

A chaque fois que j’essaye comme

DataSource ds = (DataSource)context.lookup("java:/jdbc/myDataSource")

et essayez d’obtenir le nom de la classe de pilote à partir de la connexion en utilisant

ds.getConnection().getMetatData().getDriverName()

Il ne renvoie que le pilote JDBC Oracle au lieu du nom de classe oracle.jdbc.driver.OracleDriver.

Comment puis-je obtenir le nom de la classe à partir du contexte.

Je pense que le mieux que vous puissiez espérer est:

 DriverManager.getDriver(ds.getConnection().getMetaData().getURL()).getClass(); 

Les métadonnées doivent renvoyer l’URL de cette connexion et le préfixe de l’URL doit être enregistré auprès de DriverManager (uniquement).

Pour tout object, vous pouvez utiliser object.getClass().getName()

Pour la connexion JDBC, cela ressemble à:

 Ssortingng db_class = DriverManager.getConnection(db_url, usr, passwd).getClass().getName(); 

Pour mon pilote PostgreSQL, il retourne:

 org.postgresql.jdbc4.Jdbc4Connection 

Cela devrait fonctionner dans votre code:

 ds.getConnection().getClass().getName() 

Et procédure simple qui montre le nom de classe de la connexion:

 public static void show_connection_info(Connection conn) { System.out.println("Connection: " + conn); System.out.println("Connection class: " + conn.getClass()); System.out.println("Connection class name: " + conn.getClass().getName()); } 

Pour la connexion Oracle que j’ai utilisée dans le test, j’ai:

 Connection: oracle.jdbc.driver.T4CConnection@1e1c66a Connection class: class oracle.jdbc.driver.T4CConnection Connection class name: oracle.jdbc.driver.T4CConnection 

J’utilise un algorithme “try” basé sur la reflection. OracleDataSource contient le pilote dans un atsortingbut “driver” et il peut y avoir beaucoup de DataSource qui fait la même chose. Donc ce qui suit:

 Field field = dataSource.getClass().getDeclaredField("driver"); field.setAccessible(true); return field.get(dataSource).getClass().getName(); 

fait le travail.

En utilisant Tomcat (7), cela fonctionne:

 if(source instanceof org.apache.tomcat.dbcp.dbcp.BasicDataSource){ logger.info("Driver className: "+((org.apache.tomcat.dbcp.dbcp.BasicDataSource)source).getDriverClassName()); } 

Vous devrez également inclure la bibliothèque dbcp lors de la construction:

   provided org.apache.tomcat tomcat-dbcp 7.0.47