2017-08-21 4 views
0

source de données est configurée au niveau du serveur d'application (Jboss)propriétés de changement de JNDI récupérées source de données

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

source de données est récupérée en utilisant JNDI. Avant de le retourner comme un haricot je voudrais changer l'URL et la classe de conducteur. Toutes les autres propriétés configurées doivent rester inchangées. L'interface DataSource ne fournit pas de setters pour y parvenir. Quelle est la meilleure solution pour ce genre de tâche?

@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; 
} 
} 
+0

Vous ne pouvez pas, et vous ne devriez pas. La source de données est prédéfinie dans JNDI et ne doit pas être modifiée par la suite. –

+0

Donnez-en un autre, ou autant que vous le souhaitez. Toute l'idée de configurer ce genre de choses en externe. Sinon pourquoi l'utiliser du tout? – EJP

+0

Je voulais changer la source de données pour la conformer au pilote de proxy JDBC pour la journalisation SQL (Log4jdbc-log4j2). Si la deuxième source de données est définie en fonction de l'original en tant que ressource JNDI supplémentaire, j'ai besoin d'ajouter Log4jdbc-log4j2 en tant que module jboss et tous les messages de journalisation atteignent les enregistreurs jboss au lieu de l'application. – TheArtur

Répondre

0

Vous devez jeter l'interface DataSource à la mise en œuvre concrète (par exemple, org.apache.tomcat.jdbc.pool.DataSource), puis il suffit d'utiliser la méthode setter de la classe concrète:

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