一、             简介

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. html name id, 与服务器交互必须有name

    html name id, 与服务器交互必须有name 在HTML中元素的ID和Name的区别和联系. 今天写了个测试,在php脚本里怎么也获取不到$_POST['userName']的值,经检查在h ...

  2. hdu2066一个人的旅行

    枚举全部相邻城市,作为起点,多次spfa,然后每次在想去的城市中找出spfa后的距离起点最短的花费时间 #include <iostream> #include <cstring&g ...

  3. [docker]coreOS与atomic对照

    声明: 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 内容系本人学习.研究和总结,如有雷同,实属荣幸! 摘自https://majo ...

  4. HTML5调用摄像头实现拍照功能(兼容各大主流浏览器)

    本人亲測,兼容各大主流浏览器,HTML5太强大了,须要的留下邮箱哦 假设想要立即收到,则可到我的资源下载 http://download.csdn.net/detail/laijieyao/81699 ...

  5. MyCAT部署及实现读写分离(转)

    MyCAT是mysql中间件,前身是阿里大名鼎鼎的Cobar,Cobar在开源了一段时间后,不了了之.于是MyCAT扛起了这面大旗,在大数据时代,其重要性愈发彰显.这篇文章主要是MyCAT的入门部署. ...

  6. haskell,lisp,erlang你们更喜欢哪个?

    haskell,lisp,erlang你们更喜欢哪个? haskell,lisp,erlang你们更喜欢哪个?

  7. POJ 1325 ZOJ 1364 最小覆盖点集

    题意:有A,B两台机器, 机器A 有 n个模式(0, 1, 2....n-1),同样机器B有m个模式, 两个机器一开始的模式都为0,有k个作业(id,x,y) 表示作业编号id, 该作业必须在A机器在 ...

  8. python socket编程实现的简单tcp迭代server

    与c/c++ socket编程对照见http://blog.csdn.net/aspnet_lyc/article/details/38946915 server: import socket POR ...

  9. libsvm中的dec_values以及分类结果评分问题

    最近一个图像识别项目里需要对分类的结果进行打分,因为使用的是libsvm3.12,一开始决定直接将svm_predict_values函数的dec_values作为评分返回,后来研究了之后才觉得里面有 ...

  10. CentOS 7没有ifconfig命令处理

    新安装CentOS 7 64位后发现查看ip配置的时候没有ifconfig,百度后发现# yum install net-tools软件包即可.