java多线程之-自定义数据库连接池
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多线程之-自定义数据库连接池的更多相关文章
- Java多线程系列--“JUC线程池”06之 Callable和Future
概要 本章介绍线程池中的Callable和Future.Callable 和 Future 简介示例和源码分析(基于JDK1.7.0_40) 转载请注明出处:http://www.cnblogs.co ...
- Java多线程系列--“JUC线程池”02之 线程池原理(一)
概要 在上一章"Java多线程系列--“JUC线程池”01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析Th ...
- Java多线程系列--“JUC线程池”03之 线程池原理(二)
概要 在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包括:线程池示例参考代 ...
- Java多线程系列--“JUC线程池”04之 线程池原理(三)
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介绍线程池的生命周期.在"Java多线程系列--“基础篇”01之 基 ...
- Java多线程系列--“JUC线程池”05之 线程池原理(四)
概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...
- 转:java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例
java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例 1.CountDownLatch:一个同步工具类,它允许一个或多个线程一 ...
- Tomcat配置多线程和配置数据库连接池
Tomcat配置多线程和配置数据库连接池 1. tomcat配置线程池: [root@RD2_AS yanghuihui]# cd /usr/tomcat/conf/ [root@RD2_AS co ...
- JAVA和C#中数据库连接池原理与应用
JAVA和C#中数据库连接池原理 在现在的互联网发展中,高并发成为了主流,而最关键的部分就是对数据库操作和访问,在现在的互联网发展中,ORM框架曾出不穷, 比如:.Net-Core的EFCore.Sq ...
- 【Java EE 学习 15】【自定义数据库连接池之动态代理的使用】
一.动态代理的作用 使用动态代理可以拦截一个对象某个方法的执行,并执行自定义的方法,其本质是反射 优点:灵活 缺点:由于其本质是反射,所以执行速度相对要慢一些 二.数据库连接池设计思想 1.为什么要使 ...
- Java多线程-新特性-线程池
Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序 ...
随机推荐
- 使用 Promise.withResolvers() 来简化你将函数 Promise 化的实现~~
引言 在JavaScript编程中,Promise 是一种处理异步操作的常用机制.Promise 对象代表了一个尚未完成但预期将来会完成的操作的结果.在本文中,我们将探讨如何通过使用 ES2024 的 ...
- Mysql慢sql优化
Mysql慢sql优化 index1.MySQL的执行过程2.索引的定义3.MySQL执行计划explain or desc4.索引使用/创建规则5.弊端6.设计规范7.SQL建议 1. MySQL ...
- mklink命令使得OneDrive同步任意一个文件夹
本文介绍利用mklink命令,使得OneDrive自动同步电脑中任意指定文件夹的方法. OneDrive是由微软提供的云存储和文件同步服务.它提供了大量的云存储空间,允许用户将文件和数据存储在 ...
- P6623 [省选联考 2020 A 卷] 树
day2t2但难度不大,和AGC044C解法类似 题目大意: 给定一棵 \(n\) 个结点的有根树 \(T\),结点从 \(1\) 开始编号,根结点为 \(1\) 号结点,每个结点有一个正整数权值 \ ...
- 高通与At指令:AtCop解析
背景 在某个新基线上移植AT指令,发现有问题,因此收集了这个系列的 文章 作为 这方面的知识补充. 原文作者:laozhuxinlu,本文有删改. 另外,还参考了:https://www.cnblog ...
- 开源日志组件Sejil--附带日志管理界面
1.开源日志组件源码: https://github.com/alaatm/Sejil 2.下载下来发现里面对于不同的.net core 版本的配置提供了对应的示例 .Net Core 3.1 Pr ...
- 【基础整理】Mapping representation 机器人所用地图种类及相关介绍
参考与前言 本文主要介绍 建图 Mapping 方面的一些 基础知识介绍与相关下游任务使用 涉及知识较为基础,SLAM大佬们可以提前退出了 主要针对应用为移动机器人与物流无人驾驶车:提前申明:大部分文 ...
- 化腐朽为神奇!揭开ISP图像处理的神秘面纱,基于瑞芯微RK3568J工业平台!
ISP图像处理前后图像对比 化腐朽为神奇!经过ISP图像处理的图片前后对比是如此惊人!从下图中可以观察到,未经处理的原始图像偏绿且暗淡,而经ISP图像处理的图像能够清晰地还原现场真实的颜色细节! 图1 ...
- 继续我们的复习之路——webapi
前面断更几天是因为在住安心复习DOM BOM的内容 不得不说 还得是DOM 在这一章节的复习内容中 涌现出了很多又代表意义 经典的一些小案例 而且 还是有些难度的 有一两个我反正是自己独立完成不了 ...
- P6626 题解
有一个很暴力的解法,就是以询问点为根 DFS. 考虑优化,我们考虑优化换根. 当根节点从父亲移动到它的某个孩子时,孩子的子树内所有点深度减 \(1\) 其余点深度加 \(1\). 同理,当根节点从某个 ...