下面的例子是在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中即可。如下图所示:
方式3:修改$CATALINA_HOME/conf/server.xml
把上述Resource代码放到${CATALINA_HOME}/conf/server.xml的GlobalNamingResource节点下。如下图所示:
方案对比
| 方案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提供的支持
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)