2010-05-28 3 views
2

Java에서 JdbcTemplate의 DataSource 연결 URL을 기록하는 방법이 있습니까?JdbcTemplate - dataSource 연결 URL 로깅

필드가 DataSource에 있지만 액세스 할 수있는 게터가 없습니다. 물론 응용 프로그램 컨텍스트 xml에서 DataSource 속성을 읽을 수는 있지만 다른 방법으로 수행하고 싶습니다.

+0

어떤 데이터 소스 구현을 사용하고 있습니까? c3p0과 같은 것? – jasonmp85

답변

1

필드가있는 경우 리플렉션을 사용하여 필드에 액세스 하시겠습니까? 접근법은 미래를 보장하는 것은 아니지만 귀하의 요구에 충분할 수 있습니다.

2

당신은 컨텍스트 xml에서 가져올 필요가 없다고했지만, 나는 그 주위에 쉽고 깨지기 쉬운 방법을 볼 수 없다는 것을 알고 있습니다.

스프링 2.0 이상에서는 <util:property-path /> element을 사용하여 다른 bean의 특성을 참조 할 수 있습니다. 의이 DataSource가과 같이 선언되어 있다고 가정 해 봅시다 (참고 : 나는 간결에 걸쳐 p-namespace를 사용하는거야) : 나는 당신의 JdbcTemplate 일부 데이터 액세스 개체에서 사용하고 있으리라 믿고있어

<bean id="dataSource" class="com.example.SimpleDataSource" 
    p:user="db_user" 
    p:password="letmein" 
    p:driverClass="com.example.CabDriver" 
    p:jdbcUrl="jdbc:example:@localhost:1729:magicdb" /> 

. 의 그것과 같다 가정 해 봅시다 : 우리의 DAO에 JdbcUrl 속성을 얻는 방법 : 우리의 문제에 이제

<bean id="dao" class="com.example.SimpleDao" 
    p:dataSource-ref="dataSource" /> 

:

public class SimpleDao implements ExampleDao { 
    private JdbcTemplate jdbcTemplate; 

    public void setDataSource(DataSource dataSource) { 
     this.jdbcTemplate = new JdbcTemplate(dataSource); 
    } 
} 

그래서 봄의 설정이 DAO 지금처럼 구성하기 위해? 의 세터 추가하자

public class SimpleDao implements ExampleDao { 
    private String jdbcUrl; 
    // ... 
    public void setJdbcUrl(String jdbcUrl) { 
     this.jdbcUrl = jdbcUrl; 
    } 
    // ... 

을 그리고 마지막으로 우리는이 사용하는 전술 <util:property-path /> 요소 주입 :

<bean id="dao" class="com.example.SimpleDao" 
    p:dataSource-ref="dataSource"> 
    <property name="jdbcUrl> 
     <util:property-path path="dataSource.jdbcUrl" /> 
    </property> 
</bean> 

URL은 getJdbcUrl를 사용하여 dataSource라는 이름의 빈에서 사용할 수 있습니다 (이것은 구체적인 데이터 소스에주의를 인터페이스가 아님), property-path 요소는 Spring에게 거기에서 값을 가져오고이를 DAO의 속성 값으로 사용하도록 지시한다.

이것은 너무 많은 코드가 아닙니다 (하나의 setter와 하나의 추가 속성). 항상 두 값 모두에 같은 값을 주입해야합니다.

0

Tomcat 컨테이너에서 가져온 NamedParameterJdbcTemplate으로 삽입 된 JNDI 데이터 소스로 수행 한 작업은 다음과 같습니다.

String datasourceUrl = null; 
try { // Log which database we are connected to. 
    JdbcTemplate jdbcTemplate = (JdbcTemplate)onyxReportingNamedParameterJdbcTemplate.getJdbcOperations(); // Get underlying JdbcTemplate 
    datasourceUrl = jdbcTemplate.getDataSource().getConnection().getMetaData().getURL(); 
} catch (SQLException e) { // No biggie, don't exit, this was just for info. 
    log.error("Non-fatal error: unable to get datasource for logging which database we are connected to.", e); 
} 
log.info("Datasource URL: " + datasourceUrl); 

응용 프로그램 컨텍스트 :

<jee:jndi-lookup id="onyxReportingDS" jndi-name="jdbc/OnyxReadTLCDS" expected-type="javax.sql.DataSource" /> 
<bean id="onyxReportingNamedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"> 
    <constructor-arg ref="onyxReportingDS" /> 
</bean>