zoukankan      html  css  js  c++  java
  • 配置数据库连接池,Tomcat6.0 连接池的配置

    Tomcat6.0 连接池的配置1.本人当前使用的Tomcat版本为:6.0.20,oracle为稳定的9i版本
    2.下文为方便起见,依习惯以%Tomcat_Home%表示Tomcat安装的目录,本人安装目录为“E:Program FilesWindowsXPtomcat6”
    配置步骤如下:
    1.Tomcat 6的配置和以前的不同了,不推荐在server.xml中进行配置,而是在%Tomcat_Home%webappsyourAppMETA-INF context.xml中进行配置才是更好的方法。而不是以前版本%Tomcat_Home%conf下的context.xml文件。这样就可以在不同的web应用下单独配置连接池了,且Tomcat会自动重载。当然你也可以更改%Tomcat_Home%conf下的context.xml文件,将所有web应用下的连接池进行统一配置。
    2.将代码修改如下:
    view plaincopy to clipboardprint?
    <Context reloadable="true">
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <Resource name="jdbc/oracleds" auth="Container" type="javax.sql.DataSource"
    maxActive="100"
    maxIdle="30"
    maxWait="10000"
    username="scott"
    password="tiger"
    driverClassName="oracle.jdbc.driver.OracleDriver"
    url="jdbc:oracle:thin:@localhost:1521:ora9"/>
    </Context>

    name 为当前数据源JNDI的名字,可以随意设定;
    auth 为验证方式;
    type 资源类型;
    driverClassName 为Oracle驱动引用;
    maxActiv 为连接池最大激活的连接数,设为0表示无限制;
    maxIdle 为连接池最大空闲的连接数,数据库连接的最大空闲时间。超过空闲时间,
    数据库连接将被标记为不可用,然后被释放。设为0表示无限制;
    maxWait 为连接最大的等待时间,单位毫秒,如果超过此时间将接到异常。设为-1
    表示无限制。;
    username 为oracle数据库的一个用户名;
    password 为username的密码;
    url 为连接oracle的连接地址;
    注:本人尝试将代码“driverClassName="oracle.jdbc.driver.OracleDriver"”改为“driverClassName="oracle.jdbc.OracleDriver"”程序依然运行正常,刚开始以为老师的代码有问题
    3.在程序中的调用形式为:
    view plaincopy to clipboardprint?
    Context context = new InitialContext();
    DataSource ds = (DataSource)context.lookup("java:/comp/env/jdbc/oracleds");
    Connection conn = ds.getConnection();
    Context context = new InitialContext();
    DataSource ds = (DataSource)context.lookup("java:/comp/env/jdbc/oracleds");
    Connection conn = ds.getConnection();
    注:“java:/comp/env/jdbc/oracleds”红色标记文字为步骤1里设置的Resource name
    则可以将建立connection的方式以上述形式取代传统方式:
    view plaincopy to clipboardprint?
    String driver = "oracle.jdbc.driver.OracleDriver";
    String url = "jdbc:oracle:thin:@localhost:1521:ora9";
    String username = "scott";
    String password = "tiger";
    Class.forName(driver);
    Connection conn = DriverManager.getConnection(url, username, password);
    String driver = "oracle.jdbc.driver.OracleDriver";
    String url = "jdbc:oracle:thin:@localhost:1521:ora9";
    String username = "scott";
    String password = "tiger";
    Class.forName(driver);
    Connection conn = DriverManager.getConnection(url, username, password);
    4.另外还需将用到的jdbc驱动类库导入到%Tomcat_Home%lib目录下
    否则会抛出如下异常:
    org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'oracle.jdbc.driver.OracleDriver'
    依上述步骤就能成功的配置Tomcat6.0 连接池,还有网友贴文说需
    在web.xml文件中的web-app节点下加入如下代码形式:
    <resource-ref>
    <res-ref-name>jdbc/myoracle</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    </resource-ref>
    因本人未添加此项,程序依然正确,故本人认为此步骤为非必要项
    ---------------------------------------------------------------------------
    今天需要在另一台机器上重新部署系统,重新设置db的连接池。当我把tomcat拷贝到那台机器,并且修改META-INFcontext.xml,然后重新启动tomcat,但发现系统连接的仍然是老的db。再次检查了META-INFcontext.xml文件,确信了这个文件已经正确设置db连接了,这也说明这个文件并没有真正起作用。查看了tomcat下confcontext.xml也没有设置db的连接池。那是哪个文件在起作用呢?折腾了办法,后来发现tomcat在confCatalinalocalhost下生成了一个和原来META-INFcontext.xml相同内容的文件,怀疑一定是这个文件在起作用?删除confCatalinalocalhost目录,重启tomcat,问题消失。
    转载一篇tomcat加载类的顺序:
    bin:存放启动和关闭tomcat的脚本文件;
    /conf:存放tomcat的各种配置文件,比如:server.xml
    /server/lib:存放tomcat服务器所需要的各种jar文件(jar文件只可被tomcat 服务器访问)
    /server/webapps:存放tomcat自带的两个web应用:admin应用和manager应用。
    /common/lib:存放tomcat服务器以及所有web应用都可以访问的jar文件夹(web和tomcat服务器都可访问此jar)
    /shared/lib:存放web都可访问的jar文件。(可以被所有的web访问,但不能被tomcat访问)
    /logs:存放tomcat的日志文件
    /webapps:当发布web应用时,默认情况下把web应用文件放于此目录下
    /work:tomcat把由jsp生成的Servlet放于此目录
    另:在web应用中,WEB-Inf目录下,也可以建立lib子目录,在此子目录下可以存放各种jar文件,这些jar文件只能被当前web应用访问。其中,在web-inf目录下的lib与classes目录,Tomcat类装载器先装载classes目录下的类,再装载lib目录下的类。因为类同名时,classes优先。
    其中jsp运行时,查找class的顺序为:项目文件夹(WEB-INFlib)===》容器文件夹(tomcatcommonlib)==》jdk文件夹(jdkjrelibext)
    Tomcat的class加载的优先顺序一览
    1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件。
    2.环境变量CLASSPATH中的jar和class文件。
    3.$CATALINA_HOME/common/classes下的class文件。
    4.$CATALINA_HOME/commons/endorsed下的jar文件。
    5.$CATALINA_HOME/commons/i18n下的jar文件。
    6.$CATALINA_HOME/common/lib 下的jar文件。
    (JDBC驱动之类的jar文件可以放在这里,这样就可以避免在server.xml配置好数据源却出现找不到JDBC Driver的情况。)
    7.$CATALINA_HOME/server/classes下的class文件。
    8.$CATALINA_HOME/server/lib/下的jar文件。
    9.$CATALINA_BASE/shared/classes 下的class文件。
    10.$CATALINA_BASE/shared/lib下的jar文件。
    11.各自具体的webapp /WEB-INF/classes下的class文件。
    12.各自具体的webapp /WEB-INF/lib下的jar文件。
    class的搜寻顺序如下
    -------------
    /WEB-INF/classes of your web application
    /WEB-INF/lib/*.jar of your web application
    $CATALINA_HOME/common/classes
    $CATALINA_HOME/common/endorsed/*.jar
    $CATALINA_HOME/common/i18n/*.jar
    $CATALINA_HOME/common/lib/*.jar
    $CATALINA_BASE/shared/classes
    $CATALINA_BASE/shared/lib/*.jar
    --------------
    因此放在不同webapp里的class文件,会被classloader加载成不同的实例。
    例如假设下面两个不同内容的class。分别放在不同的webapp的class目录下。
    package com.lizongbo;
    public class TestClass {
    private String NAME="lizongbo";
    }
    package com.lizongbo;
    public class TestClass {
    private String NAME="li_zongbo";
    }
    在不同的webapp得到的com.lizongbo.NAME结果是不同的,且互不影响。
    但是注意,以下包名开头的class例外:
    javax.*
    org.xml.sax.*
    org.w3c.dom.*
    org.apache.xerces.*
    org.apache.xalan.*
    ps,注意.在各个jar中的META-INFMAINFEST.MF文件里Class-Path键值对,也会提供jar的加载优先顺序。
    例如某jar的MAINFEST.MF内容如下:
    Manifest-Version: 1.0
    Created-By: lizongbo
    Class-Path: commons-beanutils.jar
    Class-Path: commons-collections.jar
    Class-Path: commons-dbcp.jar
    Class-Path: commons-digester.jar
    Class-Path: commons-logging.jar
    Class-Path: commons-pool.jar
    Class-Path: commons-services.jar
    Class-Path: commons-validator.jar
    Class-Path: jakarta-oro.jar
    Main-Class: com.lizongbo.MyTestClass
    那么在加载这个jar的时候,会先在此jar所在目录下依次先加载commons-beanutils.jar,commons-collections.jar。。。等jar文件。
    在不同的地方放置jar和class可能会产生意想不到的后果,源码天空,尤其是不同版本的jar文件,因此在实际应用部署web应用时候要特别留心.
    例如 使用javamail常见的一个出错信息:
    javax.mail.NoSuchProviderException: No provider for smtp
    其真实原因就很可能如下:
    在不同的加载jar的目录下放置了不同版本的mail.jar,比如一个是javamail1.3.1的mail.jar
    在D:jakarta-tomcat-5.5.8commonlib下,而另外一个是javamail1.3.2的mail.jar在
    D:jakarta-tomcat-5.5.8webappslizongboWEB-INF/lib下,
    那么lizongbo这个webapp中使用到javamail进行邮件发送的时候,便会出现No provider for smtp的错误。
    ——转自http://www.blogjava.net/gm_jing/articles/308828.html

  • 相关阅读:
    BZOJ3752 : Hack
    XIV Open Cup named after E.V. Pankratiev. GP of SPb
    XIII Open Cup named after E.V. Pankratiev. GP of Ukraine
    BZOJ2087 : [Poi2010]Sheep
    BZOJ2080 : [Poi2010]Railway
    BZOJ2082 : [Poi2010]Divine divisor
    Moscow Pre-Finals Workshop 2016. National Taiwan U Selection
    XIII Open Cup named after E.V. Pankratiev. GP of Asia and South Caucasus
    XIII Open Cup named after E.V. Pankratiev. GP of Azov Sea
    XIII Open Cup named after E.V. Pankratiev. GP of SPb
  • 原文地址:https://www.cnblogs.com/zhwl/p/3156940.html
Copyright © 2011-2022 走看看