一、             简介

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

二、             tomcat配置jndi有三种方式。

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

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

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

优点:简单

缺点:重用性差

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

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

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

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

  1. <Context docBase="WebApp" path="/WebApp" reloadable="true">
  2. <ResourceLink global="jdbc/mysql" name="jdbc/mysql" type="javax.sql.DataSource" />
  3. </Context>

优点:重用性,可控性

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

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

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

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

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

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

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

这里的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配置文件中加入:

  1. <ResourceLink global="jndi/testdb" name="jndi/testdb" type="javax.sql.DataSource"/>

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

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

  1. <resource-ref>
  2. <description>JNDI DataSource</description>
  3. <res-ref-name>jndi/testdb</res-ref-name>
  4. <res-type>javax.sql.DataSource</res-type>
  5. <res-auth>Container</res-auth>
  6. </resource-ref>

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

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

  1. <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
  2. <property name="jndiName">
  3. <value>java:comp/env/jndi/testdb</value>
  4. </property>
  5. 5.     </bean>

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

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

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

1)同上
2)server.xml新增数据源即可,格式和单个相同,仅修改name

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

4)同上(可省略)

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

  1. <bean id="dbe2" class="org.springframework.jndi.JndiObjectFactoryBean">
  2. <property name="jndiName">
  3. <value>java:comp/env/jndi/dbe2</value>
  4. </property>
  5. </bean>
  6. <bean id="dbcpccj" class="org.springframework.jndi.JndiObjectFactoryBean">
  7. <property name="jndiName">
  8. <value>java:comp/env/jndi/dbcpccj</value>
  9. </property>
  10. </bean>
  11. <bean id="dataSource" class="com.wishbuild.persistent.source.DynamicDataSource">
  12. <property name="targetDataSources">
  13. <map key-type="java.lang.String"  value-type="com.wishbuild.persistent.source.DataSourceType">
  14. <entry value-ref="dbe2" key="dbe2"></entry>
  15. <entry value-ref="dbcpccj" key="dbcpccj"></entry>
  16. </map>
  17. </property>
  18. <property name="defaultTargetDataSource" ref="dbe2"></property>
  19. </bean>

6)修改 com.wishbuild.persistent.source 包中DataSourceType.java DataSourceLoadServer.java DynamicDataSource.java 三个文件。

第一个 DataSourceType.java

将 文件内容:

public enum DataSourceType {    dbe2, dbcpccj }

修改为 :

public class DataSourceType {

public static final String dbe2 = "dbe2";

public static final String dbcpccj = "dbcpccj";

}

第二个文件 DataSourceLoadServer.java

将文件内容中使用到 DataSourceType 类的都修改为 String,比如:

public static void setDataSourceType(DataSourceType dbType)

修改为:

public static void setDataSourceType(String dbType)

第三个文件 DynamicDataSource.java

将文件内容中使用到 DataSourceType 类的都修改为 String,比如:

DataSourceType key = DataSourceLoadServer.getDataSourceType();

修改为:

String key = DataSourceLoadServer.getDataSourceType();

以上六部配置完成,则JNDI+Tomcat 配置的多个数据源则可以进行动态切换,其中切换数据源代码为 :DataSourceLoadServer.setDataSourceType(DataSourceType.dbe2); 也就是与原先代码相同,多个数据源的好处就在于,只要在该tomcat下面启动的项目,比如 app,web 等项目,都可以调用该tomcat提供的任何数据源。

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

缺点:没有可控性

三、             数据源配置在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 load resource factory class [Root exception is java.lang.ClassNotFoundException: org.apache.commons.dbcp.BasicDataSourceFactory]
2010-1-18 13:22:37 org.apache.catalina.mbeans.GlobalResourcesLifecycleListener createMBeans
严重: Exception processing Global JNDI Resources
javax.naming.NamingException: Could not load resource factory class [Root exception 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.jar copy到tomcat的lib下。

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

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

Springmvc +JNDI 在Tomcat下 配置数据源(转)的更多相关文章

  1. Tomcat 下配置一个ip绑定多个域名

    原文:http://pkblog.blog.sohu.com/68921246.html 在网上找了半天也没找到相关的资料,都说的太含糊.本人对tomcat下配置 一ip对多域名的方法详细如下,按下面 ...

  2. 【CAS单点登录视频教程】 第04集 -- tomcat下配置https环境

    目录 ----------------------------------------- [CAS单点登录视频教程] 第06集[完] -- Cas认证 学习 票据认证FormsAuthenticati ...

  3. JNDI数据源(在Tomcat下配置JNDI多数据源实例)

    一,添加数据库驱动包加入classpath. 这里我用到了oracle和mysql.所以由两个jar包:ojdbc14.jar和mysql-connector-java-5.1.13-bin.jar. ...

  4. tomcat下配置jndi数据源c3p0

    Tomcat下通过JNDI配置数据源,使用c3p0连接池 首先在打开tomcat找到在conf文件下,找到server.xml 在server.xml文件中找到标签 在下面添加如下配置 <Res ...

  5. Tomcat下配置JNDI的三种方式

    最近在整理项目上的配置文件,正好看到了数据源配置,想着配置方式有多种,便趁热打铁,记录下常规的Tomcat配置数据源的方式 1.单个工程配置 找到Tomcat下的server.xml文件,在Conte ...

  6. Tomcat环境下配置数据源

    两种方式,图形化和字符型配置,图形化需要部署一个应用,字符型配置如下: 需要文件 mysql-connector-java-5.1.16-bin.jar Oracle需要classes12.jar文件 ...

  7. 在Tomcat中配置数据源

    使用工具:TOMCAT 7.0.52.IntelliJ IDEA 13.0.2.JSF 2.0+.SqlServer.jtds-1.2.5.jar 搞了好久都没成功,开始使用注解引入DataSourc ...

  8. 在Tomcat下配置Solr 4.x 版本

    solr是一款非常优秀的全文检索服务器,最新版本在配置和前台页面上都做了较大的改动, 所以对用惯了老版本的朋友们来说,再重新配置新版本的solr,无疑又是一件痛苦的事情. 配置环境:windows   ...

  9. tomcat下配置https环境

    在网上搜了一下,内容不是非常完好. 现进行整理,做个学习笔记,以备以后使用. (1)进入到jdk下的bin文件夹 (2)输入例如以下指令"keytool -v -genkey -alias ...

随机推荐

  1. osgEarth开发之OSG解构——失败的尝试

    概述 本文在吸收了<最长的一帧>以及相关参考资料的基础之上解读OSG的基础数据结构,渲染方法. 实现 在这第一部分里,要理解的是run函数的实现,因为以下这一段证明了它的重要性和强大的能力 ...

  2. 使用Boost库中的组件进行C++内存管理

    C++标准库中的auto_ptr,智能指针,部分的解决了获取资源自动释放的问题 在Boost中,提供了6中智能指针:scoped_ptr, scoped_array, shared_ptr, shar ...

  3. CentOS6-釋放ip重新分配,centos7 ifconifg没有ip

    http://bbs.csdn.net/topics/390725823 系统win7 ,dhcp自动获取ip虚拟机是10.0 安装之后我装了ubuntu  选用 NAT网络, 刚装完我能上网 ,但是 ...

  4. The mmap module

    The mmap module The mmap module (New in 2.0) This module provides an interface to the operating syst ...

  5. ie浏览器提交参数和其它浏览器的区别

    场景描述: 用户注册模块(ajax提交方式,post方法),在url后追加了一个参数,如:url+‘btnvalue=中文参数’,如此在非ie浏览器注册时,功能完好,但在ie下注册不成功.调式后发现在 ...

  6. OCP读书笔记(7) - 使用RMAN执行恢复

    7.Using RMAN to Perform Recovery 使用RMAN进行完全恢复system表空间文件丢失的恢复 模拟损坏: SQL> conn /as sysdba; SQL> ...

  7. MTK Android Driver:GPIO

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2JrODYxMTEw/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  8. 浅谈SQL之主键、外键约束

    约束:顾名思义就是一种限制,在表或列的层次设置约束,确保数据的有效性和完整性. SQL server中约束的主要分类: UNIQUE约束(唯一性约束) 防止一个特定的列中两个记录具有相同的值.可设置多 ...

  9. POJ 1703:Find them, Catch them(并用正确的设置检查)

    Find them, Catch them Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30702   Accepted: ...

  10. Android开源client之LookAround学习(一)Application &amp; 网络框架

    之前看过开源clientLookAround(下载地址:http://download.csdn.net/detail/hualulove/7306807),链接:http://blog.csdn.n ...