兼容Tomcat和Weblogic的Spring 数据源JNDI配置

时间:2020-12-09 19:10:01



    博客分类: 
  • java
weblogictomcatjavajndispring
众所周知,Tomcat和Weblogic中查找JNDI的名称是不一样的,以Spring配置为例,在Weblogic中,需要这样配: 
Java代码  兼容Tomcat和Weblogic的Spring 数据源JNDI配置
  1. <bean id="baseDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">  
  2.       <property name="jndiName" value="dataSource" />  
  3. </bean>     

但是在Tomcat中却是这样的: 
Java代码  兼容Tomcat和Weblogic的Spring 数据源JNDI配置
  1. <bean id="baseDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">  
  2.       <property name="jndiName" value="java:comp/env/dataSource" />  
  3. </bean>     


当使用Tomcat开发(速度快啊),又要部署到Weblogic时,怎么兼容就是比较头疼的问题了。当然,我们可以配置JDBC直连的方式: 
Java代码  兼容Tomcat和Weblogic的Spring 数据源JNDI配置
  1. <bean id="baseDataSource"  
  2.        class="org.apache.commons.dbcp.BasicDataSource"  
  3.        destroy-method="close">  
  4.        <property name="driverClassName" value="oracle.jdbc.OracleDriver" />  
  5.        <property name="url" value="jdbc:oracle:thin:@192.168.1.239:1521:dev1" />  
  6.        <property name="username" value="foo" />  
  7.        <property name="password" value="bar" />  
  8.        <property name="initialSize" value="2" />  
  9.        <property name="maxActive" value="15" />  
  10.        <property name="testWhileIdle" value="true" />  
  11.        <property name="validationQuery" value="select 1 from dual" />  
  12.        <property name="testOnBorrow" value="true" />  
  13. </bean>  

这样在Tomcat和Weblogic中就都可以部署了,但是缺点也是显而易见的,万一要修改数据库连接信息,就得改Spring配置! 

我们可以利用Spring2.0引入的jndi-lookup内容模式,对配置进行改进(注意文件开头引入了jee的xsd): 
Java代码  兼容Tomcat和Weblogic的Spring 数据源JNDI配置
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"    
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
  4.        xmlns:jee="http://www.springframework.org/schema/jee"    
  5.        xsi:schemaLocation=    
  6.                 "http://www.springframework.org/schema/beans     
  7.                 http://www.springframework.org/schema/beans/spring-beans-2.0.xsd    
  8.                 http://www.springframework.org/schema/jee     
  9.                 http://www.springframework.org/schema/jee/spring-jee-2.0.xsd">    
  10.    
  11.     <jee:jndi-lookup id="baseDataSource" jndi-name="dataSource" resource-ref="true"/>  


注意这里的resource-ref="true",当resource-ref属性为true时,jndiName会被添加java:comp/env/,而这个正是Tomcat查找JNDI的地方,所以Tomcat能用! 
至于Weblogic,可能是直接通过jndi-name属性去查找JNDI了,所以也可以用。 

顺带附上Tomcat7的JNDI配置,我配的是全局的,所以在%TOMCAT_HOME%\conf\context.xml中配置: 
Java代码  兼容Tomcat和Weblogic的Spring 数据源JNDI配置
  1. <Resource name="dataSource" auth="Container"  
  2.            type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"  
  3.            url="jdbc:oracle:thin:@192.168.1.239:1521:dev1"  
  4.            username="foo" password="bar" maxActive="15" maxIdle="10" initialSize="2"  
  5.            testWhileIdle="true" validationQuery="select 1 from dual" testOnBorrow="true"/>  

我用的是oracle,驱动复制到%TOMCAT_HOME%\lib下,web.xml不需要配置。