如何从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