JNDI在Spring和tomcat下的使用

  涂世广

1. 是什么

JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一。JNDI 在 J2EE 中的角色就是“交换机” —— J2EE 组件在运行时间接地查找其他组件、资源或服务的通用机制。在多数情况下,提供 JNDI 供应者的容器可以充当有限的数据存储,这样管理员就可以设置应用程序的执行属性,并让其他应用程序引用这些属性(Java 管理扩展(Java Management Extensions,JMX)也可以用作这个目的)。JNDI 在 J2EE 应用程序中的主要角色就是提供间接层,这样组件就可以发现所需要的资源,而不用了解这些间接性。

2. 为何用

程序员可以不用关心“具体的数据库后台是什么?JDBC驱动程序是什么?访问数据库的用户名和口令是什么?”等等这些问题,而是把这些问题交给J2EE容器来配置和管理,程序员只需要对这些配置和管理进行引用即可。

3. 怎么用

3.1 整体思路

  1. 在在J2EE容器如Tomcat中配置一个数据源,给这个数据源设置一个名称;
  2. 在项目程序中,通过数据源名称引用这个数据源从而访问后台数据库

3.2 示例

下面在Tomcat7.0+spring+springMVC+hibernate项目中演示用法。

Tomcat

在context.xml的根节点Context里加入Resource配置

  <Resource 
	  auth="Container" 
	  driverClassName="com.mysql.jdbc.Driver"
	  maxActive="20" 
	  maxIdle="10" 
	  maxWait="10000"
	  minEvictableIdleTimeMillis="10000" 
	  name="jdbc/testing"
	  testWhileIdle="true"
	  timeBetweenEvictionRunsMillis="8000" 
	  type="javax.sql.DataSource"
	  url="jdbc:mysql://localhost:3306/easycare_zhongze?autoReconnect=true&amp;useUnicode=true&amp;characterEncoding=UTF-8"
	  username="root" 
	  password="root" 
	  validationQuery="select 1" />
Spring
<beans profile="testing">
	<context:property-placeholder ignore-resource-not-found="true" 
		location="classpath:properties/testing.properties"/>
	<bean id="dataSource"
		class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName" value="jdbc/demoDatasource" />
		<property name="resourceRef" value="true" />
	</bean>
	<bean id="dataSourceProxy" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
		<property name="targetDataSource" ref="dataSource"/>
   </bean>
</beans>