zoukankan      html  css  js  c++  java
  • Java-C3P0和Druid连接池的运用

    1.概念

    • 其实就是一个容器(集合),存放数据库连接的容器
    • 当系统初始化好后,容器被创建,容器会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
    • 好处:节约资源,用户访问高效

    2.实现:

    2.1 标准接口:DataSource javax.aql包下的

    1. 方法:
      • 获取连接:getConnextion()
      • 归还连接:如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭数据库了。而是归还连接
    2. 一般我们不去实现它,有数据库厂商实现

    2.2 C3P0:数据库连接池技术

    步骤

    1. 导入jar包(两个) c3p0-0.9.5.2 mchange-commons-java-0.2.12 mysql-connector-java-5.1.38
      • 不要忘记导入数据库的驱动架包
    2. 定义配置文件:
      • 名称:c3p0.propertie或者c3p0-config.xml
      • 路径:直接将文件放在src目录下即可
    3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
    4. 获取连接:getConnection

    配置文件

    <?xml version="1.0" encoding="utf-8"?>
    <c3p0-config>
        <default-config>
            <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">123456</property>
            
            <property name="initialPoolSize">5</property>
            <property name="maxPoolSize">10</property>
            <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">123456</property>
    
            <property name="initialPoolSize">5</property>
            <property name="maxPoolSize">8</property>
            <property name="checkoutTimeout">3000</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){
            //创建数据库连接池对象
    
            DataSource dataSource=new ComboPooledDataSource();
            //获取连接对象
            try {
                Connection connection=dataSource.getConnection();
                System.out.println(connection);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            //打印
    
        }
    }
    

    2.3 Druid:数据库连接池技术,由阿里巴巴提供

    步骤

    1.导入jar包  druid-1.0.9
    2.定义配置文件
        * 是properties形式的
        * 可以叫任意名称,可以放在任意目录下
    3.加载配置文件,Properties
    4.获取数据库连接池对象:通过工厂类来获取 DruidDataSourceFactory
    5.获取连接:getConnection 
    

    配置文件

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/db3?useUnicode=true&characterEncoding=utf-8&characterSetResults=utf-8
    username=root
    password=123456
    # 初始化连接数量
    initialSize=5
    # 最大连接数
    maxActive=10
    # 最大等待时间
    maxWait=3000
    # maxIdle=10
    minIdle=3
    

    代码如下

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

    定义Druid连接池工具类

    ---------定义一个类 JDBCUtils--------------------------
    package cn.itcast.utils;
    
    import cn.itcast.datasource.druid.DruidDemo;
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    
    import javax.sql.DataSource;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Properties;
    
    public class JDBCUtils {
        //定义成员变量 dataSource
        private static DataSource dataSource;
    
        static{
            try {
                //定义配置文件
                //加载配置文件
                Properties properties=new Properties();
                // InputStream inputStream= DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
                // properties.load(inputStream);
                properties.load( DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"));
                //获取连接池对象
                dataSource= DruidDataSourceFactory.createDataSource(properties);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        //获取连接
        public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
        }
        //释放资源
        public static void close(Statement statement,Connection connection){
            // if(statement!=null){
            //     try {
            //         statement.close();
            //     } catch (SQLException e) {
            //         e.printStackTrace();
            //     }
            // }
            // if(connection!=null){
            //     try {
            //         connection.close();
            //     } catch (SQLException e) {
            //         e.printStackTrace();
            //     }
            // }
            close(null,statement,connection);
    
        }
        public static void close(ResultSet resultSet, Statement statement, Connection connection){
            if(resultSet!=null){
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
    
            if(statement!=null){
                try {
                    statement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
        //获取连接池方法
        public static DataSource getDataSource(){
            return  dataSource;
        }
    }
    -------------提供静态代码块加载配置文件,初始化连接对象-----------------------
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/db3?useUnicode=true&characterEncoding=utf-8&characterSetResults=utf-8
    username=root
    password=123456
    # 初始化连接数量
    initialSize=5
    # 最大连接数
    maxActive=10
    # 最大等待时间
    maxWait=3000
    # maxIdle=10
    minIdle=3
    -----------------提供方法----------------------------------------------------
    1. 获取连接方法:通过数据库连接池获取连接
    2. 释放资源
    3. 获取连接池的方法
    package cn.itcast.datasource.druid;
    
    import cn.itcast.utils.JDBCUtils;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    
    public class DruidDemo2 {
        public static void main(String[] args) throws Exception {
        //完成添加操作。给account表添加一条记录
            //获取连接
            Connection connection= JDBCUtils.getConnection();
            //定义SQL
            String sql="insert into account values(null,?,?)";
            //获取pstmt对象
            PreparedStatement preparedStatement=connection.prepareStatement(sql);
            //给?赋值
            preparedStatement.setString(1,"wangwu");
            preparedStatement.setDouble(2,3000);
            //执行SQL
            int count=preparedStatement.executeUpdate();
            //打印
            System.out.println(count);
        }
    }
  • 相关阅读:
    C++ int与string的相互转换(含源码实现)
    二维数组名和二级指针
    一道算法题-从1到n整数中1出现的次数
    一道算法题-求三个矩形的交集矩形。
    位域
    计划
    Bigtable:一个分布式的结构化数据存储系统
    The Google File System 中文版
    HIVE和HBASE区别
    区分 hdfs hbase hive hbase适用场景
  • 原文地址:https://www.cnblogs.com/dongxuelove/p/13034863.html
Copyright © 2011-2022 走看看