JNDI学习总结(二)——Tomcat下使用C3P0配置JNDI

系统 1786 0

一、C3P0下载

  C3P0下载地址: http://sourceforge.net/projects/c3p0/files/?source=navbar

  下载完成之后得到一个压缩包

二、使用C3P0配置JNDI数据源

  Tomcat6.x中配置JNDI数据源时默认使用的是Tomcat6.x自带的DBCP连接池,Tomcat6.x使用DBCP连接池配置JNDI数据源如下:

      
         1
      
      
        <
      
      
        Resource 


      
      
         2
      
      
        name
      
      
        ="oracleDataSource"
      
      
         3
      
      
            auth
      
      
        ="Container"
      
      
         4
      
      
            type
      
      
        ="javax.sql.DataSource"
      
      
         5
      
      
            maxActive
      
      
        ="50"
      
      
         6
      
      
            maxIdle
      
      
        ="10"
      
      
         7
      
      
            maxWait
      
      
        ="10000"
      
      
         8
      
      
            username
      
      
        ="lead_oams"
      
      
         9
      
      
            password
      
      
        ="p"
      
      
        10
      
      
            driverClassName
      
      
        ="oracle.jdbc.OracleDriver"
      
      
        11
      
      
            url
      
      
        ="jdbc:oracle:thin:@192.168.1.229:1521:lead"
      
      
        />
      
    

  如果想让Tomcat6.x使用C3P0连接池配置JNDI数据源,在配置时,以下配置项需要修改

  1、 type和factory的值发生变化

  2、username=>user

  3、url=>jdbcUrl

  4、driverClassName=>driverClass

  创建一个Web测试项目C3P0_JNDI_Config,解压 压缩包,找到c3p0-0.9.5-pre9\lib目录下的相关Jar包如下图所示:

  将C3P0的相关Jar包添加到项目中,在项目的META-INF目录下创建一个context.xml文件,目录结构如下图所示:

  在tomcat服务器的lib目录下添加Oracle、MySQL、SQLServer三种数据库的驱动jar包,如下图所示:

  1、在context.xml文件中加入如下配置信息

      
         1
      
      
        <
      
      
        Context
      
      
        >
      
      
         2
      
      
        <!--
      
      
         使用C3P0配置针对MySQL数据库的JNDI数据源 
      
      
        -->
      
      
         3
      
      
        <
      
      
        Resource 


      
      
         4
      
      
        name
      
      
        ="jdbc/MysqlDataSource"
      
      
         5
      
      
                auth
      
      
        ="Container"
      
      
         6
      
      
                factory
      
      
        ="org.apache.naming.factory.BeanFactory"
      
      
         7
      
      
                type
      
      
        ="com.mchange.v2.c3p0.ComboPooledDataSource"
      
      
         8
      
      
                driverClass
      
      
        ="com.mysql.jdbc.Driver"
      
      
         9
      
      
                idleConnectionTestPeriod
      
      
        ="60"
      
      
        10
      
      
                maxPoolSize
      
      
        ="50"
      
      
        11
      
      
                minPoolSize
      
      
        ="2"
      
      
        12
      
      
                acquireIncrement
      
      
        ="2"
      
      
        13
      
      
                user
      
      
        ="root"
      
      
        14
      
      
                password
      
      
        ="root"
      
      
        15
      
      
                jdbcUrl
      
      
        ="jdbc:mysql://192.168.1.144:3306/leadtest"
      
      
        />
      
      
        16
      
      
        17
      
      
        <!--
      
      
         使用C3P0配置针对Oracle数据库的JNDI数据源 
      
      
        -->
      
      
        18
      
      
        <
      
      
        Resource 


      
      
        19
      
      
        name
      
      
        ="jdbc/OracleDataSource"
      
      
        20
      
      
                auth
      
      
        ="Container"
      
      
        21
      
      
                factory
      
      
        ="org.apache.naming.factory.BeanFactory"
      
      
        22
      
      
                type
      
      
        ="com.mchange.v2.c3p0.ComboPooledDataSource"
      
      
        23
      
      
                driverClass
      
      
        ="oracle.jdbc.OracleDriver"
      
      
        24
      
      
                idleConnectionTestPeriod
      
      
        ="60"
      
      
        25
      
      
                maxPoolSize
      
      
        ="50"
      
      
        26
      
      
                minPoolSize
      
      
        ="2"
      
      
        27
      
      
                acquireIncrement
      
      
        ="2"
      
      
        28
      
      
                jdbcUrl
      
      
        ="jdbc:oracle:thin:@192.168.1.229:1521:lead"
      
      
        29
      
      
                user
      
      
        ="lead_oams"
      
      
        30
      
      
                password
      
      
        ="p"
      
      
        />
      
      
        31
      
      
        32
      
      
        33
      
      
        <!--
      
      
        使用C3P0配置针对SQLServer数据库的JNDI数据源
      
      
        -->
      
      
        34
      
      
        <
      
      
        Resource 


      
      
        35
      
      
        name
      
      
        ="jdbc/SqlServerDataSource"
      
      
        36
      
      
                auth
      
      
        ="Container"
      
      
        37
      
      
                factory
      
      
        ="org.apache.naming.factory.BeanFactory"
      
      
        38
      
      
                type
      
      
        ="com.mchange.v2.c3p0.ComboPooledDataSource"
      
      
        39
      
      
                driverClass
      
      
        ="com.microsoft.sqlserver.jdbc.SQLServerDriver"
      
      
        40
      
      
                idleConnectionTestPeriod
      
      
        ="60"
      
      
        41
      
      
                maxPoolSize
      
      
        ="50"
      
      
        42
      
      
                minPoolSize
      
      
        ="2"
      
      
        43
      
      
                acquireIncrement
      
      
        ="2"
      
      
        44
      
      
                jdbcUrl
      
      
        ="jdbc:sqlserver://192.168.1.51:1433;DatabaseName=demo"
      
      
        45
      
      
                user
      
      
        ="sa"
      
      
        46
      
      
                password
      
      
        ="p@ssw0rd"
      
      
        />
      
      
        47
      
      
        </
      
      
        Context
      
      
        >
      
    

  2.在web.xml引用JDNI数据源:

      
         1
      
      
        <?
      
      
        xml version="1.0" encoding="UTF-8"
      
      
        ?>
      
      
         2
      
      
        <
      
      
        web-app 
      
      
        version
      
      
        ="2.5"
      
      
         3
      
      
            xmlns
      
      
        ="http://java.sun.com/xml/ns/javaee"
      
      
         4
      
      
            xmlns:xsi
      
      
        ="http://www.w3.org/2001/XMLSchema-instance"
      
      
         5
      
      
            xsi:schemaLocation
      
      
        ="http://java.sun.com/xml/ns/javaee 


      
      
         6
      
      
            http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
      
      
        >
      
      
         7
      
      
        <
      
      
        welcome-file-list
      
      
        >
      
      
         8
      
      
        <
      
      
        welcome-file
      
      
        >
      
      index.jsp
      
        </
      
      
        welcome-file
      
      
        >
      
      
         9
      
      
        </
      
      
        welcome-file-list
      
      
        >
      
      
        10
      
      
        11
      
      
        <!--
      
      
        12
      
      
              JNDI配置的资源引用:


      
      
        13
      
      
          • res-ref-name:表示引用资源的名称


      
      
        14
      
      
          • res-type:此资源对应的类型为javax.sql.DataSource


      
      
        15
      
      
          • res-auth:容器授权管理


      
      
        16
      
      
        -->
      
      
        17
      
      
        <!--
      
      
        Oracle数据库JNDI数据源引用 
      
      
        -->
      
      
        18
      
      
        <
      
      
        resource-ref
      
      
        >
      
      
        19
      
      
        <
      
      
        description
      
      
        >
      
      Oracle DB Connection
      
        </
      
      
        description
      
      
        >
      
      
        20
      
      
        <
      
      
        res-ref-name
      
      
        >
      
      jdbc/OracleDataSource
      
        </
      
      
        res-ref-name
      
      
        >
      
      
        21
      
      
        <
      
      
        res-type
      
      
        >
      
      javax.sql.DataSource
      
        </
      
      
        res-type
      
      
        >
      
      
        22
      
      
        <
      
      
        res-auth
      
      
        >
      
      Container
      
        </
      
      
        res-auth
      
      
        >
      
      
        23
      
      
        </
      
      
        resource-ref
      
      
        >
      
      
        24
      
      
        25
      
      
        <!--
      
      
        MySQL数据库JNDI数据 
      
      
        -->
      
      
        26
      
      
        <
      
      
        resource-ref
      
      
        >
      
      
        27
      
      
        <
      
      
        description
      
      
        >
      
      MySQL DB Connection
      
        </
      
      
        description
      
      
        >
      
      
        28
      
      
        <
      
      
        res-ref-name
      
      
        >
      
      jdbc/MysqlDataSource
      
        </
      
      
        res-ref-name
      
      
        >
      
      
        29
      
      
        <
      
      
        res-type
      
      
        >
      
      javax.sql.DataSource
      
        </
      
      
        res-type
      
      
        >
      
      
        30
      
      
        <
      
      
        res-auth
      
      
        >
      
      Container
      
        </
      
      
        res-auth
      
      
        >
      
      
        31
      
      
        </
      
      
        resource-ref
      
      
        >
      
      
        32
      
      
        33
      
      
        <!--
      
      
        SQLServer数据库JNDI数据源引用 
      
      
        -->
      
      
        34
      
      
        <
      
      
        resource-ref
      
      
        >
      
      
        35
      
      
        <
      
      
        description
      
      
        >
      
      SQLServer DB Connection
      
        </
      
      
        description
      
      
        >
      
      
        36
      
      
        <
      
      
        res-ref-name
      
      
        >
      
      jdbc/SqlServerDataSource
      
        </
      
      
        res-ref-name
      
      
        >
      
      
        37
      
      
        <
      
      
        res-type
      
      
        >
      
      javax.sql.DataSource
      
        </
      
      
        res-type
      
      
        >
      
      
        38
      
      
        <
      
      
        res-auth
      
      
        >
      
      Container
      
        </
      
      
        res-auth
      
      
        >
      
      
        39
      
      
        </
      
      
        resource-ref
      
      
        >
      
      
        40
      
      
        41
      
      
        </
      
      
        web-app
      
      
        >
      
    

  3.部署C3P0_JNDI_Config Web应用到Tomcat服务器测试JNDI数据源

  部署到tomcat服务器的webapps目录之后,tomcat服务器就会自动在\conf\Catalina\localhost目录下生成一个C3P0_JNDI_Config.xml文件,如下图所示:

  C3P0_JNDI_Config.xml文件中的内容就是我们在META-INF目录的context.xml文件中配置的那些内容。

  jsp测试页面如下:

      
         1
      
      
        <%
      
      
        @ page language
      
      
        =
      
      
        "
      
      
        java
      
      
        "
      
      
         import
      
      
        =
      
      
        "
      
      
        java.util.*
      
      
        "
      
      
         pageEncoding
      
      
        =
      
      
        "
      
      
        UTF-8
      
      
        "
      
      
        %>
      
      
         2
      
      
        <%
      
      
        --
      
      
        引入JSTL标签库 
      
      
        --
      
      
        %>
      
      
         3
      
      
        <%
      
      
        @ taglib uri
      
      
        =
      
      
        "
      
      
        http://java.sun.com/jsp/jstl/core
      
      
        "
      
      
         prefix
      
      
        =
      
      
        "
      
      
        c
      
      
        "
      
      
        %>
      
      
         4
      
      
        <%
      
      
        @ taglib uri
      
      
        =
      
      
        "
      
      
        http://java.sun.com/jsp/jstl/sql
      
      
        "
      
      
         prefix
      
      
        =
      
      
        "
      
      
        sql
      
      
        "
      
      
        %>
      
      
         5
      
      
        <!
      
      
        DOCTYPE HTML
      
      
        >
      
      
         6
      
      
        <
      
      
        html
      
      
        >
      
      
         7
      
      
        <
      
      
        head
      
      
        >
      
      
         8
      
      
        <
      
      
        title
      
      
        >
      
      C3P0配置JNDI数据源连接测试
      
        </
      
      
        title
      
      
        >
      
      
         9
      
      
        </
      
      
        head
      
      
        >
      
      
        10
      
      
        11
      
      
        <
      
      
        body
      
      
        >
      
      
        12
      
      
        <
      
      
        h3
      
      
        >
      
      针对MySQL数据库JNDI数据源测试
      
        </
      
      
        h3
      
      
        >
      
      
        13
      
      
        <%
      
      
        --
      
      
        使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源
      
      
        --
      
      
        %>
      
      
        14
      
      
        <
      
      
        sql:query 
      
      
        var
      
      
        ="rs"
      
      
         dataSource
      
      
        ="jdbc/MysqlDataSource"
      
      
        >
      
      
        15
      
      
        <%
      
      
        --
      
      
        MySQL JNDI数据源测试 SQL
      
      
        --
      
      
        %>
      
      
        16
      
      
                     select * from ld_user


      
      
        17
      
      
        </
      
      
        sql:query
      
      
        >
      
      
        18
      
      
        <%
      
      
        --
      
      
        使用c:forEach标签遍历查询结果集rs中的每一行
      
      
        --
      
      
        %>
      
      
        19
      
      
        <
      
      
        c:forEach 
      
      
        var
      
      
        ="row"
      
      
         items
      
      
        ="${rs.rows}"
      
      
        >
      
      
        20
      
      
        <%
      
      
        --
      
      
        ${row.字段名}获取字段的值
      
      
        --
      
      
        %>
      
      
        21
      
                   ${row.id}---${row.username}---${row.password}
      
        <
      
      
        br
      
      
        />
      
      
        22
      
      
        </
      
      
        c:forEach
      
      
        >
      
      
        23
      
      
        <
      
      
        hr
      
      
        />
      
      
        24
      
      
        <
      
      
        h3
      
      
        >
      
      针对Oracle数据库JNDI数据源测试
      
        </
      
      
        h3
      
      
        >
      
      
        25
      
      
        <%
      
      
        --
      
      
        使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源
      
      
        --
      
      
        %>
      
      
        26
      
      
        <
      
      
        sql:query 
      
      
        var
      
      
        ="rs"
      
      
         dataSource
      
      
        ="jdbc/OracleDataSource"
      
      
        >
      
      
        27
      
      
        <%
      
      
        --
      
      
        Oracle JNDI数据源测试 SQL
      
      
        --
      
      
        %>
      
      
        28
      
      
                    SELECT * FROM LEAD_OAMS_DBSOURCES


      
      
        29
      
      
        </
      
      
        sql:query
      
      
        >
      
      
        30
      
      
        <%
      
      
        --
      
      
        使用c:forEach标签遍历查询结果集rs中的每一行
      
      
        --
      
      
        %>
      
      
        31
      
      
        <
      
      
        c:forEach 
      
      
        var
      
      
        ="row"
      
      
         items
      
      
        ="${rs.rows}"
      
      
        >
      
      
        32
      
      
        <%
      
      
        --
      
      
        ${row.字段名}获取字段的值
      
      
        --
      
      
        %>
      
      
        33
      
                   ${row.RESOURCEID}---${row.DBSOURCE_NAME}---${row.DBSOURCE_TYPE}
      
        <
      
      
        br
      
      
        />
      
      
        34
      
      
        </
      
      
        c:forEach
      
      
        >
      
      
        35
      
      
        <
      
      
        hr
      
      
        />
      
      
        36
      
      
        </
      
      
        body
      
      
        >
      
      
        37
      
      
        </
      
      
        html
      
      
        >
      
    

 C3P0 自动重连相关参数
     idleConnectionTestPeriod:C3P0会有一个Task检测pool内的连接是否正常,此参数就是Task运行的频率。默认值为0,表示不进行检测
    acquireRetryAttempts:pool请求取 新连接 失败后重试的次数
     C3P0目前存在问题:
     当数据库重启后,C3P0不会自动重新初始化数据库连接池,当新的请求需要访问数据库的时候,此时回报错误(因为数据库重启,连接失效),同时刷新数据库连接池,丢弃掉已经失效的连接,当第二个请求到来时恢复正常。
  C3P0目前没有提供当获取已建立连接失败后重试次数的参数,只有获取新连接失败后重试次数的参数(acquireRetryAttempts )。
要解决此问题,可以通过设置idleConnectionTestPeriod 参数折中解决,该参数的作用是设置系统自动检查连接池中连接是否正常的一个频率参数,时间单位是秒。

JNDI学习总结(二)——Tomcat下使用C3P0配置JNDI数据源


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论