如何在Spring中使用由Tomcat提供的JNDI数据源?

在Spring的javadoc文章中有关于DriverManagerDataSource类的说法,这个类很简单,推荐使用

使用容器提供的JNDI数据源。 这样的DataSource可以通过JndiObjectFactoryBean在Spring ApplicationContext中作为DataSource bean公开

问题是:如何做到这一点?

例如,如果我希望有DataSource bean来访问我的custo mysql数据库,那么我需要什么? 在上下文configuration等写什么?

如果使用Spring的基于XML模式的configuration,在Spring上下文中设置如下:

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

或者,使用这样简单的beanconfiguration进行设置:

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

你可以使用类似下面的方法在tomcat的server.xml中声明JNDI资源:

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

并从Tomcat的web context.xml中引用JNDI资源,如下所示:

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

参考文件:

  • Tomcat 8 JNDI数据源操作方法
  • Tomcat 8上下文资源链接参考
  • Spring 4 JEE JNDI查找XML模式参考
  • Spring 4 JndiObjectFactoryBean Javadoc

编辑:这个答案已经更新为Tomcat 8和Spring 4. Tomcat的默认数据源资源池设置有一些属性名称更改。

用Spring的JavaConfig机制,你可以这样做:

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

假设你在tomcatconfiguration中有一个“sampleDS”数据源定义,你可以在你的applicationContext.xml添加以下几行来使用JNDI来访问数据源。

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

您必须使用以下命令定义jee前缀的名称空间和模式位置:

 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" 

文档: C.2.3.1 <jee:jndi-lookup/> (简单)

例:

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

你只需要找出你的应用服务器绑定数据源的JNDI名称。 这完全是服务器特定的,请参阅您的服务器上的文档以了解如何。

请记住在你的bean文件的顶部声明jee命名空间,如C.2.3 jee模式所述 。

另一个特性:而不是server.xml,你可以添加“资源”标签
your_application / META-INF / Context.xml(根据tomcat文档 )是这样的:

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

根据Apache Tomcat 7的JNDI Datasource HOW-TO页面 ,web.xml中必须有一个资源configuration:

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

这对我行得通

在你的spring类中,你可以注入一个像as一样注释的bean

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

你可以在你的context.xml中添加它

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

您可以使用在tomcat的server.xml中声明JNDI资源

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

回到context.xml de spring添加这个

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

如果像这样例如注入连接数据库,请确保MySQL jar存在于tomcat lib目录中,否则tomcat将无法创buildMySQL数据库连接池。

我发现这个解决scheme非常有帮助,完全清除xmlconfiguration。

请使用JNDI和spring框架检查这个数据库configuration。 http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/