数据库连接池

引出数据库连接池技术

传统获取 Connection 问题分析

 数据库连接池种类 

C3P0 应用实例

public class C3P0_ {
        //方式 1: 相关参数,在程序中指定 user, url , password 等
        @Test
        public void testC3P0_01() throws Exception {
            //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 设置相关的参数
            //注意:连接管理是由 comboPooledDataSource 来管理
            comboPooledDataSource.setDriverClass(driver);
            comboPooledDataSource.setJdbcUrl(url);
            comboPooledDataSource.setUser(user);
            comboPooledDataSource.setPassword(password);
            //设置初始化连接数
            comboPooledDataSource.setInitialPoolSize(10);
            //最大连接数
            comboPooledDataSource.setMaxPoolSize(50);
            //测试连接池的效率, 测试对 mysql 5000 次操作
            long start = System.currentTimeMillis();
            for (int i = 0; i < 5000; i++) {
                Connection connection = comboPooledDataSource.getConnection(); //这个方法就是从 DataSource 接口
                实现的
            //System.out.println("连接 OK");
                connection.close();
            }
            long end = System.currentTimeMillis();
            //c3p0 5000 连接 mysql 耗时=391
            System.out.println("c3p0 5000 连接 mysql 耗时=" + (end - start));
            第 1137页
            韩顺平循序渐进学 Java 零基础
        }
        //第二种方式 使用配置文件模板来完成
        //1. 将 c3p0 提供的 c3p0.config.xml 拷贝到 src 目录下
        //2. 该文件指定了连接数据库和连接池的相关参数
        @Test
        public void testC3P0_02() throws SQLException {
            ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("hsp_edu");
            //测试 5000 次连接 mysql
            long start = System.currentTimeMillis();
            System.out.println("开始执行....");
            for (int i = 0; i < 500000; i++) {
                Connection connection = comboPooledDataSource.getConnection();
            //System.out.println("连接 OK~");
                connection.close();
            }
            long end = System.currentTimeMillis();
            //c3p0 的第二种方式 耗时=413
            System.out.println("c3p0 的第二种方式(500000) 耗时=" + (end - start));//1917
        }
    }

 Druid(德鲁伊)--重点

应用实例

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.junit.jupiter.api.Test;
import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.util.Properties;
public class Druid_ {
    public void testDruid() throws Exception {
    //1. 加入 Druid jar 包
    //2. 加入 配置文件 druid.properties , 将该文件拷贝项目的 src 目录
        //3. 创建 Properties 对象, 读取配置文件
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\druid.properties"));
        //4. 创建一个指定参数的数据库连接池, Druid 连接池
        DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
        long start = System.currentTimeMillis();
        for (int i = 0; i < 500000; i++) {
            Connection connection = dataSource.getConnection();
            System.out.println(connection.getClass());
            //System.out.println("连接成功!");
            connection.close();
        }
        long end = System.currentTimeMillis();
        //druid 连接池 操作 5000 耗时=412
        System.out.println("druid 连接池 操作 500000 耗时=" + (end - start));//539
    }
}

Druid(德鲁伊)封装成JDBCUtils方便以后使用

import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.FileInputStream;
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 JDBCUtilsByDruid {
    private static DataSource ds;
    //在静态代码块完成 ds 初始化
    static {
        Properties properties = new Properties();
        try {
            properties.load(new FileInputStream("src\\druid.properties"));
            ds = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //编写 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);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值