Driud连接池的使用

发布时间:2023年12月21日

1.整体流程

1.导入jar包 druid-1.2.8.jar

2.定义配置文件

3.加载配置文件

4.获取数据库连接池对象

5.获取连接

注意:2、3、4整体又叫做创建数据源(连接池)

2.代码演示

1.导入jar包 druid-1.2.8.jar

2.创建数据源 (获取连接池对象)

//1 获得连接池(创建数据源)
            //1.1 核心类
            DruidDataSource dataSource = new DruidDataSource();
            //1.2 基本4项
                    //  1) 驱动
                    dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
                    //  2) 连接
                    dataSource.setUrl("jdbc:mysql://localhost:3306/day1?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai");
                    //  3) 用户
                    dataSource.setUsername("root");
                    //  4) 密码
                    dataSource.setPassword("123456");
             //1.3 特殊项【可选】
                    // 1) 初始化大小
                    dataSource.setInitialSize(5);
                    // 2) 最大值活动数
                    dataSource.setMaxActive(10);
                    // 3) 最小空闲数
                    dataSource.setMinIdle(2);

3.获取连接

 //2 从连接池中获得连接
        long l = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            DruidPooledConnection conn = dataSource.getConnection();
            System.out.println(conn);
            //用完了,返还到连接池中
            conn.close();
        }
        long l1 = System.currentTimeMillis();
        System.out.println("执行时间:"+(l1-l));

3.封装使用连接池

1.由于每次使用连接池我们都会去创建数据源,重复且费事儿,那么我们可以创建一个工具类

把创建数据源放到静态代码块中即可,类加载时执行一次就可以了

//以便后续的后续的获取连接池方法中,能拿到这个创建的数据源
public static DruidDataSource dataSource=null;

    static{
        //1.获取数据源
        dataSource = new DruidDataSource();
        //1.2 基本4项
        //  1) 驱动
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        //  2) 连接
        dataSource.setUrl("jdbc:mysql://localhost:3306/day1?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai");
        //  3) 用户
        dataSource.setUsername("root");
        //  4) 密码
        dataSource.setPassword("123456");
        //1.3 特殊项【可选】
        // 1) 初始化大小
        dataSource.setInitialSize(5);
        // 2) 最大值活动数
        dataSource.setMaxActive(10);
        // 3) 最小空闲数
        dataSource.setMinIdle(2);
    }
   

2.封装利用上面数据源获得连接的过程

  //将获得连接也封装进一个方法,写成静态以后直接类名调用
    public static Connection getConnection() {
        try {
            //2.获得连接
            DruidPooledConnection conn = dataSource.getConnection();
            return conn;
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }

3.将资源释放也封装进一个方法

这里需要注意:我们调用该方法释放资源时,释放的Sql执行对象:PreparedStatement ps,得是我们利用连接池获得的连接connection 创建的PreparedStatement ps,如果我们利用连接创建的是Sql执行对象为:Statement statement,那么有两种解决办法:

1.不能使用该方法释放资源,自己手动释放

2.封装释放方法时,将释放的对象类型改成Statement 即可(方法中:Statement +statement(为形参,随便命名,只要最后我们用该方法时传的实参为Statement类型的即可))

    //将资源的释放也封装进方法中
    public  static  void close(PreparedStatement ps,Connection connection){
        if (ps !=null){
            try {
                ps.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (connection !=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

?3.案例实操

Fengconnectionpool就是我们写的用来封装各部分的工具类,需要用其中的方法,直接调

public class Test {
    public static void main(String[] args) {
        Connection connection=null;
        PreparedStatement ps=null;


        try {
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入用户名:");
            String username1 = scanner.next();
            System.out.println("请输入用户密码:");
            String pwd1 = scanner.next();
            //从我们写的工具类中,调用封装的获得连接池的方法
             connection = Fengconnectionpool.getConnection();
            if (connection !=null) System.out.println("数据库连接成功");

            String sql="select *from usermessage where name=? and password=?";
            ps = connection.prepareStatement(sql);
            ps.setString(1,username1);
            ps.setString(2,pwd1);

            ResultSet resultSet = ps.executeQuery();
            if (resultSet.next()){
                System.out.println("登录成功");
            }else {
                System.out.println("登录失败");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //使用自己写的工具类,中封装的方法释放资源
           Fengconnectionpool.close(ps,connection);
        }

    }
}

文章来源:https://blog.csdn.net/m0_72128887/article/details/132778574
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。