web-dev-qa-db-ja.com

jdbc接続から(ドライバー名ではなく)ドライバークラス名を取得する方法

以下の形式の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から、ドライバークラス名を取得する必要があります。

私が好きになるたびに

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

を使用して接続からドライバークラス名を取得するようにしてください

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

クラス名の代わりにOracle JDBC Driverだけを返しますOracle.jdbc.driver.OracleDriver ==

コンテキストからクラス名を取得するにはどうすればよいですか。

9
Nigel Thomas

私はあなたが望むことができる最高のものは次のとおりだと思います:

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

メタデータはこの接続のURLを返し、URLプレフィックスはDriverManagerに(一意に)登録する必要があります。

7
Jason Pyeron

任意のオブジェクトに対して、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
3
Michał Niklas

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>
0
user1767316

リフレクションに基づく「試行」アルゴリズムを使用します。 OracleDataSourceの「driver」属性にはドライバーが含まれており、同じことを行うDataSourceが多数存在する場合があります。したがって、次のようになります。

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

仕事をしなさい。

0
nico