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

时间:2014-03-11 05:32:59

标签: java oracle jdbc jndi

我有一个上面格式的context.xml文件

<Context shallowOutput="true" path="/">
<WatchedResource>WEB-INF/web.xml</WatchedResource>

  <Resource name="jdbc/myDataSource"
        auth="Container"
        type="javax.sql.DataSource"
        factory="org.apache.commons.dbcp.BasicDataSourceFactory"
        driverClassName="oracle.jdbc.driver.OracleDriver"
        username="OMITTED"
        password="OMITTED"
        url="OMITTED"
        maxActive="20"
        maxIdle="10"
        maxWait="-1"/>

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

每次我尝试

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

并尝试使用

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

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

它正在回归 Oracle JDBC驱动程序 而不是类名 oracle.jdbc.driver.OracleDriver

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

4 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:3)

对于任何对象,您都可以使用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

答案 2 :(得分:0)

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

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

做好这份工作。

答案 3 :(得分:0)

使用Tomcat(7)可以正常工作:

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

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

<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-dbcp -->
<dependency><!-- to check driver name effectively running -->
        <scope>provided</scope>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-dbcp</artifactId>
        <version>7.0.47</version>
</dependency>