如何在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/