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

    1.数据库连接池

    数据库连接–执行完毕–释放。
    建立连接和释放连接的过程十分浪费系统资源。
    因此出现池化技术:准备一些预先的资源,过来就连接预先准备好的。从而减少连接建立和释放的频度,达到节省资源的目的。

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

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

    好处:

    (1)节约资源

    (2)用户访问高效

    常用连接数100个
    最小连接数:100
    最大连接数:115 业务最高承载上限
    超过115,需要排队等待
    等待超时:100ms

     2.实现

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

      (1)方法:

        获取连接:getConnection()

        归还连接:Connection.close()  如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了,而是归还连接

      (2)一般我们不去实现它,由数据库厂商来实现

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

    使用了这些数据库连接池之后,我们在项目开发中就不需要编写数据库的代码

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

    jar包下载连接:https://sourceforge.net/projects/c3p0/

     步骤:

      (1)导入jar包(三个)c3p0-0.9.5.5.jar     mchange-commons-java-0.2.19.jar  mysql-connector-java-5.1.44.jar

      (2)定义配置文件(配置信息主要是填写数据库驱动、数据库名称、数据库用户名、密码等等,一般修改这些信息,其他的按默认的就可以了。)

        名称:c3p0.properties 或者 c3p0-config.xml(能自动加载)

        路径:直接将文件放在src目录下即可

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

      (4)获取连接  getConnection()

    c3p0-config.xml(名称不能改)

    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
      <!-- This is default config! -->
      <default-config>
        <!-- 连接参数 -->
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/db1?characterEncoding=utf8</property>
        <property name="user">root</property>
        <property name="password">123456</property>
    
        <!-- 连接池参数 -->
        <!-- 初始化申请的连接数量 -->
        <property name="initialPoolSize">5</property>
        <!-- 最大的连接数量 -->
        <property name="maxPoolSize">10</property>
        <property name="checkoutTimeout">3000</property>
      </default-config>
    
      <!-- This is my config for mysql-->
      <named-config name="mysql">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
        <property name="user">root</property>
        <property name="password">123456</property>
    
        <!-- 连接池参数 -->
        <!-- 初始化申请的连接数量 -->
        <property name="initialPoolSize">5</property>
        <!-- 最大的连接数量 -->
        <property name="maxPoolSize">8</property>
        <property name="checkoutTimeout">1000</property>
      </named-config>
    </c3p0-config>
    

      C3P0Demo01.java

    package cn.company.datasource.c3p0;
    
    import com.mchange.v2.c3p0.ComboPooledDataSource;
    
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import javax.sql.DataSource;
    
    public class C3P0Demo01 {
        public static void main(String[] args) throws SQLException {
            // 创建数据库连接池对象
            DataSource dataSource = new ComboPooledDataSource();
            // 获取连接对象
            Connection connection = dataSource.getConnection();
            // 打印
            System.out.println(connection);
        }
    }
    

      结果

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

    下载druid的jar包地址:https://mvnrepository.com/artifact/com.alibaba/druid

      步骤:

        (1)导入jar包  druid-1.0.9.jar

        (2)定义配置文件:

          是properties形式的

          可以叫任意名称,可以放在任意目录下(不会自动加载了,需要手动指定文件的路径和名称)

        (3)加载配置文件  Properties

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

        (5)获取连接:getConnection()

    druid.properties

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://127.0.0.1:3306/db1
    username=root
    password=123456
    initialSize=5
    maxActive=10
    maxWait=3000
    

      

    package cn.company.datasource.druid;
    
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    
    import java.io.InputStream;
    import java.sql.Connection;
    import java.util.Properties;
    
    import javax.sql.DataSource;
    
    public class DruidDemo {
        public static void main(String[] args) throws Exception {
            // 1.导入jar包
            // 2.导入配置文件
            // 3.加载配置文件
            Properties properties = new Properties();
            InputStream resourceAsStream = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
            properties.load(resourceAsStream);
    
            // 4.获取连接池对象
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
    
            // 5.获取连接
            Connection connection = dataSource.getConnection();
            System.out.println(connection);
        }
    }
    

      打印结果:

     完整实现查询数据库jdbcstudy信息案例:

    package cn.company.datasource.druid;
    
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    
    import java.io.InputStream;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.Properties;
    
    import javax.sql.DataSource;
    
    public class DruidDemo {
        public static void main(String[] args) throws Exception {
            // 1.导入jar包
            // 2.导入配置文件
            // 3.加载配置文件
            Properties properties = new Properties();
            InputStream resourceAsStream = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
            properties.load(resourceAsStream);
    
            // 4.获取连接池对象
            DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
    
            Connection connection = null;
            PreparedStatement preparedStatement = null;
            ResultSet rs = null;
    
            // 5.获取连接
            try {
                connection = dataSource.getConnection();
                String sql = "select * from users where `name`=? and `password`=?";
                preparedStatement = connection.prepareStatement(sql);
                preparedStatement.setString(1, "lisi");
                preparedStatement.setString(2, "123456");
                rs = preparedStatement.executeQuery();
                while (rs.next()) {
                    System.out.println(rs.getObject("name"));
                    System.out.println(rs.getObject("password"));
                    System.out.println(rs.getObject("email"));
                    System.out.println(rs.getObject("birthday"));
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                connection.close();
            }
        }
    }
    

      结果:

     定义工具类

    (1)定义一个类JDBCUtils

    (2)提供静态代码块加载配置文件,初始化连接池对象

    (3)提供方法

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

      释放资源

      获取连接池的方法

    JDBCUtils

    package cn.company.datasource.utils;
    
    /**
     * Druid连接池的工具类
     */
    
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    import javax.sql.DataSource;
    
    public class JDBCUtils {
        // 定义一个成员变量 DataSource
        private static DataSource dataSource;
        static {
            // 加载配置文件
            Properties properties = new Properties();
            try {
                properties.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
                // 获取dataSource
                dataSource = DruidDataSourceFactory.createDataSource(properties);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 获取连接的方法
         */
        public static Connection getConnection() throws SQLException {
            return dataSource.getConnection();
        }
    
        /**
         * 释放资源
         */
        public static void close(Statement statement, Connection connection) throws SQLException {
            // if (statement != null) {
            //     statement.close();
            // }
            // if (connection != null) {
            //     connection.close();  //归还连接
            // }
            close(null, statement, connection);
        }
    
        public static void close(ResultSet resultSet, Statement statement, Connection connection) throws SQLException {
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();  // 归还连接
            }
        }
    
        // 获取连接池的方法
        public static DataSource getDataSource() {
            return dataSource;
        }
    }
    

      使用新的工具类JDBCUtils

    package cn.company.datasource.druid;
    
    import cn.company.datasource.utils.JDBCUtils;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    
    /**
     * 使用新的工具类JDBCUtils
     */
    public class DruidDemo2 {
        public static void main(String[] args) throws SQLException {
            /**
             * 完成添加操作
             */
            Connection connection = null;
            PreparedStatement preparedStatement = null;
            try {
                // 获取连接
                connection = JDBCUtils.getConnection();
                String sql = "insert into users values(?,?,?,?,?)";
                preparedStatement = connection.prepareStatement(sql);
                preparedStatement.setInt(1, 4);
                preparedStatement.setString(2, "zhangsan");
                preparedStatement.setString(3, "123456");
                preparedStatement.setString(4, "2435579944@qq.com");
                preparedStatement.setString(5, "2020-12-04");
                int i = preparedStatement.executeUpdate();
                if (i > 0) {
                    System.out.println("增加成功!");
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                JDBCUtils.close(preparedStatement, connection);
            }
        }
    }
    

      

  • 相关阅读:
    js-html音乐播放
    CSS-实现倒影效果box-reflect
    html-屏蔽按键盘空格键是滚动条向下滚动
    html-禁用右键、键盘F12、网页上选取内容、复制、粘贴
    js-回调函数
    man bash 关于shell的应有尽有 语法、快捷键...
    source vs export AND ctrl d vs ctrl z
    技术----阳春
    限流 降级
    linux TOP
  • 原文地址:https://www.cnblogs.com/GumpYan/p/14078271.html
Copyright © 2011-2022 走看看