zoukankan      html  css  js  c++  java
  • JavaWeb基础—数据库连接池DBCP、C3P0

    一、基本概念

      数据库连接池负责分配、管理和释放数据库连接

      数据库连接池:(池用map来实现居多)
      用处:为了可重用(销毁创建麻烦,开销大)(招培训老师的例子)

    二、编写实现数据库连接池

      池参数:
        初识大小(招10个老师)
        最小空闲连接数(小于3个时招人)
        增量(一次创建的最小单位)(一次招5个)
        最大空闲连接数(老师数多于12时销毁)
        最大连接数(最大就招20人,超过也不招人了,等)
        最大等待时间(等的时间太长没人归还就抛异常)

      连接池也是通过四大参数以及相关jar包等

      连接池一般不自己实现(那要崩溃,又不稳定)
      使用commons-dbcp.jar(数据库连接池) 它依赖commons-pool.jar
      (之前的io包,beanutils(依赖logging.jar包)等)commons被称为第二API

      连接池必须实现javax.sql.DataSource接口(1.4开始的规范)通常使用无参的构造器
      第三方的包都已经被实现,池参数都有默认值
      但是!四大参数必须自己提供!

      一般地,有两大开源的数据源实现:dbcp c3p0

      步骤:
        获得连接池对象(BasicDataSource)
        设置四大参数
        设置池参数
        得到连接对象(close()方法是归还,不是销毁)

      1.dbcp的小Demo(了解)

    package com.commons.dbcptest;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import org.apache.commons.dbcp2.BasicDataSource;
    import org.junit.Test;
    
    /**
     * 用于测试commons的dbcp的类
     * @author jiangbei01
     *
     */
    public class Demo02 {
        @Test
        public void fun1() throws SQLException{
            /*
             * 得到连接池对象
             * 设置四大参数
             * 设置池参数
             * 得到连接对象
             */
            BasicDataSource dataSource = new BasicDataSource();
            dataSource.setDriverClassName("com.mysql.jdbc.Driver");
            dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
            dataSource.setUsername("root");
            dataSource.setPassword("root");
            //使用的为默认池参数
            Connection con = dataSource.getConnection();
            System.out.println(con.getClass().getName());
            //把连接归还给池
            con.close();
        }
    }

      2.c3p0 (大多开源项目的支持,JNDI的实现)

      C3P0:
        免费开源的数据库连接池,功能强大,性能优越,【推荐】
        连接需要两个jar包(不需要oracal那个jar包)
      ComboPooledDataSource为连接池对象,方法步骤与上大同小异!

      C3P0可以有一个配置文件,但配置文件必须满足要求。可以使用使用命名配置
      <named-config name="">
      必须叫c3p0-config.xml
      必须在src下

      具体的配置见下图

      

      配置文件模板
    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
    <default-config>
    <!--四大参数-->
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb</property>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="user">root</property>
    <property name="password">root</property>
    <!--池参数-->
    <property name="acquireIncrement">3</property>
    <property name="initialPoolSize">2</property>
    <property name="maxPoolSize">5</property>
    <property name="minPoolSize">2</property>
    </default-config>
    </c3p0-config>
      使用连接池,重写JdbcUtils(day18)

     这里做出一个简单的重写

      

    package cn.itcast.jdbcutils;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    public class JdbcUtils {
        //使用的是默认的配置信息,注意给出c3p0-config.xml配置文件
        private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
        
        public static Connection getConnection() throws SQLException{
            return dataSource.getConnection();
        }
        /**
         * 大方一点,给出连接池对象给你
         */
        public static ComboPooledDataSource getDataSource(){
            return dataSource;
        }
    }

    三、JNDI

      JNDI(Java Naming and Directory Interface),Java命名和目录接口,它对应于J2SE中的javax.naming包,
      这 套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需 通过名称检索即可。其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象

      

    JNDI(Java Naming and Directory Interface,Java命名和目录接口)
    Tomcat配置数据库连接池(JNDI的手段来得资源)在tomcat/conf/catalina/localhost下创建与项目同名的xml配置文件
    其它方法见百度

    (百度的博客里的另外的方法)

      1、在Web项目的WebRoot目录下的META-INF目录创建一个context.xml文件

       2、在context.xml文件配置tomcat服务器的数据源

    复制代码
     1 <Context>
     2    <Resource 
     3        name="jdbc/datasource" 
     4        auth="Container"
     5        type="javax.sql.DataSource" 
     6        username="root" 
     7        password="XDP"
     8        driverClassName="com.mysql.jdbc.Driver" 
     9        url="jdbc:mysql://localhost:3306/jdbcstudy"
    10        maxActive="8" 
    11        maxIdle="4"/>
    12 </Context>

      3、将数据库的驱动jar文件需放置在tomcat的lib下

      4、在获取数据库连接的工具类(如jdbcUtils)的静态代码块中获取JNDI容器中的数据源

      见孤傲苍狼大神的博客:http://www.cnblogs.com/xdp-gacl/p/4002804.html

    采用之前的方式

    ,小的配置文件示例:
    <Context>
    <Resource name="jdbc/dataSource" auth="Container"
    factory="org.apache.naming.factory.BeanFactory"
    type="com.mchange.v2.c3p0.ComboPooledDataSource"/>
    </Context>
    name:资源名称,注意命名规范
    auth:可不要
    factory:固定,不要去变
    type:类型,也就是c3p0包名
    其他的东西都是资源的参数

    获取资源的方法
    Context iniCtx = new InitialContext();
    Context envCtx = (Context)iniCtx.lookup("java:comp/env");//固定
    //二次查找
    //MyBean bean = (MyBean)envCtx.lookup("bean/MyBeanFactory");

    writer.println("foo = "+bean.getFoo()+",bar = "+bean.getBar());

    例如(注意在项目点lib下导包):

    package cn.itcast.servlet;
    
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.naming.NamingException;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.sql.DataSource;
    /**
     * 测试JNDI获取资源的Servlet,使用浏览器测试
     * @author jiangbei01
     *
     */
    public class AServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            try {
                //获取上下文对象
                Context iniCtx = new InitialContext();
                //找出入口
                Context envCtx = (Context)iniCtx.lookup("java:comp/env");
                //二次查找,找到资源,里面的就是资源名
                DataSource dataSource = (DataSource)envCtx.lookup("jdbc/dataSource");
                //于是就得到连接了,注意导包
                try {
                    Connection con = dataSource.getConnection();
                    System.out.println(con);
                    con.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
            } catch (NamingException e) {
                e.printStackTrace();
            }
        }
    
    }
  • 相关阅读:
    [状压dp][spfa] Jzoj P3737 挖宝藏
    [计算几何] Jzoj P3736 数学题
    [排序][vector] Jzoj P6288 旋转子段
    [区间dp] Jzoj P6287 扭动的树
    [bfs][spfa] Jzoj P6286 走格子
    [点分治] Luogu P2664 树上游戏
    [树链剖分][树状数组] Luogu P3676 小清新数据结构题
    [计算几何][dp] Luogu P1995 智能车比赛
    [后缀数组][并查集] Luogu P2178 品酒大会
    [莫比乌斯反演][整除分块] Bzoj P2301 Problem b
  • 原文地址:https://www.cnblogs.com/jiangbei/p/6701414.html
Copyright © 2011-2022 走看看