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();
}
}
}

JUC的数据库连接池小练习的更多相关文章

  1. 蓝图、基于DBUtils实现数据库连接池、上下文管理等

    基于DBUtils实现数据库连接池 小知识: 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_v ...

  2. Flask【第3篇】:蓝图、基于DBUtils实现数据库连接池、上下文管理等

    基于DBUtils实现数据库连接池 小知识: 1.子类继承父类的三种方式 class Dog(Animal): #子类 派生类 def __init__(self,name,breed, life_v ...

  3. EF Core 小坑:DbContextPool 会引起数据库连接池连接耗尽

    DbContextPool 是 ASP.NET Core 2.1 引入的新特性,可以节省创建 DbContext 实例的开销,但没有想到其中藏着一个小坑. 最近有一个 ASP.NET Core 项目持 ...

  4. Tomcat 与 数据库连接池 的小坑

    连接池的优点众所周知. 我们可以自己实现数据库连接池,也可引入实现数据库连接池的jar包,按要求进行配置后直接使用. 关于这方面的资料,好多dalao博客上记录的都是旧版本Tomcat的配置方式,很可 ...

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

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

  6. JDBC 数据库连接池 小结

    原文:http://www.cnblogs.com/lihuiyy/archive/2012/02/14/2351768.html 当对数据库的访问不是很频繁时,可以在每次访问数据库时建立一个连接,用 ...

  7. Java中数据库连接池原理机制的详细讲解以及项目连接数据库采用JDBC常用的几种连接方式

    连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式 ...

  8. Java数据库连接池

    转载过来的,最近在做一个小网站,准备使用这种方法.     Java jdbc数据库连接池总结! 1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及, ...

  9. 数据库连接池dbcp基本配置

    DBCP(DataBase connection pool),数据库连接池.是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件.单独使用dbcp需要2个包: com ...

随机推荐

  1. 学习k8s(三)

    一.Kubernetes核心概念 1.Kubernetes介绍 Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展.如果你曾经用过Docker容器技术部署 ...

  2. 什么是arduino及.arduino分类

    关于什么是arduino没有什么可说的,想要接触arduino多多少少的都会对arduino有一定的理解,我认为,arduino应该算是一个连接硬件与软件的平台,通过他,你可以将你的想法以代码的形式呈 ...

  3. 5. Git初始化及仓库创建和操作

    4. Git初始化及仓库创建和操作 基本信息设置 1. 设置用户名 git config --global user.name 'itcastphpgit1' 2. 设置用户名邮箱 git confi ...

  4. 220v-5v稳压电路

    5V整流电路原理 先对电路进行整流 整流电路:利用单向导电器件将交流电转换成脉动直流电路,再用电容进行滤波 滤波电路:利用储能元件(电感或电容)把脉动直流电转换成比较平坦的直流电,然后对电路进行稳压 ...

  5. electron制作聊天界面(仿制qq)

    效果图: 样式使用scss和flex布局 这也是制作IM系统的最后一个界面了!在制作之前参考了qq和千牛 需要注意的点 qq将滚动条美化了 而且在无操作的情况下是不会显示的 滚动条美化 ::-webk ...

  6. HTML 初学整理

    一.HTML简介 HTML的概念 HTML是HyperText Markup Language(超文本标记语言)的简写,超文本标记语言,标准通用标记语言下的一个应用."超文本"就是 ...

  7. 前端面试题整理——手写bind函数

    var arr = [1,2,3,4,5] console.log(arr.slice(1,4)) console.log(arr) Function.prototype.bind1 = functi ...

  8. 软件构造实验-百度图像识别api

    识别结果: 识别结果:

  9. throws子句在继承当中overrride时有什么规则

    8.throws子句在继承当中overrride时的规则 马克-to-win:当子类方法override父类方法时,throws子句不能引进新的checked异常.换句话说:子类override方法的 ...

  10. Array.fill()函数的用法

    ES6,Array.fill()函数的用法   ES6为Array增加了fill()函数,使用制定的元素填充数组,其实就是用默认内容初始化数组. 该函数有三个参数. arr.fill(value, s ...