zoukankan      html  css  js  c++  java
  • JDBC连接池&JDBCTemplate06_数据库连接池1

    1、概念

      其实就是一个容器(集合),存放数据库连接的容器。

      当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。

      

    2、数据库连接池好处

      1. 节约资源

      2. 用户访问高效

    3、实现数据库连接池

      1. 标准接口:DataSource javax.sql包下的。

       DataSource方法:

        a. 获取连接:Connection getConnection() 尝试与此 DataSource对象表示的数据源建立连接。

        b. 归还连接:void Connection.close() 立即释放此 Connection对象的数据库和JDBC资源,而不是等待它们自动释放。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接。

      2. 一般我们不去实现它,DataSource接口由驱动程序供应商,即数据库厂商实现。

        a. C3P0:数据库连接池技术

        b. Druid:数据库连接池实现技术,由阿里巴巴提供的。

    4、C3P0:数据库连接池技术

     a. 步骤:

      1. 导入jar包(两个):c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar(被前面jar包依赖)。不要忘记导入数据库驱动jar包,即mysql-connector-java-5.1.37-bin.jar

      2. 定义配置文件

      • 名称:c3p0.properties或者c3p0-config.xml
      • 路径:直接将文件放在src目录下即可。

      3. 创建核心对象 数据库连接池对象 ComboPooledDataSource

      4. 获取连接:getConnetion

     b. 代码:

      c3p0-config.xml

    <c3p0-config>
      <!-- 使用默认的配置读取连接池对象 -->
      <default-config>
          <!--  连接参数 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/db4</property>
        <property name="user">root</property>
        <property name="password">root</property>
        
        <!-- 连接池参数 -->
        <!-- 初始化申请的连接数量 -->
        <property name="initialPoolSize">5</property>
        <!-- 最大的连接数量 -->
        <property name="maxPoolSize">10</property>
        <!-- 超时时间(申请连接等待3秒,3秒后报超时) -->
        <property name="checkoutTimeout">3000</property>
      </default-config>
    
      <named-config name="otherc3p0"> 
        <!--  连接参数 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/db3</property>
        <property name="user">root</property>
        <property name="password">root</property>
        
        <!-- 连接池参数 -->
        <property name="initialPoolSize">5</property>
        <property name="maxPoolSize">8</property>
        <property name="checkoutTimeout">1000</property>
      </named-config>
    </c3p0-config>
    package cn.itcast.datasource.c3p0;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.SQLException;
    
    public class C3P0Demo1 {
        public static void main(String[] args) throws SQLException {
            //1. 创建数据库连接池对象,参数为空则使用默认配置
            DataSource ds = new ComboPooledDataSource();
            //2. 获取连接对象
            Connection conn = ds.getConnection();
    
            //3. 打印
            System.out.println(conn);
        }
    }

     执行结果:

     

      c. 配置演示:

    package cn.itcast.datasource.c3p0;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    import javax.sql.DataSource;
    import java.sql.Connection;
    import java.sql.SQLException;
    
    /**
     * C3P0演示
     */
    public class C3P0Demo2 {
    
        public static void main(String[] args) throws SQLException {
    
            //一般情况下使用默认配置
            new C3P0Demo2().testDefaultConfig();
            new C3P0Demo2().testNamedConfig();
        }
    
        public void testDefaultConfig() throws SQLException {
            //1. 获取DataSource,使用默认配置
            DataSource ds = new ComboPooledDataSource();
    
            //2. 获取连接
            for (int i = 1; i <= 11 ; i++) {
                Connection conn = ds.getConnection();
                System.out.println(i+":"+conn);
    
                if(i == 5){
                    conn.close();//归还连接到连接池中
                }
            }
        }
    
        public void testNamedConfig() throws SQLException {
            //1. 获取DataSource,使用指定名称配置
            DataSource ds = new ComboPooledDataSource("otherc3p0");
            //2. 获取连接
            for (int i = 1; i <= 10 ; i++) {
                Connection conn = ds.getConnection();
                System.out.println(i+":"+conn);
    
            }
    
        }
    }

     执行testDefaultConfig结果:

    执行testNamedConfig结果:
    
    

     5、Druid:数据库连接池实现技术,由阿里巴巴提供的

     a. 步骤:

      1. 导入jar包:druid-1.0.9.jar
      2. 定义配置文件:
      • 是properties形式的
      • 可以叫任意抿成,可以放在任意目录下

      3. 加载配置文件。Properties

      4. 获取数据库连接池对象:通过工厂来获取DruidDataSourceFactory

      5. 获取连接:getConnetion()

      代码

      druid.properties配置文件放在src目录下

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql:///db3
    username=root
    password=root
    #初始化连接数量
    initialSize=5
    #最大连接数
    maxActive=10
    #最大等待超时时间
    maxWait=3000
    package cn.itcast.datasource.druid;
    
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import javax.sql.DataSource;
    import java.io.InputStream;
    import java.sql.Connection;
    import java.util.Properties;
    
    /**
     * Druid演示
     */
    public class DruidDemo1 {
    
        public static void main(String[] args) throws Exception {
            //1. 导入jar包
            //2. 定义配置文件
    
            //3. 加载配置文件
            Properties pro = new Properties();
            InputStream resourceAsStream = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties");
            pro.load(resourceAsStream);
            //4. 获取连接池对象
            DataSource dataSource = DruidDataSourceFactory.createDataSource(pro);
    
            //5. 获取连接
            Connection conn = dataSource.getConnection();
            System.out.println(conn);
        }
    }

     执行结果:

     

      b. 定义工具类

      1. 定义一个类 JDBCUtils

      2. 提供静态代码块加载配置文件

      3. 提供方法

        1. 获取连接方法:通过数据库连接池获取连接

        2. 释放资源

        3. 获取连接池的方法

      代码:

    package cn.itcast.datasource.utils;
    
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    import javax.sql.DataSource;
    import java.io.IOException;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    import java.sql.Connection;
    
    /**
     * 工具类
     */
    public class JDBCUtils {
    
        //1. 定义成员变量 DataSource
        private static DataSource ds;
    
        static {
            //1. 加载配置文件
            Properties pro = new Properties();
            try {
                pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
                //2. 获取DataSource
                ds = DruidDataSourceFactory.createDataSource(pro);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 获取连接
         * @return
         */
        public static Connection getConnection() throws SQLException {
            return ds.getConnection();
        }
    
        /**
         * 释放资源
         */
        public static void close(Statement stat, Connection conn){
           close(null,stat,conn);
        }
    
        public static void close(ResultSet rs,Statement stat, Connection conn){
            if(rs != null){
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(stat != null){
                try {
                    stat.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
    
            if(conn != null){
                try {
                    conn.close();//归还连接
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    
        /**
         * 获取连接池方法
         */
        public  static DataSource getDataSource(){
            return ds;
        }
    
    }
    package cn.itcast.datasource.druid;
    
    import cn.itcast.datasource.utils.JDBCUtils;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    /**
     * 使用新的工具类
     */
    public class DruidDemo2 {
    
        public static void main(String[] args) {
            Connection conn = null;
            PreparedStatement ps = null;
            /*
             * 完成添加操作,给account表添加一条记录
             */
            //1. 获取连接
            try {
                conn = JDBCUtils.getConnection();
                //2. 定义sql
                String sql = "insert into account values (null,?,?)";
                //获取ps对象
                ps = conn.prepareStatement(sql);
                //给?赋值
                ps.setString(1,"wangwu");
                ps.setDouble(2,3000);
                //执行sql
                int count = ps.executeUpdate();
                System.out.println(count);
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                JDBCUtils.close(ps,conn);
            }
        }
    }

     执行结果:

     

  • 相关阅读:
    3.1 history跳转页面产生跨域问题
    2021年6月7日 团队冲刺第二阶段04
    2021年6月6日 团队冲刺第二阶段03
    2021年6月5日 团队冲刺第二阶段02
    2021年6月4日 团队冲刺第二阶段01
    2021年6月3日
    2021年6月2日
    2021年6月1日
    2021年5月31日
    2021年5月30日
  • 原文地址:https://www.cnblogs.com/ajing2018/p/15781771.html
Copyright © 2011-2022 走看看