1.背景

数据库链接池大家不陌生吧...

不多说了,直上代码...

2.连接池具体实现

1.jdbc链接的实例对象

/**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 02/19 8:17
* @description
* <p>
* 模拟一个实现jdbc链接的实例
* </p>
*/
@Data
public class MyConnectionImpl implements Connection {
private String name;
// TODO 实现接口的方法
}

2.连接池对象

package com.ldp.demo09Pool;

import lombok.extern.slf4j.Slf4j;

import java.sql.Connection;
import java.util.concurrent.atomic.AtomicIntegerArray; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 02/19 8:10
* @description <p>
* 自定义一个数据库连接池
* 练习多线程,原子性等概念的理解
* </p>
*/
@Slf4j
public class MyDataPool {
// 1.链接数
private int poolSize;
// 2.链接对象数组
private Connection[] connectionArray;
// 3.记录链接状态的数组,0-链接可用,1-链接不可用
private AtomicIntegerArray statusArray; /**
* 构造方法
*
* @param poolSize
*/
public MyDataPool(int poolSize) {
this.poolSize = poolSize;
this.connectionArray = new Connection[poolSize];
this.statusArray = new AtomicIntegerArray(new int[poolSize]);
for (int i = 0; i < poolSize; i++) {
connectionArray[i] = new MyConnectionImpl("连接对象-" + i);
}
} /**
* 获取一个链接
*
* @return
*/
public Connection getConnection() {
while (true) {
for (int i = 0; i < poolSize; i++) {
if (statusArray.get(i) == 0) {
// 0-链接可用,1-链接不可用
if (statusArray.compareAndSet(i, 0, 1)) {
// 获取连接成功
return connectionArray[i];
}
}
}
synchronized (this) {
try {
// 如果没获取到链接,等待,实际开发中这里可以设置一个等待时长
log.info("无可用链接等待中....");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} /**
* 将连接放回连接池
*
* @param connection
*/
public void closeConnection(Connection connection) {
for (int i = 0; i < poolSize; i++) {
if (connectionArray[i] == connection) {
// 设置归返的链接可用
statusArray.set(i, 0);
// 唤醒其他线程获取连接
synchronized (this) {
this.notify();
}
break;
}
}
// 异常处理...
}
}

3.测试

package com.ldp.demo09Pool;

import com.common.MyThreadUtil;
import lombok.extern.slf4j.Slf4j; import java.sql.Connection;
import java.util.Random; /**
* @author 姿势帝-博客园
* @address https://www.cnblogs.com/newAndHui/
* @WeChat 851298348
* @create 02/19 8:42
* @description
*/
@Slf4j
public class Test01 {
/**
* 测试连接池使用
*
* @param args
*/
public static void main(String[] args) {
MyDataPool dataPool = new MyDataPool(3);
for (int i = 0; i < 10; i++) {
new Thread(() -> {
Connection connection = dataPool.getConnection();
log.info("获得链接对象:{}", connection);
// 模拟使用时间
MyThreadUtil.sleep(new Random().nextInt(5));
// 归返链接
dataPool.closeConnection(connection);
log.info("链接已归还");
}, "service-" + i).start();
}
}
}

完美!

java多线程之-自定义数据库连接池的更多相关文章

  1. Java多线程系列--“JUC线程池”06之 Callable和Future

    概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...

  2. Java多线程系列--“JUC线程池”02之 线程池原理(一)

    概要 在上一章"Java多线程系列--“JUC线程池”01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析Th ...

  3. Java多线程系列--“JUC线程池”03之 线程池原理(二)

    概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...

  4. Java多线程系列--“JUC线程池”04之 线程池原理(三)

    转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介绍线程池的生命周期.在"Java多线程系列--“基础篇”01之 基 ...

  5. Java多线程系列--“JUC线程池”05之 线程池原理(四)

    概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...

  6. 转:java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例

    java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例 1.CountDownLatch:一个同步工具类,它允许一个或多个线程一 ...

  7. Tomcat配置多线程和配置数据库连接池

    Tomcat配置多线程和配置数据库连接池 1.  tomcat配置线程池: [root@RD2_AS yanghuihui]# cd /usr/tomcat/conf/ [root@RD2_AS co ...

  8. JAVA和C#中数据库连接池原理与应用

    JAVA和C#中数据库连接池原理 在现在的互联网发展中,高并发成为了主流,而最关键的部分就是对数据库操作和访问,在现在的互联网发展中,ORM框架曾出不穷, 比如:.Net-Core的EFCore.Sq ...

  9. 【Java EE 学习 15】【自定义数据库连接池之动态代理的使用】

    一.动态代理的作用 使用动态代理可以拦截一个对象某个方法的执行,并执行自定义的方法,其本质是反射 优点:灵活 缺点:由于其本质是反射,所以执行速度相对要慢一些 二.数据库连接池设计思想 1.为什么要使 ...

  10. Java多线程-新特性-线程池

    Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序 ...

随机推荐

  1. 学习ThreeJS

    创建第一个应用 使用Three JS进行编程的时候,都是在调用new Three().XXX 来实现方法,让我们先根据官方文档创建一个demo https://threejs.org/docs/ind ...

  2. Lecture4

    Smiling & Weeping ---- 行于山水之间 权且停留 无所谓风起叶落,浮光敛形 此刻   身即自由 第四章 Git 工具 Author: Martin 本章主要介绍 Git 常 ...

  3. YUM退役了?DNF本地源配置

    客户遇到在OEL8安装Oracle缺包问题,使用dnf安装也没有,甚至连oracle-database-preinstall-21c都装不上.本质是DNF配置问题. 早期为了解决这类问题,专门写过很多 ...

  4. 算法金 | A - Z,115 个数据科学 机器学习 江湖黑话(全面)

    大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 机器学习本质上和数据科学一样都是依赖概率统计,今天整整那些听起来让人头大的机器学习江湖 ...

  5. ZYNQ uboot 网络调试

    背景 使用 Vivado配置好网络,并在PetaLinux中构建了完整的uboot.kernel.rootfs以后,发现网络有问题. > ping 192.168.168.1 ethernet@ ...

  6. 设备树DTS 学习:学习总结(应用篇)

    设备树DTS 学习:学习总结(应用篇) 背景 经过前几章的学习,我们可以说是掌握了设备树的基础用法,现在作为总结回顾. 1.设备树DTS 学习:有关概念 介绍了什么是设备树,设备树的作用,如何编译设备 ...

  7. MAPREDUCE中的序列化

    Java的序列化是一个重量级序列化框架(Serializable),一个对象被序列化后,会附带很多额外的信息(各种校验信息,header,继承体系....),不便于在网络中高效传输: 所以,hadoo ...

  8. 【ClickHouse】2:clickhouse基本语法

    背景介绍: 有三台CentOS7服务器安装了ClickHouse HostName IP 安装程序 程序端口 centf8118.sharding1.db 192.168.81.18 clickhou ...

  9. DownUnderCTF 2024 - Forensics

    DownUnderCTF 2024 - Forensics Baby's First Forensics 他们整个上午都在试图破坏我们的基础设施!他们正试图获得更多关于我们秘密袋鼠的信息!我们需要您的 ...

  10. 在IDEA中找不到Mapper报错

    前言 相信大多数互联网公司的持久层框架都是使用 Mybatis 框架,而大家在 Service 层引入自己编写的 Mapper 接口时应该会遇到下面的情况: 我们可以看到,上面的红色警告在提示我们,找 ...