2010-05-28 15 views
2

Y a-t-il un moyen de consigner l'URL de connexion DataSource de JdbcTemplate dans Java?JdbcTemplate - consignation de l'URL de connexion dataSource

Le champ existe dans le DataSource, mais il n'y a pas de getter pour y accéder. Bien sûr, je pourrais lire les propriétés DataSource à partir du contexte d'application xml, mais j'aimerais le faire dans l'autre sens.

+0

Quelle mise en œuvre de DataSource utilisez-vous? Quelque chose comme c3p0? – jasonmp85

Répondre

1

Si le champ existe, envisageriez-vous d'utiliser la réflexion pour y accéder? L'approche peut ne pas être à l'épreuve du temps mais peut suffire à vos besoins.

2

Je sais que vous avez dit que vous ne vouliez pas avoir à l'obtenir à partir du contexte xml, mais je ne peux pas voir un moyen facile et non-fragile autour d'elle.

Au printemps 2.0 et supérieur, vous pouvez utiliser le <util:property-path /> element pour référencer une propriété d'un autre bean. Disons que votre DataSource est déclarée comme si (note: Je vais utiliser le p-namespace tout au long de la brièveté):

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

Je suppose que votre JdbcTemplate est utilisé par un objet d'accès aux données. Disons qu'il ressemble à ceci:

public class SimpleDao implements ExampleDao { 
    private JdbcTemplate jdbcTemplate; 

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

Ainsi, la configuration de printemps pour construire ce OAC est comme ceci:

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

maintenant à notre problème: comment obtenir la propriété JdbcUrl dans notre DAO? Ajoutons un poseur:

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

Et enfin nous injectons cela en utilisant l'élément <util:property-path /> mentionné ci-dessus:

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

L'URL est disponible à partir de la fève nommée dataSource en utilisant getJdbcUrl (notez que ceci est sur le DataSource en béton , pas l'interface), donc l'élément property-path dit à Spring d'obtenir la valeur à partir de là et de l'utiliser comme valeur pour la propriété DAO.

Ce n'est pas trop de code (c'est un setter et une propriété supplémentaire) et vous aurez toujours la même valeur injectée dans les deux beans.

0

Voici ce que j'ai fait avec une source de données JNDI obtenue à partir du conteneur Tomcat et injectée en tant que 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); 

Le contexte d'application:

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