web-dev-qa-db-fra.com

Comment utiliser JNDI DataSource fourni par Tomcat au printemps?

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

d'utiliser un JNDI DataSource fourni par le conteneur. Une telle DataSource peut être exposée comme un haricot DataSource dans un Spring ApplicationContext via JndiObjectFactoryBean

La question est: comment puis-je accomplir cela?

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

150
Suzan Cioc

Si vous utilisez la configuration basée sur un schéma XML de Spring, configurez-la dans le contexte 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 également utiliser une configuration de bean simple comme suit:

<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 fichier server.xml de Tomcat en procédant comme suit:

<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 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. Quelques modifications de nom de propriété ont été apportées à la configuration du pool de ressources de source de données par défaut de Tomcat .

296
kaliatech

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

}
48
Abdull

En supposant que vous ayez une définition de source de données "sampleDS" dans votre configuration Tomcat, vous pouvez ajouter les lignes suivantes à votre applicationContext.xml pour accéder à la source de données à l'aide de JNDI.

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

Vous devez définir l'espace de nom et l'emplacement du schéma pour le préfixe jee à l'aide de:

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"
20
melihcelik

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

Exemple:

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

Il vous suffit de connaître le nom JNDI attribué à votre serveur d'applications par la source de données. Ceci est entièrement spécifique au serveur, consultez la documentation sur votre serveur pour savoir comment.

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

15
skaffman

Autre fonctionnalité: au lieu de server.xml, vous pouvez ajouter la balise "Resource" dans
votre_application/META-INF/Context.xml (selon document Tomcat ) comme ceci:

<Context>
<Resource name="jdbc/DatabaseName" auth="Container" type="javax.sql.DataSource"
  username="dbUsername" password="dbPasswd"
  url="jdbc:postgresql://localhost/dbname"
  driverClassName="org.postgresql.Driver"
  initialSize="5" maxWait="5000"
  maxActive="120" maxIdle="5"
  validationQuery="select 1"
  poolPreparedStatements="true"/>
</Context>
8
Evgen

Selon page de guide de source de données JNDI pour Apache Tomcat 7 , il doit exister une configuration de ressource dans le fichier 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>

Ça marche pour moi

5
Antonio

J'ai trouvé cette solution très utile d'une manière propre pour supprimer entièrement la configuration XML.

Veuillez vérifier cette configuration de base de données à l'aide de JNDI et de Spring Framework. http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/

Cet article explique à quel point il est facile de créer une configuration de base de données basée sur la configuration de base de données jndi (db/test). une fois que vous avez terminé la configuration, tous les référentiels de base de données sont chargés à l'aide de ce jndi. J'ai trouvé utile. Si @Pierre a un problème avec cela, faites le moi savoir. C'est une solution complète pour écrire la configuration de la base de données.

2
user3892286

Dans votre cours de printemps, vous pouvez injecter un haricot annoté comme

@Autowired
@Qualifier("dbDataSource")
private DataSource dataSource;

et vous ajoutez ceci dans votre fichier context.xml

<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <beans:property name="jndiName" value="Java:comp/env/jdbc/MyLocalDB"/>
</beans:bean>

Vous pouvez déclarer la ressource JNDI dans le fichier server.xml de Tomcat à l'aide de

<Resource name="jdbc/TestDB" 
  global="jdbc/TestDB" 
  auth="Container" 
  type="javax.sql.DataSource" 
  driverClassName="com.mysql.jdbc.Driver" 
  url="jdbc:mysql://localhost:3306/TestDB" 
  username="pankaj" 
  password="pankaj123" 

  maxActive="100" 
  maxIdle="20" 
  minIdle="5" 
  maxWait="10000"/>

retour à context.xml de spring ajouter ceci

<ResourceLink name="jdbc/MyLocalDB"
                global="jdbc/TestDB"
                auth="Container"
                type="javax.sql.DataSource" />

si, comme dans cet exemple, vous injectez une connexion à une base de données, assurez-vous que le fichier jar MySQL est présent dans le répertoire lib de Tomcat, sinon Tomcat ne pourra pas créer le pool de connexions de base de données MySQL.

2
Toumi