目录

概要什么是Druid

整体架构流程什么是连接池

连接池的基本原理

连接池的优点

使用Druid连接池的步骤如下:

技术细节


概要
什么是Druid


Druid是阿里巴巴的开源连接池组件,是世界上最好的连接池之一。Druid能对数据库连接进行有效管理和重用,最大化程序执行的效率。连接池负责创建和管理连接,程序只负责取用与归还。

整体架构流程
什么是连接池


1.数据库连接池是个容器,负责分配、管理数据库连接(Connection);
2.它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
3.释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏;

连接池的基本原理


Druid连接池的基本原理是通过创建一个连接池对象,该对象中包含了多个数据库连接对象。在需要使用数据库连接时,从连接池中获取一个连接对象,使用完毕后再将其归还给连接池。这样可以避免频繁地创建和销毁数据库连接对象,提高了数据库的性能和效率。

连接池的优点


1.资源重用
2.提升系统响应速度
3.避免数据库连接遗漏

常见的数据库连接池: DBCP、C3P0、Druid

Druid连接池是阿里巴巴开源的一个数据库连接池项目。它是Java语言中功能强大、性能优秀的数据库连接池之一。Druid连接池结合了C3P0、DBCP、Proxool等数据库连接池的优点,并加入了日志监控功能,可以监控数据库连接和SQL的执行情况。因此,可以说Druid连接池是针对监控而生的数据库连接池,也是目前最好的连接池之一。

使用Druid连接池的步骤如下:

导入Druid的jar包(druid-1.1.12.jar)。
配置Druid连接池的参数,包括数据库的URL、用户名、密码等。
在代码中通过DruidDataSource获取数据库连接对象Connection。
使用完连接对象后,将其归还给Druid连接池。
技术名词解释
使用Druid连接池的步骤:
1.导入Druid的jar包(druid-1.1.12.jar)

 我这里使用的是druid-1.0.9.jar(注意:一定不要忘了导入这两个jar包,可以手动导入到lib目录下然后导入module或者用maven导入,百度搜索Druid就能找到GitHub的页面,在里面的中文帮助里有提示)

2.配置Druid连接池的参数,包括数据库的URL、用户名、密码等。

定义配置文件db.properties的时候一定要注意在项目的src目录下创建文件,文件名后缀一定不要写错。在配置文件里面写自己的数据库四个连接参数,驱动名称,数据库url,用户名,密码。

#jdbc四个连接参数
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/tank-game?characterEncoding=utf8
username=root
password=root
3.加载配置文件
4.获取数据库连接池对象
5.获取连接

java代码:

package com.hp.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Properties;

/*数据库 连接池工具类,提供一个druid连接池,采用单例模式
* 连接池:数据库链接对象connection的共享机制,能一次性创建多个链接对象,适用于大型项目
* 并且能提供对链接对象的创建和归还以及销毁 等管理机制*/
public class DbUtil {
    //1.声明连接池
    private static DataSource ds;
    //2.赋值
    static {
        try {
            Properties p = new Properties();
            p.load(DbUtil.class.getClassLoader().getResourceAsStream("db.properties"));
            ds=DruidDataSourceFactory.createDataSource(p);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //3.返回
    public static DataSource getDs(){
        return ds;
    }

    public static void main(String[] args) throws SQLException {
        System.out.println(getDs().getConnection());
    }

}

我这里还把druid封装到一个工具类,这样方便在大型项目中应用于各种场景,这里这是一个简单的Druid连接池案例,算是入门连接池了。但Druid的功能肯定不止如此啦,还要继续学习啊。谢谢大家的关注。有什么问题评论区见。

技术细节


package com.hp.dao.Impl;

import com.hp.dao.IPlayerDao;
import com.hp.pojo.Player;
import com.hp.utils.DbUtil;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;

import java.sql.SQLException;
import java.util.Random;
import java.util.UUID;

public class PlayerDaoImpl implements IPlayerDao {
    /*注册方法,返回值为-1表示失败,1表示成功*/
    @Override
    public int register(String username, String password) {
        //1.创建dbutils工具类的核心操作对象qr
        //2.调用query或update方法
        try {
            QueryRunner qr = new QueryRunner(DbUtil.getDs());
            String pid = UUID.randomUUID().toString();
            int [] pos = randomPos();
            if (pos!=null){
                //随机生成玩家在世界地图中的颜色
                String color=randomColor();
                return qr.update("insert into player values (?,?,?,?,?,0,0,0,?)",pid,username,password,pos[0],pos[1],color);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return -1;
    }
//生成一个#01ff66 16进制的rgb颜色 %02x %表示占位符,用于填充r,g,b 02表示2个长度 不足2个长度,0填充,x表示16进制
    private String randomColor() {
        Random random = new Random();
        int r = random.nextInt(256);
        int g = random.nextInt(256);
        int b = random.nextInt(256);
        return String.format("#%02x%02x%02x",r,g,b);
    }

    //在1-10的范围内,随机生成二维平面坐标
    private int[] randomPos() {
        QueryRunner qr = new QueryRunner(DbUtil.getDs());
        Random r = new Random();
        try {
            Player player;
            int x,y;
            do {
                x = r.nextInt(10)+1;
                y = r.nextInt(10)+1;
                //player !=null 表示x,y存在,要继续循环,重新随机生成
                player = qr.query("select * from player where x=? and y=?",new BeanHandler<>(Player.class),x,y);
            }while (player!=null);
            return new int[]{x,y};
        }catch (Exception e){
            e.printStackTrace();
        }
        return null;//表示异常情况
    }

    //测试uuid生成pid
    public static void main(String[] args) {
        /*String id = UUID.randomUUID().toString();
        System.out.println(id);*/
        System.out.println(new PlayerDaoImpl().randomColor());
    }
}
小结
本次主要是了解Druid的优点,在大型项目中应用连接池,对于后端的逻辑可以通过持久层减少代码量提高效率。整体下来Druid连接池的基本配置是比较简单的,但是它的底层逻辑还是比较复杂的。所以我们只需要了解如何基本使用连接池。关注我,下一期更加精彩!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐