更改JNDI检索的数据源的属性

时间:2017-08-21 11:33:40

标签: java spring datasource jndi

DataSource在应用程序服务器(Jboss)

配置
     <subsystem xmlns="urn:jboss:domain:datasources:1.2">
        <datasources>
            <datasource jta="true" jndi-name="java:/TestDataSource" pool-name="TestDataSource" enabled="true" use-ccm="true" statistics-enabled="false">
                <connection-url>...</connection-url>
                <driver-class>com.informix.jdbc.IfxDriver</driver-class>
                <driver>informix</driver>
                <new-connection-sql>set lock mode to wait 15</new-connection-sql>
                <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
                <pool>
                    <min-pool-size>5</min-pool-size>
                    <max-pool-size>30</max-pool-size>
                    <flush-strategy>IdleConnections</flush-strategy>
                </pool>
                <security>
                    <user-name>...</user-name>
                    <password>...</password>
                </security>
                <validation>
                    <check-valid-connection-sql>...</check-valid-connection-sql>
                    <validate-on-match>true</validate-on-match>
                    <background-validation>true</background-validation>
                </validation>
                <timeout>
                    <set-tx-query-timeout>false</set-tx-query-timeout>
                    <blocking-timeout-millis>0</blocking-timeout-millis>
                    <idle-timeout-minutes>5</idle-timeout-minutes>
                    <query-timeout>0</query-timeout>
                    <use-try-lock>0</use-try-lock>
                    <allocation-retry>0</allocation-retry>
                    <allocation-retry-wait-millis>0</allocation-retry-wait-millis>
                </timeout>
                <statement>
                    <prepared-statement-cache-size>100</prepared-statement-cache-size>
                    <share-prepared-statements>true</share-prepared-statements>
                </statement>
            </datasource>
        </subsystem>

使用JNDI检索DataSource。在将它作为bean返回之前,我想更改url和驱动程序类。所有其他配置的属性应保持不变。 DataSource接口不提供setter来实现这一点。这类任务的最佳解决方案是什么?

@Configuration
public class DBConfig {
@Value("${datasource.test}")
private String dataSourceProperty;

@Bean
public DataSource dataSource() {
    final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
    dsLookup.setResourceRef(true);
    DataSource dataSource = dsLookup.getDataSource("java:/" + dataSourceProperty);

    // here before returning the datasource I would like to change the url and database driver, other configs should remain unchanged
    return dataSource;
}
}

1 个答案:

答案 0 :(得分:0)

您需要将DataSource接口转换为具体实现(例如,org.apache.tomcat.jdbc.pool.DataSource),然后只使用具体类的setter方法:

org.apache.tomcat.jdbc.pool.DataSource tomcatDataSource = (org.apache.tomcat.jdbc.pool.DataSource)dataSource;
tomcatDataSource.setUrl("...");