下面的例子是在Tomcat7中配置JNDI DataSource,并把这个JNDI注册为Spring的Bean。

1.安装JDBC驱动

把JDBC驱动包放到$CATALINA_HOME/lib文件夹下。

2.配置JNDI DataSource

方式1:在META-INF下创建context.xml

<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<Resource name="jdbc/UserDB" auth="Container"
		type="javax.sql.DataSource" maxActive="20" maxIdle="30"
		maxWait="10000" username="root" password="root"
		driverClassName="com.mysql.jdbc.Driver"
		url="jdbc:mysql://localhost:3306/test" />
</Context>

 

注意:

    1. 这个在Tomcat7下有效,其它容器就不清楚了。

    2. 注意xml中不要忘记写<Context> !!!

方式2:修改$CATALINA_HOME/conf/context.xml

把上述Resource代码放到${CATALINA_HOME}/conf/context.xml中即可。如下图所示:

Tomcat中JNDI DataSource配置及使用

方式3:修改$CATALINA_HOME/conf/server.xml

把上述Resource代码放到${CATALINA_HOME}/conf/server.xml的GlobalNamingResource节点下。如下图所示:

Tomcat中JNDI DataSource配置及使用

方案对比

方案1:在META-INF下添加context.xml 针对当前Context有效。如果使用的容器是Tomcat,则这种方式更佳。
方案2:修改${CATALINA_HOME}/conf/context.xml 针对当前Context有效,对Tomcat有侵入
方案2:修改${CATALINA_HOME}/conf/server.xml 可多个Context共享使用,对Tomcat有侵入

3.引用Resource

在WEB-INF/web.xml声明需要使用的Resource。建议总是声明如下代码,这样就能知晓程序使用了哪些JNDI。

<!-- DataSource -->
<resource-ref>
	<description>JNDI Datasource</description>
	<res-ref-name>jdbc/UserDB</res-ref-name>
	<res-type>javax.sql.DataSource</res-type>
	<res-auth>Container</res-auth>
</resource-ref>

 

注意:试了下,方案1和方案2不加上面的代码也可以,但是方案3不加就会提示找不到jdbc/UserDB。

4.使用Spring获取JNDI DataSource

<!-- 写法1:直接使用JndiObjectFactoryBean构造 -->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/UserDB" />
    <property name="resourceRef" value="true" />
</bean>
<!-- 写法2:使用jee这个namespace -->
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/UserDB" resource-ref="true" />

<!-- 引用DataSource...... -->
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource" />
</bean>

 

扩展 - 关于Spring对JNDI的支持

1.Spring提供的支持

Tomcat中JNDI DataSource配置及使用

2.主要使用的就是JndiObjectFactoryBean

属性简单说明:

resourceRef:设置为true,表示会拼接"java:comp/env/",最终JDNI的名称为"java:comp/env/"+jndiName指定的名称="java:comp/env/jdbc/XXXDB"

lookupOnStartup:设置为false,表示在启动时不会是寻找JNDI,而是在使用时寻找

expectedType:需要指定这个JNDI的类型,如果使用懒加载(即lookupOnStartup=false),则必须指定proxyInterface或者expectedType

defaultObject:表示如果JNDI找不到,则返回默认对象

参考

1.[Tomcat7官方JNDI Datasource配置实例](http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html)

2.[Tomcat7官方对Context的介绍](http://tomcat.apache.org/tomcat-7.0-doc/config/context.html)

3.[Web项目开发环境中运行在Tomcat时涉及到JNDI的Datasource的解决方法](https://www.oschina.net/question/234345_51126)

4.[Tomcat 7.0 JNDI连接池配置](https://blog.csdn.net/jokes000/article/details/7463345)

5.[JNDI学习总结(二)——Tomcat下使用C3P0配置JNDI数据源](https://www.cnblogs.com/xdp-gacl/p/4040103.html)

 

相关文章: