2010-05-28 4 views
2

есть ли способ зарегистрировать URL-адрес соединения DataSource JdbcTemplate в Java?JdbcTemplate - регистрация данных URL-адрес подключения источника

Это поле существует в DataSource, но для его доступа нет. Конечно, я мог бы читать свойства DataSource из контекста xml приложения, но я хотел бы сделать это по-другому.

+0

Что DataSource вы используете? Что-то вроде c3p0? – jasonmp85

ответ

1

Если поле существует, вы бы нашли использовать отражение для доступа к нему? Этот подход не может быть перспективным, но может быть достаточным для ваших нужд.

2

Я знаю, что вы сказали, что не хотите получать его из контекста xml, но я не вижу легкого и не хрупкого пути вокруг него.

Весной 2.0 и выше вы можете использовать <util:property-path /> element для ссылки на свойство другого компонента. Допустим, что ваш DataSource объявлен как так (примечание: Я собираюсь использовать p-namespace во всем для краткости):

<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" /> 

Я предполагаю, что ваш JdbcTemplate используется каким-то объектом доступа к данным. Скажем, это выглядит следующим образом:

public class SimpleDao implements ExampleDao { 
    private JdbcTemplate jdbcTemplate; 

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

Так Spring конфигурации для построения этой DAO, как так:

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

Теперь к нашей проблеме: как получить JdbcUrl собственность в нашей 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-адрес доступен из фасоли под названием dataSource использованием getJdbcUrl (заметим, что это на бетонном DataSource , а не интерфейс), поэтому элемент свойства-свойства указывает Spring, чтобы получить значение оттуда и использовать его как значение для свойства DAO.

Это не слишком много кода (это один сеттер и одно дополнительное свойство), и вы гарантированно должны иметь одинаковое значение, введенное в оба компонента.

0

Вот что я сделал с источником данных JNDI, полученным из контейнера Tomcat, и ввел его как NamedParameterJdbcTemplate.

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> 
Смежные вопросы