`
gearever
  • 浏览: 147922 次
社区版块
存档分类
最新评论

tomcat架构分析 (JNDI配置)

阅读更多
出处:http://gearever.iteye.com

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

通俗点说,JNDI封装了一个简单name到实体对象的mapping,通过字符串可以方便的得到想要的对象资源。通常这种对象资源有很多种,例如数据库JDBC,JMS,EJB等。平时用的最多的就是数据库了。在tomcat中,这些资源都是以java:comp/env开头的字符串来绑定的。以数据库连接为例,我们在app中的调用场景是;

//获得对数据源的引用:
Context ctx = new InitalContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/myDB");
//获得数据库连接对象:
Connection conn = ds.getConnection();
//返回数据库连接到连接池:
conn.close();


因为经常看到有人问怎么在tomcat中配置数据库连接池等问题,这篇文章就对tomcat中的JNDI的配置做一个小结,不涉及tomcat代码方面。tomcat架构分析 (JNDI体系绑定)从代码原理角度专门说明这些配置是如何生效,及app中调用JNDI API获取对象,其底层如何实现的。

Tomcat内部有一堆类型的resource配置。这些类型的resource的配置大体上可分为两个层次来进行,这两个层次是并列的关系,分别针对不同的开发部署方案设定的。

第一种方案

这种方案主要是对于快速部署而言,其核心是tomcat本身有一个global的resource池,新部署的app只引用其中已有的resouce,而不是创建新的resource。
先看看<tomcat>/conf/server.xml
<Server port="8005">	
<GlobalNamingResources>
     <Resource
        name="jdbc/mysql"
        type="javax.sql.DataSource"
        username="root"
        password="root"
        driverClassName="com.mysql.jdbc.Driver"
        maxIdle="200"
        maxWait="5000"
        url="……"
        maxActive="100"/>    
   </GlobalNamingResources>
……
</Server>

这是一个全局的配置,这时如果每个具体的context(webapp)中如果要引用这个resource,则需要在各个context对象中配置 resourcelink,然后在各个app的web.xml中配置<resource-ref>.
<tomcat>/conf/server.xml
<Server port="8005">	
<Service>
   <Engine>
      <Host>
         <Context>
           < ResourceLink globalname=" jdbc/mysql " name="myDB" type="…"/>
         </Context>
      </Host>
    </Engine>
</Service>
……
</Server>

或者在每个app的Context.xml中配置
<Context>
           < ResourceLink globalname=" jdbc/mysql " name="myDB" type="…"/>
</Context>

然后在app的WEB-INF/web.xml中配置
<web-app>
		<resource-ref>							
				<description/>
				<res-auth/>
				<res-ref-name>myDB</res-ref-name>
				<res-sharing-scope/>
				<res-type/>		
		</resource-ref>
</web-app>

代码中这么调用
//获得对数据源的引用:
Context ctx = new InitalContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/myDB");
//获得数据库连接对象:
Connection conn = ds.getConnection();
//返回数据库连接到连接池:
conn.close();

由此可见,context中配置的ResourceLink属于一个中转的作用,这主要是为了在tomcat启动状态下,如果新部署一个app,可以在app中指定到相应的全局的resource。
它们的mapping关系是;

Tomcat这种资源不限于数据库连接,还有很多例如EJB,Web Service等,在配置中它们分别对应不同的节点。例如上面的数据库连接,在server.xml中对应<Resource>,在web.xml中对应的是<resource-ref>,EJB连接在server.xml中对应<Ejb>,在web.xml中对应的是<ejb-ref>等,因为有些资源在现在的开发中应用的不是很多,就不一一例举了,总结一下它们所有的对应关系;


第二种方案
没有上述方案那么麻烦,主要是为了需要引用一个自己独有的资源对象的app而言。
<tomcat>/conf/server.xml
<Server port="8005">	
  <Service>
   <Engine>
      <Host>
         <Context>
           <Resource
              name="jdbc/mysql"
              type="javax.sql.DataSource"
              username="root"
              password="root"
              driverClassName="com.mysql.jdbc.Driver"
              maxIdle="200"
              maxWait="5000"
              url="……"
              maxActive="100"/>
         </Context>
      </Host>
    </Engine>
  </Service>
……
</Server>

或者在每个app的Context.xml中配置
<Context>
       <Resource
        name="jdbc/mysql"
        type="javax.sql.DataSource"
        username="root"
        password="root"
        driverClassName="com.mysql.jdbc.Driver"
        maxIdle="200"
        maxWait="5000"
        url="……"
        maxActive="100"/>  
</Context>


这种方式,不需要在app的WEB-INF/web.xml中再设定resource-ref了,直接在程序中就可lookup到相应的对象。

代码中这么调用
//获得对数据源的引用:
Context ctx = new InitalContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/mysql");
//获得数据库连接对象:
Connection conn = ds.getConnection();
//返回数据库连接到连接池:
conn.close();


比较一下,两种方式的配置,调用java:comp/env的name时还是不一样的。
分享到:
评论

相关推荐

    Jboss集群配置指南

    2. Tomcat配置 6 3. Jboss配置 6 3.1. 配置Session复制 6 3.2. 配置Clustering services 6 3.3. 配置TreeCache cluster service 7 4. 设置run 参数 7 5. Web client 7 5.1. web.xml 7 5.2. jboss-web.xml 7 5.3. ...

    tomcat/resin使用全局数据库连接池资源

     所以我近的一些项目都是采用这种架构,但是这种方式有一些不足的是当应用服务器配置了多个应用,而这些应用使用同一个数据库,这会导致不必要的资源浪费,也是同一个应用服务器中存在针对同一个数据库的多个连接...

    Javaweb技术文档

    张晓飞_Tomcat系统架构分析 张晓飞_UML模型图 张晓飞_WEB书城. 张晓飞_正则表达式学习手册 HTTP协议简介_封捷 JNDI原理_张晓飞 Servlet_封捷 Web基础架构:负载均衡和LVS_张晓飞 Web应用环境搭建__封捷 XML简介_封...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    5.3.2 为Eclipse配置Tomcat插件 5.4 使用Eclipse建立Web开发项目 5.5 Eclipse的常用快捷键 5.5.1 有关格式化的快捷键 5.5.2 有关调试的快捷键 5.5.3 有关重构的快捷键 5.6 小结 第六章 Log4j使用指南 6.1 Log4j介绍 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    5.3.2 为Eclipse配置Tomcat插件 5.4 使用Eclipse建立Web开发项目 5.5 Eclipse的常用快捷键 5.5.1 有关格式化的快捷键 5.5.2 有关调试的快捷键 5.5.3 有关重构的快捷键 5.6 小结 第六章 Log4j使用指南 6.1 Log4j介绍 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    5.3.2 为Eclipse配置Tomcat插件 5.4 使用Eclipse建立Web开发项目 5.5 Eclipse的常用快捷键 5.5.1 有关格式化的快捷键 5.5.2 有关调试的快捷键 5.5.3 有关重构的快捷键 5.6 小结 第六章 Log4j使用指南 6.1 Log4j介绍 ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    5.3.2 为Eclipse配置Tomcat插件 5.4 使用Eclipse建立Web开发项目 5.5 Eclipse的常用快捷键 5.5.1 有关格式化的快捷键 5.5.2 有关调试的快捷键 5.5.3 有关重构的快捷键 5.6 小结 第六章 Log4j使用指南 6.1 Log4j介绍 ...

    构建基于Hibernate的servlet

    火龙果软件工程技术中心 在上一篇,我们讨论了如何配置Tomcat5.5的Context.xml文件,它能够建立Tomcat5.5中的只读JNDI。通过这个JNDI,可以为你的Tomcatservlet提供数据源—无论在你的servlet中使用的是Hibernate...

    J2EE应用开发详解

    17 2.1 构建开发环境 17 2.1.1 安装JDK 17 2.1.2 安装Tomcat 21 2.1.3 安装Eclipse 23 2.2 配置开发环境 23 2.3 小结 26 第3章 Java的反射机制 27 3.1 Java反射API 27 3.2 加载类的实例 29 3.2.1 加载class对象的两...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    由于B/S架构管理软件只安装在服务器端(Server)上,即应用程序在部署、升级、维护时,只需要在服务器端进行配置就可以了,网络管理人员只需要管理服务器就行了,用户界面主要事务逻辑在服务器(Server)端完全通过...

    spring4.1核心包

    9.spring-instrument-tomcat-4.1.1.RELEASE.jar Spring对tomcat连接池的集成 10. spring-jdbc-4.1.1.RELEASE.jar 对jdbc简单封装 11.spring-jms-4.1.1.RELEASE.jar 简单封装jms api接口 jms: Java消息服务(Java ...

    java面试题

    52.6. 配置tomcat 6.0.10连接池 26 52.7. Hibernate实现数据库的连接不同方式: 28 52.8. 有几种开源的数据库连接池: 29 53. 描述一下JVM加载class文件的原理机制? 30 54. socket编程 30 54.1. 什么是TCP/IP、UDP?...

    超级有影响力霸气的Java面试题大全文档

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    java 面试题 总结

    但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地...

    最全Hibernate 参考文档

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 ...

    Hibernate3+中文参考文档

    1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 ...

    JAVA上百实例源码以及开源项目

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

    JAVA上百实例源码以及开源项目源代码

    1个目标文件,JNDI的使用例子,有源代码,可以下载参考,JNDI的使用,初始化Context,它是连接JNDI树的起始点,查找你要的对象,打印找到的对象,关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高...

Global site tag (gtag.js) - Google Analytics