Comment utiliser JNDI DataSource fourni par Tomcat au spring?

Il est dit dans l’article de javadoc de spring sur la classe DriverManagerDataSource , que cette classe est très simple et qu’il est recommandé

utiliser une source de données JNDI fournie par le conteneur. Un tel DataSource peut être exposé en tant que bean DataSource dans un Spring ApplicationContext via JndiObjectFactoryBean

La question est: comment y parvenir?

Par exemple, si je souhaite avoir le bean DataSource pour accéder à ma firebase database custo mysql, qu’est-ce que je demande alors? Que écrire dans la configuration du contexte, etc.?

Si vous utilisez la configuration basée sur le schéma XML de Spring, installez-la dans le contexte Spring comme ceci:

  ...  

Vous pouvez également configurer en utilisant la configuration de bean simple comme ceci:

    

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

    

Et faites référence à la ressource JNDI du site web context.xml de Tomcat comme suit:

   

Documentation de référence:

  • Tomcat 8 JNDI Datasource HOW-TO
  • Tomcat 8 Context Resource Links Référence
  • Spring 4 Référence du schéma XML de recherche JNDI JEE
  • Printemps 4 JndiObjectFactoryBean Javadoc

Modifier: cette réponse a été mise à jour pour Tomcat 8 et Spring 4. Quelques modifications de nom de propriété ont été apscopes pour la configuration du pool de ressources de la source de données par défaut de Tomcat.

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

En supposant que vous ayez une définition de source de données “sampleDS” dans votre configuration tomcat, vous pouvez append les lignes suivantes à votre applicationContext.xml pour accéder à la source de données à l’aide de JNDI.

  

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

 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" 

Documentation: C.2.3.1 (simple)

Exemple:

  

Il vous suffit de savoir à quel nom JNDI votre serveur d’applications a lié la source de données. Ceci est entièrement spécifique au serveur, consultez les documents sur votre serveur pour savoir comment.

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

Une autre fonctionnalité: au lieu de server.xml, vous pouvez append une balise “Resource” dans
your_application / META-INF / Context.xml (selon les documents de Tomcat ) comme ceci:

    

Selon la page de la page de référence de la source de données JNDI d’Apache Tomcat 7, il doit y avoir une configuration de ressource dans web.xml:

  DB Connection jdbc/TestDB javax.sql.DataSource Container 

Ça marche pour moi

Dans votre classe de spring, vous pouvez injecter un haricot annoté comme

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

et vous ajoutez ceci dans votre context.xml

    

Vous pouvez déclarer la ressource JNDI dans le fichier server.xml de tomcat en utilisant

  

retour à context.xml de spring append ceci

  

Si, comme dans cet exemple, vous injectez une connexion à une firebase database, assurez-vous que MySQL est présent dans le répertoire tomcat, sinon tomcat ne pourra pas créer le pool de connexions à la firebase database MySQL.

J’ai trouvé cette solution très utile pour supprimer complètement la configuration XML.

Veuillez vérifier cette configuration de firebase database en utilisant JNDI et le framework Spring. http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/