ljc666666ID:ljc666666
647次访问,排名2万外好友0人,关注者0
ljc666666的文章
原创 0 篇
翻译 0 篇
转载 1 篇
评论 1 篇
最近评论
mldstk:wow power leveling
文章分类
    收藏
      相册
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      转载 TOMCAT收藏

       | 

       

      第一章  Tomcat概述

       

       

      一、Tomcat简介

       

      1Tomcat

         

      Tomcat在严格意义上并不是一个真正的应用服务器,它只是一个可以支持运行Serlvet/JSPWeb容器,不过Tomcat也扩展了一些应用服务器的功能,如JNDI,数据库连接池,用户事务处理等等。TomcatApache组织下Jakarta项目下的一个子项目,目前Tomcat被非常广泛的应用在中小规模的Java Web应用中。

      Tomcat 是一种具有JSP环境的Servlet容器。Servlet容器是代替用户管理和调用 Servlet的运行时外壳。作为一个开放源代码的软件, Jakarta -Tomcat有着自己独特的优势:

      l         首先,它容易得到。事实上,任何人都可以从互联网上自由地下载这个软件。无论从http://jakarta.Apache.org还是从其他网站(Jakarta TomcatApache软件基金会开发的一个开放源码的应用服务器)。

      l         其次,对于开发人员,特别是Java开发人员,Tomcat提供了全部的源代码,包括Servlet引擎、JSP引擎、HTTP服务器。无论是对哪一方面感兴趣的程序员,都可以从这些由世界顶尖的程序员书写的代码中获得收益。

      l         最后,由于源代码的开放及世界上许多程序员的卓有成效的工作, Tomcat已经可以和大部分的主流服务器一起工作,而且是以相当高的效率一起工作。如:以模块的形式被载入Apache,以ISAPI形式被载入IISPWS,以NSAPI的形式被载入Netscape Enterprise Server

      l         由于Java的跨平台特性,基于JavaTomcat也具有跨平台性。

       

       

      2Tomcat5.0包含三个主要的部分

       

      包括:
      * Catalina -
      一个符合Servlet API规范2.3Servlet Container
      * Jasper -
      一个符合JSP规范1.2JSP编译器和运行环境
      * Webapps - Tomcat
      中包含的一些例子和用于测试的web例程,以及相关文档。

       

       

      3应用服务器(如WebLogic)与Tomcat有何区别。

       

             应用服务器提供更多的J2EE特征,如EJBJMSJAAS等,同时也支持JspServlet。而Tomcat则功能没有那么强大,它不提供EJB等支持。但如果与JBoss(一个开源的应用服务器)集成到一块,则可以实现J2EE的全部功能。

       

       

      4Tomcat 目录的结构

       

      1Tomcat的安装

       

          其实对于完全由Java写成的TomcatWin32版本和Linux版本没有多大区别,比如Linux版本,在Solaris下也没有问题。这里,主要以Win32版本作为示例。

      注意:在安装使用Tomcat之前,先安装JDK,最好是SunJDK 1 .2 以上版。

       

      2Tomcat的目录结构

       

      首先,下载jakarta-tomcat.zip包,解压缩到一个目录下,如:“c:\tomcat”。这时,会得到如下的Tomcat的目录结构:

      - - - jakarta - tomcat

      | - - - bin             Tomcat执行脚本目录

      | - - - Common          放置一些通用类(如JDBC的驱动程序等)

      | - - - conf               Tomcat配置文件

      | - - - doc                 Tomcat文档

      | - - - lib                 Tomcat运行需要的库文件(JARS

      | - - - logs               Tomcat执行时的LOG文件

      | - - - src            Tomcat的源代码

      | - - - webapps             Tomcat的主要Web发布目录(存放我们自己的JSP,SERVLET,类)

      | - - - work            Tomcat的工作目录,Tomcat将翻译JSP文件到的Java文件和class文件放在这里。

      目 录 名

      该目录内的文件的一般功能描述

      bin

      包含有Startup.bat(启动服务器)与shutdown.bat(关闭服务器)文件

      conf

      包含设置部署在Tomcat上的Web应用的变量的初始值的设置文件,包括 server.xml (Tomcat 全局配置文件) web.xml (为不同的Tomcat配置的web应用设置缺省值的文件)

      doc

      包含关于Tomcat的各种各样的文档。

      common

      在其lib目录下,主要存放如JDBC的驱动程序等

      lib

      包含被Tomcat使用的各种各样的jar文件。在UNIX上,任何这个目录中的文件将被附加到Tomcatclasspath中。

      logs

      Tomcatlog文件。

      src

      servlet API的源文件。

      webapps

      包含Web应用的程序 (JSPServletJavaBean等)

      work

      Tomcat自动生成,这是Tomcat放置它运行期间的中间(intermediate)文件(诸如编译的JSP文件)地方。 如果当Tomcat运行时,你删除了这个目录那么将不能够执行包含JSP的页面。

       

      3)、各个目录下所应该存放的文件:按照Tomcat的规范,TomcatWeb应用程序应该由如下目录组成

      n         页面内容等文件的存放位置*.html, *.jsp等可以有许多目录层次,由用户的网站结构而定,实现的功能应该是网站的界面,也就是用户主要的可见部分。除了HTML文件、JSP文件外,还有jsJavaScript)文件和css(样式表)文件以及其他多媒体文件等。

       

      n         Web-INF/web.xml这是一个Web应用程序的描述文件。这个文件是一个XML文件,描述了Servlet和这个Web应用程序的其他组件信息,此外还包括一些初始化信息和安全约束等等。

       

      n         Web-INF/classes/这个目录及其下的子目录应该包括这个Web应用程序的所有JavaBeanServlet等编译好的Java类文件(*.class)文件,以及没有被压缩打入JAR包的其他class文件和相关资源。注意,在这个目录下的Java类应该按照其所属的包层次组织目录(即如果该*.class文件具有包的定义,则该*.class文件应该放在.\WEB-INF\classes\包名下)。

       

       

       

       

      n         通常Web-INF/classes/这个目录下的类文件也可以打包成JAR文件,并可以放到WEB-INF下的lib目录下。如将 classes目录下的各个*.class文件打包成WebMis.jar文件(jar cvf WebMis.jar *.*

       

      注意:

      1WEB-INF目录中包含应用软件所使用的资源,但是WEB-INF却不在公共文档根目录之中。在这个目录中所包含的文件都不能被客户机所访问。

      2)类目录中(在WEB-INF下)包含运行Web应用程序时所需的ServletsBeans等类。

      3lib目录(在WEB-INF下)包含有Java archive files (JARs),例如标签库或者ServletsBeans等类的*.jar文件。

      4)如果一个类出现在JAR文件中同时也出现在类的目录中,类加载器会加载位于类目录中的那一个。

       

      n         common/lib/ 这个目录下包含了所有压缩到JAR文件中的类文件和相关文件。比如:第三方提供的Java库文件、JDBC驱动程序等。

      ü         其中msbase.jarmssqlserver.jarmsutil.jar文件为SqlServer2000JDBC驱动程序

      ü         其中servlet-api.jarjsp-api.jarServletJSPAPI所在的包

      二、Tomcat的环境配置

       

       

      1、启动Tomcat

       

      Bin目录下,有一个名为startup.bat的脚本文件,执行这个脚本文件,就可以启动Tomcat服务器,不过,在启动服务器之前,还需要进行一些设置。

      l         首先,设置系统的环境变量。

      ü         TOMCAT_HOME(或者:CATALINA_HOME)值:

      d:\jakarta-tomcat-5.0.16 (TOMCAT_HOME指示Tomcat根目录,下面以Tomcat 5.0.16版为例)

      ü         JAVA_HOME值:

      c:\j2sdk1.4.0(JAVA_HOME指示jdk1.4的安装目录)

      注意:对于设置Windows的系统环境变量,可以打开控制面板中的“系统”程序;在“系统环境变量”中增加两个环境变量项目JAVA_HOME(最好为大写)指向JDK的目录TOMCAT_HOME(最好为大写)指向所安装的tomcat的目录

       

       

       

      2、启动和关闭Tomcat服务器

       

      1启动Tomcat服务器:执行在Bin目录下的名为startup.bat的脚本文件可以启动Tomcat服务器

       

      现在可以运行TOMCAT并作为一个独立的Servlet容器。

       

       

      2)测试Tomcat的服务器启动与否:

      可以在浏览器中输入http://127.0.0.1:8080/index.jsp,是否出现如下内容。

       

       

      3启动本站点的JSP页面:Tomcat中的JSP文件和JavaBean程序的存放位置

      ü         JSP文件放在“Webapps\站点名称”的目录下

      ü         自定义的JavaBean程序*.java文件(可以不需要它)及*.class类文件存放在“Webapps\站点名称\ WEB-INF\classes\”目录下

      因此,将*.jsp文件拷贝到“TOMCAT_HOME\Webapps\站点名称”目录下,然后输入其URL地址

       

      4)关闭Tomcat服务器:执行在Bin目录下的名为shutdown.bat的脚本文件可以终止Tomcat服务器。

       

       

      三、配置Tomcat服务器

       

      1、概述

         

      Tomcat为用户提供了一系列的配置文件来帮助用户配置自己的TomcatTomcat的配置文件主要是基于XML的;如server.xmlweb.xml等,下面将详细讨论Tomcat的主要配置文件以及如何利用这些配置文件解决常见问题。

       

      2server.xml 主配置文件

       

      server.xmlTomcat的主配置文件,主要完成如下两个目标:

      ü         提供Tomcat组件的初始配置;

      ü         说明Tomcat的结构,含义,使得Tomcat通过实例化组件完成起动及构建自身。

      观察server.xml,可以发现其中有如下的一些元素。

       

      1Server元素:

       

      Server元素是server.xml文件的最高级别的元素, Server元素描述一个Tomcat服务器,一般来说用户不用关心这个元素。一个Server元素一般会包括LoggerContextManager两个元素

      ü         LoggerLogger元素定义了一个日志对象,一个日志对象包含有如下属性:

      1) name:表示这个日志对象的名称。

      2) path:表示这个日志对象包含的日志内容要输出到哪一个日志文件。

      3) verbosityLevel:表示这个日志文件记录的日志的级别。

      一般来说,Logger对象是对Java ServletJSPTomcat运行期事件的记录

      ü         ContextManagerContextManager定义了一组ContextInterceptorsContextManager的事件监听器) , RequestInterceptors(的事件监听器)、ContextsWeb应用程序的上下文目录)和它们的Connectors(连接器)的结构和配置。ContextManager包含如下一些属性:

      1) debug:记录日志记录调试信息的等级。

      2) homewebapps /conf /logs /和所有Context的根目录信息。这个属性的作用是从一个不同于TOMCAT _ HOME的目录启动Tomcat

      3) workDirTomcat工作目录。

      ContextInterceptor RequestInterceptors两者都是监听ContextManager的特定事件的拦截器。ContextInterceptor监听Tomcat的启动和结束事件信息。而RequestInterceptors监听用户对服务器发出的请求信息。一般用户无需关心这些拦截器,对于开发人员需要了解这就是全局性的操作得以实现的方法

       

      2Connector元素:

       

      Connector(连接器)元素描述了一个到用户的连接,不管是直接由Tomcat到用户的浏览器还是通过一个Web服务器。Tomcat的工作进程和由不同的用户建立的连接传来的读/写信息和请求/答复信息都是由连接器对象管理的。对连接器对象的配置中应当包含管理类、TCP/IP端口等内容。

       

      3Context元素:

       

      每一个Context都描述了一个TomcatWeb应用程序的目录。这个对象包含以下属性:

      1)docBase。这是Context的目录。可以是绝对目录也可以是基于ContextManage的根目录的相对目录。

      2)path。这是ContextWeb服务时的虚拟目录位置和目录名。

      3)debug。日志记录的调试信息记录等级。

      4)reloadable。这是为了方便Servlet的开发人员而设置的,当这个属性开关打开的时候,Tomcat将检查Servlet是否被更新而决定是否自动重新载入它

       

      3配置实例打开Tomcat下的conf文件夹下的server.xml文件

       

      1)改变Tomcat服务器的端口号

      需要使用Connector 元素,Connector表示一个到用户的联接,不管是通过web服务器或直接到用户浏览器(在一个独立配置中)Connector负责管理Tomcat的工作线程和读/写连接到不同用户的端口的请求/响应。Connector的配置包含如下信息:句柄类、句柄监听的TCP/IP端口、句柄服务器端口的TCP/IPbacklog修改后,必须重新启动Tomcat的服务器。

       

       

      注意:可以将端口号改变为80,单要保证80端口没有被占用;另外,也可以同时分配两个端口号,只要产生两个Connector的配置信息。

          <!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 -->

         <Connector port="8080"    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

           enableLookups="false" redirectPort="8443" acceptCount="100"  debug="0" connectionTimeout="20000"  disableUploadTimeout="true" />

                    

          <!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8000 -->

          <Connector port="8000"    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"

      enableLookups="false" redirectPort="8443" acceptCount="100"  debug="0" connectionTimeout="20000"  disableUploadTimeout="true" />

       

      2)增加新的虚拟目录并指向物理目录

       

      设立一个虚拟工作目录是比较简单的,只需要server.xml文件中添加一个Context对象就可以了。如,要在webapps\下增加一个WebMis文件夹以存放jsp页面文件,并且让用户可以使用http://127.0.0.1:8080/WebMis虚拟目录访问,则:需要使用Context 元素,每个Context提供一个指向你放置你Web项目的Tomcat的下属目录。每个Context包含如下配置:  

      l         Context放置的路径,可以是与ContextManager主目录相关的路径;

      l         纪录调试信息的调试级别;

      l         可重载的标志,开发Servlet时,重载更改后的Servlet。这是一个非常便利的特性,你可以调试或用Tomcat测试新代码而不用停止或重新启动Tomcat。要打开重载,reloadable设为true即可。

       

      其中:path="/WebMis"说明其相对web URL的路径,是一个虚拟的路径,如:http://127.0.0.1:8080/WebMisdocBase="WebMis"说明其相对webapps的位置,是物理存在的目录,同时需要在webapps\下增加一个WebMis物理文件夹。

       

       

       

       

      (3)       加入自己的日志文件

       

      添加Logger对象就可以加入自己的日志文件,添加工作相当简单,只需要将作为示例的Logger对象复制一份,然后修改一下前面介绍的几个属性就可以了。在设定了Logger以后,就可以在自己的Servlet中使用ServletContext.log()方法来建立自己的日志文件。

       

      4配置实例打开conf文件夹下的web.xml文件

       

       

      1web.xml文件:它包含了描述整个Web应用程序(Web应用程序由一整套Web文件jspservlethtmljpggifclass等组成)的信息。下面以一个web.xml文件为例,讲解里面的各个对象。

       

      <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"

      "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">

      <web-app>

      <display-name>My Web Application</display-name>

      <description>在这里加入Web应用程序的描述信息</description>

      <!-

      下面定义了Web应用程序的初始化参数,在JSPServlet文件中使用下面的语句

      来得到初始化参数

      String value =

      getServletContext().getInitParameter("name");

      这里可以定义任意多的初始化参数

      -->

      <context-param>

      <param-name>webmaster</param-name>

      <param-value>myaddress@mycompany.com</param-value>

      <description>这里包含了初始化参数的描述</description>

      </context-param>

      <!-

      下面的定义描述了组成这个Web应用程序的Servlet,还包含初始化参数。在Tomcat中,也可以将放在Web-INF/classes中的Servlet直接以servlet/Servlet名访问,但是一般来说,不推荐这样使用。而且这样的使用方法还会导致Servlet的相关资源组织的复杂性。所以一般来说推荐将所有的Servlet在这里定义出来。初始化参数可以在Servlet中使用如下语句来获得:

      String value =getServletConfig().getInitParameter("name");

      -->

      <servlet>

      <servlet-name>controller</servlet-name>

      <description>这里加入这个Servlet的描述</description>

      <servlet-class>com.mycompany.mypackage.ControllerServlet</servlet-class>

      <init-param>

      <param-name>listOrders</paramName>

      <param-value>com.mycompany.myactions.ListOrdersAction</param-value>

      </init-param>

      <init-param>

      <param-name>saveCustomer</paramName>

      <param-value>com.mycompany.myactions.SaveCustomerAction</param-value>

      </init-param>

      <!-

      服务器启动后这个Servlet加载的时间

      -->

      <load-on-startup>5</load-on-startup>

      </servlet>

      <servlet>

      <servlet-name>graph</servlet-name>

      <description>这个Servlet的描述</description>

      </servlet>

      <!-

      Servlet映射对应了一个特殊的URI请求到一个特殊的Servlet的关系

      -->

      <servlet-mapping>

      <servlet-name>controller</servlet-name>

      <url-pattern>*.do</url-pattern>

      </servlet-mapping>

      <servlet-mapping>

      <servlet-name>graph</servlet-name>

      <url-pattern>/graph</url-pattern>

      </servlet-mapping>

      <!-

      设定缺省的Session过期时间(单位为分)

      -->

      <session-config>

      <session-timeout>30</session-timeout>

      </session-config>

      </web-app>

      2)配置实例:会话(session)超时修改,修改conf\web.xml中的如下数据值(单位为分)

       

      5、在Tomcat中实现利用JDBC驱动程序访问SQLServer2000数据库

       

      只需要将SQLServer2000JDBC驱动程序的三个*.jarmsbase.jarmssqlserver.jarmsutil.jar)文件放在\common\lib目录下,然后在*.java程序中访问它。

       

      四、在Tomcat5中配置连接池和数据源

       

      1DataSource接口介绍

       

      1DataSource 概述

      JDBC1.0原来是用DriverManager类来产生一个对数据源的连接。JDBC2.0用一种替代的方法,使用DataSource的实现,代码变的更小巧精致,也更容易控制。

      一个DataSource对象代表了一个真正的数据源。根据DataSource的实现方法,数据源既可以是从关系数据库,也电子表格,还可以是一个表格形式的文件。当一个DataSource对象注册到名字服务中(JNDI),应用程序就可以通过名字服务获得DataSource对象,并用它来产生一个与DataSource代表的数据源之间的连接。

      javax.sql包中的DataSource接口,可以采用三种实现形式:简单的实现(只提供Connection对象)、连接池形式的实现和分布式事务形式的实现。

      javax.sql包中的ConnectionPoolDataSource提供对连接池实现的接口。

      2)使用DataSource的优点

      l         DataSourceDriverManager的不同

      关于数据源的信息和如何来定位数据源,例如数据库服务器的名字,在哪台机器上,端口号等等,都包含在DataSource对象的属性里面去了。这样,对应用程序的设计来说是更方便了,因为并不需要硬性的把驱动的名字写死到程序里面去。通常驱动名字中都包含了驱动提供商的名字,而在DriverManager类中通常是这么做的。

      l         可移植性

      如果数据源要移植到另一个数据库驱动中,代码也很容易做修改。所需要做的修改只是更改DataSource的相关的属性。而使用DataSource对象的代码不需要做任何改动。

      3)配置DataSource

      主要包括设定DataSource的属性,然后将它注册到JNDI名字服务中去。在注册DataSource对象的的过程中,系统管理员需要把DataSource对象和一个逻辑名字关联起来。名字可以是任意的,通常取成能代表数据源并且容易记住的名字。

      在下面的例子中,名字起为:WebMisDB,按照惯例,逻辑名字通常都在jdbc的子上下文中。这样,逻辑名字的全名就是:jdbc/WebMisDB

      4)产生一个与数据源的连接

      一旦配置好了数据源对象,应用程序设计者就可以用它来产生一个与数据源的连接。下面的代码片段示例了如何用JNDI上下文获得一个数据源对象,然后如何用数据源对象产生一个与数据源的连接。开始的两行用的是JNDI API,第三行用的才是JDBCAPI
        Context ctx = new InitialContext(); 

      DataSource ds = (DataSource)ctx.lookup("jdbc/WebMisDB");

      Connection con = ds.getConnection("myPassword", "myUserName");
        在一个基本的DataSource实现中,DataSource.getConnection方法返回的Connection对象和用DriverManager.getConnection方法返回的Connection对象是一样的。因为DataSource提供的方便性,我们推荐使用DataSource对象来得到一个Connection对象。

      5DataSource的应用场合

      对于普通的应用程序设计者,是否使用DataSource对象只是一个选择问题。但是,对于那些需要用的连接池或者分布式的事务的应用程序设计者来说,就必须使用DataSource对象来获得Connection。需要注意的是对Tomcat而言,在JNDI的名称前面应该加上"java:comp/env/" 

      6数据源(DataSource)的作用

      它相当于客户端程序和连接池的中介,想要获得连接池中的连接对象,必须建立一个与该连接池相应的数据源,然后通过该数据源获得连接。

      2JNDIJAVA NAMING AND DIRECTORY INTERFACE---Java 命名和目录接口

      1JNDI简介

      分布式计算环境通常使用命名和目录服务来获取共享的组件和资源。命名和目录服务将名称与位置、服务、信息和资源关联起来。它是一个为JAVA应用程序提供命名服务的应用程序编程接口(API)。

      命名服务提供了一种为对象命名的机制,这样你就可以在无需知道对象位置的情况下获取和使用对象。只要该对象在命名服务器上注册过,且你必须知道命名服务器的地址和该对象在命名服务器上注册的JNDI名。就可以找到该对象,获得其引用,从而运用它提供的服务。

      命名服务提供名称—对象的映射。目录服务提供有关对象的信息,并提供定位这些对象所需的搜索工具。

      Java 命名和目录接口或 JNDI 提供了一个用于访问不同的命名和目录服务的公共接口(JAVA API)。运用一个命名服务来查找与一个特定名字相关的一个对象,JDBC可以用JNDI来访问一个关系数据库。

      2)获得JNDI的初始环境

      JNDI中,在目录结构中的每一个结点称为Context 。每一个JNDI名字都是相对于Context 的。这里没有绝对名字的概念存在。对一个应用来说,它可以通过使用InitialContext 类来得到其第一个Context

      Context  ctx = new InitialContext ();

      应用可以通过这个初始化的Context经由这个目录树来定位它所需要的资源或对象。InitialContext在网页应用程序初始化时被设置,用来支持网页应用程序组件。所有的入口和资源都放在JNDI命名空间里的java:comp/env段里。

      3)查找已绑定的对象

      ctx..lookup(String name); 根据name找对象

      例:

      import javax.naming.*;

      public class TestJNDI

      {    

      public static void main(String[] args)

      {

              try

      {

              Context ctx=new InitialContext();

              Object object=ctx.lookup(JNDIName);       //根据JNDI名查找绑定的对象

              String str=(String) object;                                 //强制转换

              }

      catch(NamingException e)

      {    e.printStackTrace();

              }

      catch(ClassCastException e)

      {    e.printStackTrace();

              }

         }

      }

       

      3数据库连接池技术

       

      1传统的Web数据库编程模式

       

      l         在主程序(如ServletBeans)中建立数据库连接。

      l         进行SQL操作,取出数据。

      l         断开数据库连接。

      使用这种模式开发,存在很多问题。

      l         首先,我们要为每一次WEB请求(例如察看某一篇文章的内容)建立一次数据库连接,对于一次或几次操作来讲,或许你觉察不到系统的开销,但是,对于WEB程序来讲,即使在某一较短的时间段内,其操作请求数也远远不是一两次,而是数十上百次(想想全世界的网友都有可能在您的网页上查找资料),在这种情况下,系统开销是相当大的。事实上,在一个基于数据库的WEB系统中,建立数据库连接的操作将是系统中代价最大的操作之一。很多时候,可能您的网站速度瓶颈就在于此。

      l         其次,使用传统的模式,你必须去管理每一个连接,确保他们能被正确关闭,如果出现程序异常而导致某些连接未能关闭,将导致数据库系统中的内存泄露,最终我们将不得不重启数据库。

      l         频繁的建立、关闭连接,会极大的减低系统的性能,因为对于连接的使用成了系统性能的瓶颈。

       

      2)数据库连接是一种关键的有限的昂贵的资源

       

      这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。

      连接池是这么一种机制,当应用程序关闭一个Connection的时候,这个连接被回收,而不是被destroy,因为建立一个连接是一个很费资源的操作。如果能把回收的连接重新利用,会减少新创建连接的数目,显著的提高运行的性能。该策略的核心思想是:连接复用。

      通过采用连接池的方法,服务器在启动时先打开一定数量的连接。当应用需要连接时,就可以从服务器请求一个连接。当应用结束该连接时,服务器就把它释放到连接池,以备其他客户机使用。

      客户获得连接并访问数据库以后结束

      客户获得连接并访问数据库以后结束

      客户获得连接并访问数据库以后结束

      开始

      停止服务吗

      产生新的连接

      等待引入的连接

      结束

      服务器监听客户的连接请求                    客户获得连接

       

      3)连接池的主要作用

      l         减少了建立和释放数据库连接的消耗

      l         数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;

      l         释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。

      l         封装用户信息  使用连接池可以封装连接数据库系统所用的用户信息(帐号和密码),这样客户端程序在建立连接时不用考虑安全信息。

      4)数据库连接池的工作原理

             当程序中需要建立数据库连接时,只须从内存中取一个来用而不用新建。同样,使用完毕后,只需放回内存即可。而连接的建立、断开都有连接池自身来管理。同时,我们还可以通过设置连接池的参数来控制连接池中的连接数、每个连接的最大使用次数等等

       

       

       

      5数据库连接池的最小连接数和最大连接数

      数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:

      l         最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;

      l         最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。

      如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

      6使用连接池得到连接
        假设应用程序需要建立到一个名字为EmpolyeeDBDataSource的连接。使用连接池得到连接的代码如下:
        Context ctx = new InitialContext(); 

      DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB");

      Connection con = ds.getConnection("myPassword", "myUserName");

      或者

        Context ctx = new InitialContext(); 

      ConnectionPoolDataSource ds = (ConnectionPoolDataSource)ctx.lookup("jdbc/EmployeeDB");

      PooledConnection con = ds.getConnection("myPassword", "myUserName");

      是否使用连接池获得一个连接,在应用程序的代码上是看不出不同的。在使用这个Connection连接上也没有什么不一样的地方,唯一的不同是在javafinally语句块中来关闭一个连接。在finally中关闭连接是一个好的编程习惯。这样,即使方法抛出异常,Connection也会被关闭并回收到连接池中去。代码应该如下所示:
        try

      {…
        }

      catch()

      {…
        }

      finally

      ifcon!=null

      con.close();

      }

       

      4、在Tomcat中配置数据库的连接池

       

      1)连接池配置(Database Connection Pool (DBCP) Configurations)

      DBCP使用的是Jakarta-Commons Database Connection Pool 要使用连接池需要如下的组件即jar文件。

      l         Jakarta-Commons DBCP 1.1 对应commons-dbcp-1.1.jar

      l         Jakarta-Commons Collections 2.0 对应commons-collections.jar

      l         Jakarta-Commons Pool 1.1 对应commons-pool-1.1.jar

      这三个jar文件要与你的JDBC驱动程序一起放到【TOMCAT_HOME\common\lib目录下以便让tomcat和你的web应用都能够找到。

      注:

      l         这三个jar文件是默认存在与【TOMCAT_HOME\common\lib下的。

      l         需要注意的地方:第三方的驱动程序或者其他类只能以*.jar的形式放到Tomcatcommon\lib目录中,因为Tomcat只把*.jar文件加到CLASSPATH中。

      l         不要把上诉三个文件放到WEB-INF/lib或者其他地方因为这样会引起混淆。

       

      2)通过配置阻止连接池漏洞

      数据库连接池创建和管理连接池中建立好的数据库连接,循环使用这些连接以得到更好的效率。这样比始终为一个用户保持一个连接和为用户的请求频繁的建立和销毁数据库连接要高效的多。

      这样就有一个问题出现了,一个Web应用程序必须显示的释放ResultSetStatementConnection。如果在关闭这些资源的过程中失败将导致这些资源永远不在可用,这就是所谓的连接池漏洞。这个漏洞最终会导致连接池中所有的连接不可用。

      通过配置Jakarta Common DBCP可以跟踪和恢复那些被遗弃的数据库连接。

      以下是一系列相关配置:

      l         通过配置DBCP数据源中的参数removeAbandoned来保证删除被遗弃的连接使其可以被重新利用。

      ResourceParams(见下文的数据源配置)标签添加参数removeAbandoned

      <parameter>

      <name>removeAbandoned</name>

      <value>true</value>

      </parameter>

      通过这样配置的以后当连接池中的有效连接接近用完时DBCP将试图恢复和重用被遗弃的连接。这个参数的值默认是false

      l         通过设置removeAbandonedTimeout来设置被遗弃的连接的超时的时间,即当一个连接连接被遗弃的时间超过设置的时间时那么它会自动转换成可利用的连接。

          <parameter>

           <name>removeAbandonedTimeout</name>

           <value>60</value>

           </parameter>

          默认的超时时间是300秒。

      l         设置logAbandoned参数,以将被遗弃的数据库连接的回收记入日志中

      <parameter>

      <name>logAbandoned</name>

      <value>true</value>

      </parameter>

      这个参数默认为false

      3修改server.xml文件

             <Context path="/WebMis" docBase="WebMis" debug="0" reloadable="true">

                          

                         <Resource name="jdbc/webmis" auth="Container" type="javax.sql.DataSource"/>  

                         <ResourceParams name="jdbc/webmis">      

                                       <parameter>             

                                               <name>

                                                      factory

                                               </name>        

                                               <value>org.apache.commons.dbcp.BasicDataSourceFactory

                                               </value>        

                                    </parameter>

                                    <parameter>             

                                             <name>

                                                    driverClassName

                                             </name>        

                                               <value>com.microsoft.jdbc.sqlserver.SQLServerDriver

                                               </value>        

                                        </parameter>

                                       <parameter>      

                                               <name>

                                                      url

                                               </name>        

                                     <value>jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=DataBase

                                    </value>

                                       </parameter>            

                                       <parameter>

                                                  <name>

                                                         username

                                                   </name>             

                                               <value>

                                                    sa

                                               </value>

                                      </parameter>            

                                       <parameter>

                                                  <name>

                                                         password

                                                  </name>

                                                  <value>

      maxActive 连接池的最大数据库连接数。设为0表示无限制。

                                                  </value> 

                                       </parameter>            

                                       <parameter>

       

                                                  <name>

                                                         maxActive

                                                  </name>

                                                  <value>

                                                         20

      回收被遗弃的(一般是忘了释放的)数据库连接到连接池中,设为-1表示无限制。

      maxIdle  数据库连接的最大空闲时间。超过此空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。

                                                  </value>

                                       </parameter>

                                       <parameter>             

                                              <name>

                                                       maxIdle

                                                </name>

      maxWait 最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。

                                              <value>10</value>

                                      </parameter>

                                      <parameter>

                                                  <name>maxWait</name>

                                                  <value>-1</value>

                                    </parameter> 

      <parameter>
        <name>removeAbandoned</name>
        <!-- Abandoned DB connections are removed and recycled -->
        <value>true</value>
       </parameter>
       <parameter>
        <name>removeAbandonedTimeout</name>
        <!-- Use the removeAbandonedTimeout parameter to set the number of seconds a DB connection has been idle before it is considered abandoned.  -->
        <value>60</value>
       </parameter>
       <parameter>
        <name>logAbandoned</name>
        <!-- Log a stack trace of the code which abandoned -->
        <value>false</value>
       </parameter>
          

      数据库连接过多长时间不用将被视为被遗弃而收回连接池中

      将被遗弃的数据库连接的回收记入日志

                         </ResourceParams>

                    </Context>

      注意:

      l         所有的入口和资源都放在JNDI命名空间里的java:comp/env段里

      l         设置JNDI资源要在$CATALINA_HOME/conf/server.xml文件里使用下列标志符:
      1) <Resource>--
      设置应用程序可用的资源的名字和类型(同上面说的<resource-ref>等价)。
      2) <ResourceParams>--
      设置Java资源类工厂的名称或将用的JavaBean属性。
      上述这些标志符必须放在<Context></Context>之间

       

      2)、拷贝SQLServerJDBC驱动程序到Tomcat\common\lib目录下

       

      3)、在程序中利用数据源来访问数据库

                    try

                    {

                           Context initCtx = new InitialContext();

                         Context envCtx = (Context) initCtx.lookup("java:comp/env");

                      DataSource ds = (DataSource)envCtx.lookup("jdbc/webmis");

                       Connection con=ds.getConnection();

                }

              catch (NamingException e)

                 {

                         e.printStackTrace();

                  }

                  catch (SQLException e)

                 {

                         e.printStackTrace();

                   }

       

      5、在server.xml文件中与数据源的描述相关的标签含义

      l         maxActive 连接池的最大数据库连接数。设为0表示无限制。

      l         maxIdle  数据库连接的最大空闲时间。超过此空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。

      l         maxWait 最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。

      l         removeAbandoned 回收被遗弃的(一般是忘了释放的)数据库连接到连接池中。

      l         removeAbandonedTimeout 数据库连接过多长时间不用将被视为被遗弃而收回连接池中。

      l         logAbandoned 将被遗弃的数据库连接的回收记入日志。

      l         driverClassName JDBC驱动程序。

      l         url   数据库DSN连接字符串


      6
      、在Web应用的web.xml文件中引用该资源

       

      将下面的标签放在放在<web-app></web-app>中间

      <!-- Database Config start -->

      <resource-ref>

      <description>connectDB test</description>

      <res-ref-name>jdbc/webmis</res-ref-name>

      <res-type>javax.sql.DataSource</res-type>

      <res-auth>Container</res-auth>

      </resource-ref>

      <!-- Database Config end -->

       

      4,综合配置实例

       

      首先在C:根目录下建立文件夹mywebapp,作为一个虚拟目录的位置。

       

      建立一个Sql Server数据库DataBonus

       

      找到C:\jakarta-tomcat-5.0.19\conf\server.xml,打开。

       

      加入:

       

       <Context path="/mywebapp" docBase="C:/mywebapp" debug="0" reloadable="true">

                          

             <Resource name="jdbc/mybonusds" auth="Container" type="javax.sql.DataSource"/>  

      <ResourceParams name="jdbc/mybonusds">     

                    <parameter>         

                       <name>factory</name>         

                       <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>        

                    </parameter>

                    <parameter>         

                       <name>driverClassName</name>         

                       <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>        

                    </parameter>

                    <parameter>  

                        <name>url</name>             

                        <value>

      jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=DataBonus

                         </value>

                     </parameter>             

                     <parameter>

                       <name>username</name>            

                       <value>sa</value>

                      </parameter>            

                      <parameter>

                         <name>password</name>

                         <value></value>  

                      </parameter>            

                      <parameter>

      <name>maxActive</name>

                          <value>20</value>

                      </parameter>

                      <parameter>             

                         <name>maxIdle</name>

                         <value>10</value>

                      </parameter>

                      <parameter>      

                         <name>maxWait</name>

                         <value>-1</value>

                      </parameter>     

      <parameter>

                   <name>removeAbandoned</name>

                   <!-- Abandoned DB connections are removed and recycled -->

                   <value>true</value>

                </parameter>

                <parameter>

                    <name>removeAbandonedTimeout</name>

        <!-- Use the removeAbandonedTimeout parameter to set the number of seconds a DB connection has been idle before it is considered abandoned.  -->

                    <value>60</value>

                 </parameter>

                 <parameter>

                    <name>logAbandoned</name>

                  <!-- Log a stack trace of the code which abandoned -->

                    <value>false</value>

                 </parameter>   

               </ResourceParams>

      </Context>

       

         做一个JSP页面index.jsp放到mywebapp下面,代码:

       

      <%--字符集设为"gb2312",使动态页面支持中文--%>

      <%@ page contentType="text/html; charset=GB2312"%>

       

      <!-- 这里使用一个字串变量 ("PAGETITLE") 保持题目和主标题的一致性。-->

      <html>

      <head>

      <title>

      <%= pagetitle %>

      </title>

      </head>

       

      <body bgcolor=#FFFFFF>

       

      <font face="Helvetica">