example configurar java spring tomcat datasource jndi

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



jndi tomcat 8 example (8)

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

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


Documentación: C.2.3.1 <jee:jndi-lookup/> (simple)

Ejemplo:

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

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 .


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

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

y Usted agrega esto en su contexto.xml

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

Puede declarar el recurso JNDI en server.xml de tomcat

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

volver a context.xml de spring agregar esto

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

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.



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:

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


Según Apache Tomcat 7 JNDI Datasource HOW-TO página debe haber una configuración de recursos en 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>

Funciona para mi


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

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

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

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

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

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

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

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

Documentación de referencia:

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.


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:jndi-lookup expected-type="javax.sql.DataSource" id="springBeanIdForSampleDS" jndi-name="sampleDS"/>

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"