codememo

jdbc 연결에서 드라이버 클래스 이름(드라이버 이름 아님)을 가져오는 방법

tipmemo 2023. 10. 10. 20:25
반응형

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에서 드라이버 CLASS 이름을 가져와야 합니다.

좋아하려고 할 때마다

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

그리고 다음을 사용하여 연결에서 드라이버 클래스 이름을 가져오도록 노력합니다.

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

클래스 이름 oracle.jdbc.driver 대신 Oracle JDBC Driver만 반환합니다.오라클 드라이버

어떻게 하면 문맥에서 학급 이름을 얻을 수 있을까요?

당신이 바랄 수 있는 최선은 다음과 같습니다.

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

메타데이터는 이 연결에 대한 URL을 반환해야 하며 URL 접두사는 Driver Manager(드라이버 관리자)에 등록해야 합니다.

사용할 수 있는 모든 개체에 대해object.getClass().getName()

JDBC 연결의 경우 다음과 같습니다.

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

나의 포스트그레를 위하여SQL 드라이버가 반환합니다.

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

저는 반성에 기반한 "시도" 알고리즘을 사용합니다.Oracle DataSource는 드라이버를 "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 라이브러리도 포함해야 합니다.

<!-- 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>

언급URL : https://stackoverflow.com/questions/22317215/how-to-get-driver-class-name-not-driver-name-from-jdbc-connection

반응형