Java高级Day50-连接池

132.数据库连接池

传统获取Connection问题分析

  1. 传统的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载到内存中,再验证IP地址,用户名和密码。需要数据库连接的时候,就向数据库请求一个,频繁的进行数据库连接操作将占用很多的系统资源,容易导致服务器崩溃

  2. 每一次数据库连接,使用完后都得断开,如果程序出现异常而未能关闭,将导致数据库内存泄漏,最终导致重启数据库

  3. 传统获取连接的方式,不能控制创建的连接数量,如连接过多,也可能导致内存泄漏,MySQL崩溃

  4. 解决传统开发中的数据库连接问题,可以采用数据库连接池技术

public class TestJava {
    public void testCon() {
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; i ++) {
            //使用传统的jdbc方式,得到连接
            Connection connection = JDBCUtils.getConnection();
            //做一些工作,比如得到PreparedStatement,发送sql
            //关闭
            JDBCUtils.close(null,null ,connection);
        }
        long end = System.currentTimeMillis();
        System.out.println("传统方式5000次:" + (end - start));//7099ms
    }
}

数据库连接池原理

  1. 预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从“缓冲池”中取出一个,使用完毕后再放回去

  2. 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个

  3. 当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中

数据库连接池种类

  1. JDBC的数据库连接池使用 javax.sql.DataSource 来表示,DataSource只是一个接口,该接口通常由第三方提供实现

  2. C3P0 数据库连接池,速度相对较慢,稳定性不错(hibernate,spring)

  3. DBCP数据库连接池,速度相对c3p0较快,但不稳定

  4. Proxool数据库连接池,由监控连接池状态的功能,稳定性较c3p0差一点

  5. BoneCP数据库连接池,速度块

  6. Druid是阿里提供的数据库连接池,集DBCP,C3P0,Proxool优点于一身的数据库连接池

133.C3P0应用实例

public class TestJava {
    //方式1:相关参数,在程序中指定user,url,password等
    public void testC3P0_01() throws IOException, SQLException {
        //1.创建一个数据源对象
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        //2.通过配置文件mysql.properties获取相关连接信息
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\mysql.properties"));
        //读取相关的属性值
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");
​
        //给数据源 comboPooledDataSource 设置相关信息
        //连接管理是由 comboPoolDataSource 管理
        comboPooledDataSource.setDriverClass(dirver);
        comboPooledDataSource.setJdbcUrl(url);
        comboPooledDataSource.setUser(user);
        comboPooledDataSource.setPassword(password);
​
        //设置初始化连接数
        comboPooledDataSource.setInitiaPoolSize(10);
        //最大连接数
        comboPooledDataSource.setMaxPoolSize(50);
        //测试连接池的效率,测试对mysql 5000次操作
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            Connection connection = comboPooledDataSource.getConncetion();//这个方法就是从 DataSource接口实现的
            System.out.println("连接成功");
            connection.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("c3p0 5000次连接mysql 耗时=" + (end - start));
    }
​
    //第二种方式 使用配置文件模板来完成
​
    //将c3p0提供的 c3p0.config.xml 拷贝到 src目录下
    //2.该文件指定了连接数据库和连接池的相关参数
    public void testC3P0_02() throws SQLException{
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("数据源名称");
            Connection connection = comboPooledDataSource.getCaonnection();
            System.out.println("连接成功");
            connection.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("c3p0的第二种方式 耗时=" + (end - start));//413sm
    }
}

134.德鲁伊连接池

public class TestJava {
    public void testDruid() throws IOException {
        //1.加入 Druid jar包
        //2.加入 配置文件,将该文件 druid.properties 拷贝到本项目的src目录
        //3.创建Properties对象,读取配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\druid.properties"));
​
        //4.创建一个指定参数的数据库连接池
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
        long start = System.currentTimeMillis();
        for (int i = 0; i < 500000; i++) {
            Connection connection = dataSource.getConnection();
            System.out.println("连接成功");
            connection.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("德鲁伊连接池耗时=" + end - start);//539ms
    }
}

135.德鲁伊工具类

public class JDBCUtilsByDruid {
    //基于Druid数据库连接池的工具类
    private static DataSource ds;
    //静态代码块完成 ds初始化
    static {
        Properties properties = new Properties();
        try {
            properties.load(new FileInputStream("src\\druid.properties"));
            ds = DruidDataSourceFactory.createDataSource(properties);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    //编写getConnection方法
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }
    //关闭连接,注意:在数据库连接池技术中,close不是真的断掉连接
    //而是把使用的Connection对象放回连接池
    public static void close(ResultSet resultSet, Statement statement,Connection connection) {
        try{
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
​
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值