¿Cómo usar JNDI DataSource provisto por Tomcat en Spring?

Se dice en el artículo de Spring javadoc sobre la clase DriverManagerDataSource , que esta clase es muy simple y que se recomienda

utilizar un JNDI DataSource proporcionado por el contenedor. Tal DataSource puede exponerse como un bean DataSource en Spring ApplicationContext a través de JndiObjectFactoryBean

La pregunta es: ¿cómo lograr esto?

Por ejemplo, si deseo tener DataSource bean para acceder a mi base de datos custo mysql, ¿qué necesito entonces? ¿Qué escribir en la configuración de contexto, etc.?

Si usa la configuración basada en el esquema XML de Spring, configúrela en el contexto de Spring de esta manera:

  ...  

Alternativamente, configure usando una configuración simple de bean como esta:

    

Puede declarar el recurso JNDI en server.xml de tomcat usando algo como esto:

    

Y haga referencia al recurso JNDI desde el contexto web de Tomcat.xml de la siguiente manera:

   

Documentación de referencia:

  • Tomcat 8 JNDI Datasource HOW-TO
  • Referencia de enlaces de recursos de contexto de Tomcat 8
  • Spring 4 JEE JNDI Lookup XML Schema Reference
  • Spring 4 JdocObjectFactoryBean Javadoc

Editar: Esta respuesta se ha actualizado para Tomcat 8 y Spring 4. Se han realizado algunos cambios en el nombre de la propiedad para la configuración del grupo de recursos de origen de datos predeterminado de Tomcat.

Con el mecanismo JavaConfig de Spring, puedes hacerlo así:

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

Suponiendo que tiene una definición de fuente de datos “sampleDS” dentro de su configuración de tomcat, puede agregar las siguientes líneas a su applicationContext.xml para acceder a la fuente de datos usando JNDI.

  

jee definir el espacio de nombre y la ubicación del esquema para el prefijo jee usando:

 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" 

Documentación: C.2.3.1 (simple)

Ejemplo:

  

Solo necesita averiguar a qué nombre JNDI ha vinculado su servidor de aplicaciones la fuente de datos. Esto es completamente específico del servidor, consulte los documentos en su servidor para averiguar cómo.

Recuerde declarar el espacio de nombres jee en la parte superior del archivo beans, como se describe en C.2.3. El esquema jee .

Otra característica: en lugar de server.xml, puede agregar la etiqueta “Recurso” en
your_application / META-INF / Context.xml (según tomcat docs ) como este:

    

Según Apache Tomcat 7 JNDI Datasource HOW-TO página debe haber una configuración de recursos en web.xml:

  DB Connection jdbc/TestDB javax.sql.DataSource Container 

Funciona para mi

En tu clase de spring, puedes inyectar un bean anotado como

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

y Usted agrega esto en su contexto.xml

    

Puede declarar el recurso JNDI en server.xml de tomcat

  

volver a context.xml de spring agregar esto

  

Si, como este ejemplo, está inyectando conexión a la base de datos, asegúrese de que MySQL jar esté presente en el directorio lib de tomcat, de lo contrario, tomcat no podrá crear el conjunto de conexiones de la base de datos MySQL.

Encontré esta solución muy útil de una manera limpia para eliminar por completo la configuración xml.

Verifique esta configuración db utilizando JNDI y Spring framework. http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/