JUC的数据库连接池小练习

JUC练习数据库连接池实现

  • 通过一个连接数组来充当连接池
  • 一个原子的标记数组
  • 通过cas来保持多线程下的安全,用synchronized来进行暂停和唤醒
@Slf4j
public class MyConnectionPoll {

    // 连接池对象数组
    private Connection[] connections;
    // 使用标记
    private AtomicIntegerArray flagArrays;
    // 线程池大小
    private Integer poolSize;

    public MyConnectionPoll(){
        this.poolSize = 5;
        connections = new MarkConnection[5];
        flagArrays = new AtomicIntegerArray(5);
        for (int i = 0; i < connections.length; i++) {
            connections[i] = new MarkConnection("连接" + i+1);
        }
    }

    // 连接池的初始化
    public MyConnectionPoll(int poolSize) {
        this.poolSize = poolSize;
        connections = new MarkConnection[poolSize];
        flagArrays = new AtomicIntegerArray(poolSize);
        for (int i = 0; i < connections.length; i++) {
            connections[i] = new MarkConnection("连接" + i);
        }
    }

    // 向连接池中请求连接
    public Connection getConnection(){
        while (true){
            for (int i = 0; i < poolSize; i++) {
                // 进行cas请求,如果请求失败就失败
                if (flagArrays.compareAndSet(i,0,1)){
                    return connections[i];
                }
            }
            // 如果请求失败,并且已经没有可用的连接就需要进行等待
            synchronized (this){
                try {
                    // 等待直到被唤醒,然后对所有请求进行遍历找到空闲连接
                    this.wait();  // 调用wait方法需要进行加锁
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    // 释放连接
    public void releaseConnection(Connection con){
        for (int i = 0; i < poolSize; i++) {
            if (con == connections[i]){
                flagArrays.set(i,0);  // 将连接标识置为0即空间连接
                synchronized (this){
                    this.notifyAll(); // 唤醒全部等待的线程
                }
            }
        }
    }

    public static void main(String[] args) {
        MyConnectionPoll myConnectionPoll = new MyConnectionPoll(5);
        for (int i = 0; i < 10; i++) {
            new Thread(() ->{
                MarkConnection connection =(MarkConnection) myConnectionPoll.getConnection();
                log.debug("获得锁{}",connection.getConName());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                myConnectionPoll.releaseConnection(connection);
                log.debug("释放锁{}",connection.getConName());
            }).start();
        }
    }
}

Original: https://www.cnblogs.com/duizhangz/p/16255433.html
Author: 大队长11
Title: JUC的数据库连接池小练习

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/599168/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux 目录

    以下是对这些目录的解释: /bin: bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 /boot: 这里存放的是启动 Linux 时使用的…

    数据库 2023年6月6日
    0107
  • InnoDB 中不同SQL语句设置的锁

    锁定读、UPDATE 或 DELETE 通常会给在SQL语句处理过程扫描到的每个索引记录上设置记录锁。语句中是否存在排除该行的WHERE条件并不重要。InnoDB不记得确切的WHE…

    数据库 2023年5月24日
    084
  • 第十八章 AOP底层实现原理

    1.核心问题 1. AOP如何创建动态代理类 2. Spring工厂如何加工创建代理对象 通过原始对象的id值,获得的是代理对象 2.动态代理类的创建 2.1 JDK动态代理 通过…

    数据库 2023年6月14日
    0102
  • maven配置本地仓库

    https://www.cnblogs.com/javajetty/p/10051156.html maven配置本地仓库 Original: https://www.cnblog…

    数据库 2023年6月9日
    084
  • Java学习-第一部分-第一阶段-第八节:项目-房屋出租系统

    项目-房屋出租系统 笔记目录:(https://www.cnblogs.com/wenjie2000/p/16378441.html) 房屋出租系统-需求 ●项目需求说明 实现基于…

    数据库 2023年6月11日
    078
  • MySQL中的触发器

    1.定义: 触发器和存储过程相似,都是嵌入到 MySQL 中的一段程序。触发器是由事件来触发某个操作。当数据库执行这些事件时,就会激活触发器来执行相应的操作。这些事件称为触发条件,…

    数据库 2023年6月16日
    0115
  • IDEA 快捷键

    普通快捷键 分类 说明 快捷键 代码提示 代码提示或自动补全 Alt + / 代码提示 Ctrl + Alt + Space 提示方法参数类型 Ctrl + P 提示注释文档 Ct…

    数据库 2023年6月6日
    082
  • Python操作Excel表格

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/b0277e1c.html 你好,我是测试蔡坨坨。 上期我们分享了一个Python编写的小工具——「Py…

    数据库 2023年6月11日
    0109
  • Ubuntu 服务器安装 MySQL 远程数据库

    在 Web 项目中,我们需要使用到远程数据库,开发阶段也需要连接并查看数据库的状况。腾讯云、阿里云等云平台提供了远程数据库,可直接使用;当然也可以自己在部署 Web 的服务器上安装…

    数据库 2023年6月14日
    085
  • redhat 7.4从openssh7.6离线升级openssh8.4p1解决方法

    具体需求 这几天生产环境服务器又进行了安全扫描,每次都会报一下漏洞错误。虽然只有一个高危问题,但是每次看到ssh远程漏洞都很烧脑 “主要是里面坑太多了”,闲…

    数据库 2023年6月14日
    080
  • ShardingSphere-JDBC进行分库分表

    一、前言:分库分表 在大型的互联网系统中,可能单台MySQL的存储容量无法满足业务的需求,这时候就需要进行扩容了。 和之前的问题一样,单台主机的硬件资源是存在瓶颈的,不可能无限制地…

    数据库 2023年6月14日
    072
  • 啥是Session?

    什么是 Session 会话? 1、Session 就一个接口(HttpSession)。2、Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。3、每个客…

    数据库 2023年6月11日
    079
  • 笔记-docker学习-1

    一、docker安装 1、CentOS Docker安装 安装命令如下: curl -fsSL https://get.docker.com | bash -s docker –…

    数据库 2023年6月9日
    061
  • java实现有道翻译爬虫

    我的博文地址 https://www.cnblogs.com/lingdurebing/p/11618902.html 使用的库 1.commons-codec 主要是为了加密,可…

    数据库 2023年6月11日
    0104
  • flowable 部署流程定义(从Classpath) 和 (根据ui.modeler的 modelId部署)

    /**部署流程定义(根据ui.modeler的 modelId部署) * @param modelId 模型ID * @from fhadmin.cn */ protected S…

    数据库 2023年6月6日
    0117
  • Mysql数据库 ALTER 基本操作

    背景: ALTER作为DDL语言之一,工作中经常遇到,这里我们简单介绍一下常见的几种使用场景 新建两个测试表offices 和 employess CREATE TABLE off…

    数据库 2023年6月14日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球