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. Linux高级命令

    重定向 重定向也称为输出重定向,用于将命令的输出保存到目标文件. 使用方法:> 文件名 或 >> 文件名.前者会覆盖文件内容,后者会追加内容到文件. 查看文件内容命令 cat: 显示 ...

  2. ansible(1)---师傅领进门

    背景 在企业里,运维需要配合开发进行产品上架,说白了就是把写好的代码上服务器.那么,就会出现这样的问题:需要运维人员配置好系统,配置好环境,配置好网络,配置好程序,配置好所有所有的依赖环境.     ...

  3. 打开ftp服务器上的文件夹时发生错误,请检查是否有权限访问该文件夹

    产生这种现象有很多方面的原因 如果你能用命令行的方式访问ftp服务器,但是不能用资源管理器访问,那么请看下去. 1.打开IE浏览器,点击设置 2.点击Internet选项,进入高级 3.取消勾选 大功 ...

  4. 半夜被慢查询告警吵醒,limit深度分页的坑

    分享是最有效的学习方式. 博客:https://blog.ktdaddy.com/ 故事 梅雨季,闷热的夜,令人窒息,窗外一道道闪电划破漆黑的夜幕,小猫塞着耳机听着恐怖小说,辗转反侧,终于睡意来了,然 ...

  5. hypernetwork在SD中是怎么工作的

    大家在stable diffusion webUI中可能看到过hypernetwork这个词,那么hypernetwork到底是做什么用的呢? 简单点说,hypernetwork模型是用于修改样式的小 ...

  6. 嵌入式测试手册——基于NXP iMX6ULL开发板(2)

    基于测试板卡:创龙科技TLIMX6U-EVM是一款基于NXP i.MX 6ULL的ARM Cortex-A7高性能低功耗处理器设计的评估板,由核心板和评估底板组成.核心板经过专业的PCB Layout ...

  7. Mybatis 总结ResultMap的复杂对象查询

    association:映射的是一个POJO类,处理一对一的关联关系 collection:映射的一个集合列表,处理的是一对多的关联关系 模版 <!--column不做限制,可以为任意表的字段, ...

  8. 容器技术Docker知识精讲【形成知识体系篇】

    作者的经验分享,包括很多实战过程和总结,为着手系统化学习Docker容器的朋友提供. 环境要求 Linux操作系统(Centos),建议在虚拟机VMware或VirtualBox下安装Centos D ...

  9. 1. CMake 概述

    1. CMake 概述 CMake 可以用来构建C/C++工程,可以跨平台.允许开发者指定整个工程的编译流程 在CMake 没有出来之前,开发者需要手写 makefile,但是不同平台下的 makef ...

  10. Windows在待机后重新进入桌面出现资源管理器无响应的解决方案

    问题 在日常使用Windows操作系统的过程中,我们可能会遇到一种较为特殊的情况--在系统待机后重新激活桌面时,资源管理器出现无响应现象.这一问题不仅影响用户体验,还可能导致剪切板功能异常,进而影响到 ...