162 votes

Comment utiliser la source de données JNDI fournie par Tomcat dans Spring ?

Il est dit que dans l'article de la javadoc de Spring à propos de DriverManagerDataSource classe, que cette classe est très simple et qu'il est recommandé

pour utiliser une source de données JNDI fournie par le conteneur. Une telle DataSource peut être exposé comme un DataSource dans un ApplicationContext de Spring par l'intermédiaire de JndiObjectFactoryBean

La question est la suivante : comment faire ?

Par exemple, si je souhaite avoir DataSource bean pour accéder à ma base de données MySQL personnalisée, de quoi aurais-je besoin alors ? Que dois-je écrire dans la configuration du contexte, etc.

305voto

kaliatech Points 8331

Si vous utilisez la configuration basée sur le schéma XML de Spring, configurez le contexte de Spring de la manière suivante :

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">
...
<jee:jndi-lookup id="dbDataSource"
   jndi-name="jdbc/DatabaseName"
   expected-type="javax.sql.DataSource" />

Vous pouvez aussi utiliser une configuration simple des haricots comme ceci :

<bean id="DatabaseName" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/DatabaseName"/>
</bean>

Vous pouvez déclarer la ressource JNDI dans le server.xml de tomcat en utilisant quelque chose comme ceci :

<GlobalNamingResources>
    <Resource name="jdbc/DatabaseName"
              auth="Container"
              type="javax.sql.DataSource"
              username="dbUser"
              password="dbPassword"
              url="jdbc:postgresql://localhost/dbname"
              driverClassName="org.postgresql.Driver"
              initialSize="20"
              maxWaitMillis="15000"
              maxTotal="75"
              maxIdle="20"
              maxAge="7200000"
              testOnBorrow="true"
              validationQuery="select 1"
              />
</GlobalNamingResources>

Et référencez la ressource JNDI à partir du web context.xml de Tomcat comme ceci :

  <ResourceLink name="jdbc/DatabaseName"
   global="jdbc/DatabaseName"
   type="javax.sql.DataSource"/>

Documentation de référence :

Edit : Cette réponse a été mise à jour pour Tomcat 8 et Spring 4. Il y a eu quelques changements dans le nom des propriétés de Tomcat. par défaut configuration du pool de ressources de la source de données.

0 votes

@skaffman Oui, mais vous fournissez un lien vers la documentation de référence de Spring.

0 votes

Quel fichier exactement voulez-vous dire par "Tomcat's web context.xml" ?

1 votes

@PavelNiedoba Tomcat utilise un "contexte" pour la configuration des applications web spécifiques à Tomcat. Le fichier de contexte et/ou la configuration du contexte peuvent être placés à différents endroits, je ne peux donc pas vous donner une réponse définitive. Un emplacement courant est "/META-INF/context.xml". Voir la section "Définir un contexte" ici : tomcat.apache.org/tomcat-8.0-doc/config/

54voto

Abdull Points 1666

Avec le mécanisme JavaConfig de Spring, vous pouvez le faire comme suit :

@Configuration
public class MainConfig {

    ...

    @Bean
    DataSource dataSource() {
        DataSource dataSource = null;
        JndiTemplate jndi = new JndiTemplate();
        try {
            dataSource = jndi.lookup("java:comp/env/jdbc/yourname", DataSource.class);
        } catch (NamingException e) {
            logger.error("NamingException for java:comp/env/jdbc/yourname", e);
        }
        return dataSource;
    }

}

3 votes

Ou utilisez la fonction plus spécialisée JndiDataSourceLookup

21voto

melihcelik Points 2411

En supposant que vous avez une définition de la source de données "sampleDS" dans votre configuration de tomcat, vous pouvez ajouter les lignes suivantes à votre configuration de tomcat applicationContext.xml pour accéder à la source de données en utilisant JNDI.

<jee:jndi-lookup expected-type="javax.sql.DataSource" id="springBeanIdForSampleDS" jndi-name="sampleDS"/>

Vous devez définir l'espace de noms et l'emplacement du schéma pour les éléments suivants jee préfixe utilisé :

xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"

15voto

skaffman Points 197885

Documentation : C.2.3.1 <jee:jndi-lookup/> (simple)

Exemple :

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource"/>

Il vous suffit de trouver le nom JNDI auquel votre appserver a lié la source de données. Ceci est entièrement spécifique au serveur, consultez les docs de votre serveur pour savoir comment.

N'oubliez pas de déclarer le jee en haut de votre fichier beans, comme décrit dans la rubrique C.2.3 Le schéma jee .

5voto

Antonio Points 11

Selon Page HOW-TO sur la source de données JNDI d'Apache Tomcat 7 il doit y avoir une configuration des ressources dans web.xml :

<resource-ref>
  <description>DB Connection</description>
  <res-ref-name>jdbc/TestDB</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>

Cela fonctionne pour moi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X