[连接池]Springmvc +JNDI 在Tomcat下 配置数据源

Springmvc +JNDI 在Tomcat下 配置数据源      

一、简介

jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。命名服务将名称和对象联系起来,使得我们可以用名称访问对象。目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。

 

二、tomcat配置jndi有三种方式

第一种:单个应用独享数据源

在Tomcat的server.xml找到工程的Context节点,添加一个私有数据源

 

<Context docBase="Web" path="/Web" reloadable="true" source="org.eclipse.jst.jee.server:WebApp">
<Resource name="jndi/dbtest"   //指定的jndi名称,会用于spring数据源bean的配置和
            auth="Container"   
            type="javax.sql.DataSource"   //数据源床型,使用标准的javax.sql.DataSource
            driverClassName="com.mysql.jdbc.Driver"   //JDBC驱动器
            url="jdbc:mysql://localhost:3306/test"   //数据库URL地址
            username="root"   //数据库用户名
            password="root"   //数据库密码
            maxActive="20"   
            maxIdle="10"   //最大的空闲连接数
          maxWait="10000"//当池的数据库连接已经被占用的时候,最大等待时间
            removeAbandoned="true"
            removeAbandonedTimeout="180"
            logAbandoned="true"//被丢弃的数据库连接是否做记录,以便跟踪
            factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" 
/>  
</Context>

 

优点:简单

缺点:重用性差

 

第二种:配置全局JNDI数据源,应用到单个应用

1. 在Tomcat的server.xml中GlobalNamingResources节点,在节点下加一个全局数据源

 

    <Resource name="jndi/dbtest"   //指定的jndi名称,会用于spring数据源bean的配置和
                auth="Container"   
                type="javax.sql.DataSource"   //数据源床型,使用标准的javax.sql.DataSource
                driverClassName="com.mysql.jdbc.Driver"   //JDBC驱动器
                url="jdbc:mysql://localhost:3306/test"   //数据库URL地址
                username="root"   //数据库用户名
                password="root"   //数据库密码
                maxActive="20"   
                maxIdle="10"   //最大的空闲连接数
              maxWait="10000"//当池的数据库连接已经被占用的时候,最大等待时间
                removeAbandoned="true"
                removeAbandonedTimeout="180"
                logAbandoned="true"//被丢弃的数据库连接是否做记录,以便跟踪
                factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" 
    />  

 

2. 在Tomcat的server.xml找到要应用此JNDI数据源的工程Context节点,增加对全局数据源的引用ResourceLink

 

<Context docBase="Webtest" path="/Webtest" reloadable="true">
ResourceLink global="jdbc/dbtest" name="jdbc/dbtest" type="javax.sql.DataSource" />
</Context> 

 

优点:重用性,可控性

缺点:配置相对第三种方法要繁琐一点,每个工程都得配

 

 

第三种:配置全局JNDI数据源,应用到所有Tomcat下部署的应用

 

1      配置tomcat单个全局数据源。(已验证)

由于存在同时加载多个web工程,配置之后任何一个web项目都可以使用

1) 在tomcat的 lib 文件夹下添加 JDBC驱动包。

2)在tomcat的conf文件夹下的server.xml配置文件中加入:

                <Resource name="jndi/dbtest"   //指定的jndi名称,会用于spring数据源bean的配置和
                            auth="Container"   
                            type="javax.sql.DataSource"   //数据源床型,使用标准的javax.sql.DataSource
                            driverClassName="com.mysql.jdbc.Driver"   //JDBC驱动器
                            url="jdbc:mysql://localhost:3306/test"   //数据库URL地址
                            username="root"   //数据库用户名
                            password="root"   //数据库密码
                            maxActive="20"   
                            maxIdle="10"   //最大的空闲连接数
                          maxWait="10000"//当池的数据库连接已经被占用的时候,最大等待时间
                            removeAbandoned="true"
                            removeAbandonedTimeout="180"
                            logAbandoned="true"//被丢弃的数据库连接是否做记录,以便跟踪
                            factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory" 
                />  

这里的factory指的是该Resource 配置使用的是哪个数据源配置类,这里使用的是tomcat自带的标准数据源Resource配置类,这个类也可以自己写,实现javax.naming.spi.ObjectFactory 接口即可。某些地方使用的commons-dbcp.jar中的org.apache.commons.dbcp.BasicDataSourceFactory,如果使用这个就需把commons-dbcp.jar及其依赖的jar包,都放在tomcat的lib下,光放在工程的WEB-INF/lib下是不够的。

3) 在tomcat的conf文件夹下的context.xml配置文件中加入:

 

 

 

 

<ResourceLinkglobal="jndi/dbtest"name="jndi/dbtest"type="javax.sql.DataSource"/>


把全局的resource直接公开给该tomcat下的所有web工程。

 

 

 

4) 在web项目的web.xml中加入资源引用:(可省略)

 

<resource-ref>
<description>JNDI DataSource</description>
<res-ref-name>jndi/testdb</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

启动的时候加载tomcat配置的JNDI 公开数据源,其中res-ref-name值要和server.xml 、context.xml的name值一致。

 

 

 

5)在web项目中配置spring数据源bean信息:

 

<bean id="dataSource"class="org.springframework.jndi.JndiObjectFactoryBean">
<propertyname="jndiName">
<value>java:comp/env/jndi/testdb</value>
 </property>
</bean>

直接替换项目WEB-INF/conf/data-access-config.xml文件中 beanid=”dataSource” 的节点即可使用

 

 

2       配置tomcat多个全局数据源(已验证)

 

注意:配置文件步骤与单个项目相同,仅修改文件内容

1)在tomcat的 lib 文件夹下添加 JDBC驱动包。 

2)server.xml新增数据源即可,格式和单个相同,仅修改name ,参考单个配置2)。 

3) context.xml 新增配置,格式和单个相同,参考单个配置3)。

4)在web项目的web.xml中加入多个资源引用:参考单个配置4) (可省略)

5) dbe2 为数据源一,dbcpccj为数据源二,dataSource中与原框架中区别为下划线部分的内容

<beanid="dbtest1"class="org.springframework.jndi.JndiObjectFactoryBean">
<propertyname="jndiName">
 <value>java:comp/env/jndi/dbtest1</value>
 </property>
 </bean>

 <beanid="dbtest2"class="org.springframework.jndi.JndiObjectFactoryBean">
  <propertyname="jndiName">
     <value>java:comp/env/jndi/dbtest2</value>
  </property>
</bean>

 <beanid="dataSource"class="com.wishbuild.persistent.source.DynamicDataSource">
       <propertyname="targetDataSources">  
           <mapkey-type="java.lang.String" value-type="com.wishbuild.persistent.source.DataSourceType">  
               <entryvalue-ref="dbtest1"key="dbtest1"></entry>  
               <entryvalue-ref="dbtest2"key="dbtest2"></entry>  
           </map>  
       </property>  
       <propertyname="defaultTargetDataSource"ref="dbtest1"></property>  
</bean>  

优点:重用性,一次性到位

缺点:没有可控性

 

 

三、数据源配置在Tomcat/conf/ context.xml文件或者 server.xml 文件 中的区别

server.xml是不可动态重加载的资源,服务器一旦启动了以后,要修改这个文件,就得重启服务器才能重新加载。而context.xml文件,tomcat服务器会定时去扫描这个文件。一旦发现文件被修改(时间戳改变了),就会自动重新加载这个文件,而不需要重启服务器。

 

 

四、常见的报错及解决方案

 

a)   java.lang.ClassNotFoundException:org.apache.commons.dbcp.BasicDataSourceFactory

报错详情:

……警告:Failed to register in JMX: javax.naming.NamingException: Could not loadresource factory class [Root exception is java.lang.ClassNotFoundException:org.apache.commons.dbcp.BasicDataSourceFactory]

2010-1-18 13:22:37 org.apache.catalina.mbeans.GlobalResourcesLifecycleListenercreateMBeans

严重: Exception processing Global JNDI Resources

javax.naming.NamingException: Could not load resource factory class [Rootexception is java.lang.ClassNotFoundException:org.apache.commons.dbcp.BasicDataSourceFactory]……

 

问题描述:这是找不到org.apache.commons.dbcp.BasicDataSourceFactory类,这个类在commons-dbcp.jar中,这jar包时放在工程的WEB-INF/lib下的,而不是tomcat的lib下,但tomcat启动时读取它自身的配置(如server.xml),用的不是工程的lib而是tomcat自带的lib,所以必然报错。就算把这个包拷到tomcat的lib下也不行,因为commons-dbcp.jar与其他jar包还存在一定的依赖关系。

解决方案:把tomcat jndi配置中的factory="org.apache.commons.dbcp.BasicDataSourceFactory"改为tomcat自带的factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"。

 

b)   Caused by:javax.naming.NameNotFoundException: Name memberMDB is not bound in this Context

问题描述:大多数是因为配置了全局的resource,但没有link造成的。全局resource就是配置在server.xml中GlobalNamingResources节点里的Resource,这种Resource还需要再在Context节点中配置一个ResourceLink,把全局的resource绑定到工程的局部配置中。

 

解决方案:配置全局的 ResourceLink。

 

c)    Cannot load JDBC driver class 'com.mysql.jdbc.Driver'java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

问题描述:因为jndi的配置需要用到mysql的驱动器,所以tomcat的lib下需要加入mysql驱动器的jar包,我用的是mysql-connector-java-5.1.5-bin.jar。

 

解决方案:把工程WEB-INF/lib下的mysql-connector-java-5.1.5-bin.jarcopy到tomcat的lib下。

 

d)  Name [jndi/testdb] is not bound in this Context. Unableto find [jdbc].

 

解决方案:检查配置tomcat (server.xml和context.xml) 和 web项目中web.xml 和data-access-config.xml的配置文件中命名是否相同。


转载地址:http://blog.csdn.net/hou549135295/article/details/27206943

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值