如何从jdbc连接获取驱动程序类名(不是驱动程序名)

我有一个以下格式的context.xml文件

 WEB-INF/web.xml  

从这个contex.xml我需要获取我的Driver CLASS名称。

我每次尝试都喜欢

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

并尝试从连接中获取驱动程序类名称

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

它只返回Oracle JDBC Driver而不是类名oracle.jdbc.driver.OracleDriver

如何从上下文中获取类名。

我认为你能想到的最好的是:

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

元数据应返回此连接的URL,URL前缀应使用DriverManager注册(唯一)。

对于任何对象,您可以使用object.getClass().getName()

对于JDBC连接,它看起来像:

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

对于我的PostgreSQL驱动程序,它返回:

 org.postgresql.jdbc4.Jdbc4Connection 

在您的代码中,这应该工作:

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

显示连接类名的简单程序:

 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()); } 

对于我在测试中使用的Oracle连接,我得到了:

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

我使用基于reflection的“尝试”算法。 OracleDataSource包含“driver”属性中的驱动程序,并且可能有许多DataSource执行相同操作。 以下是:

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

做好这份工作。

使用Tomcat(7)这有效:

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

您还需要在构建时包含dbcp库:

   provided org.apache.tomcat tomcat-dbcp 7.0.47