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的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序 ...
随机推荐
- 什么是JDBC的最佳实践?
a.数据库资源是非常昂贵的,用完了应该尽快关闭它.Connection, Statement, ResultSet等JDBC对象都有close方法,调用它就好了. b.养成在代码中显式关闭掉 ...
- 企业快速落地IT服务管理体系的六大关键步骤
许多企业在实施信息化战略时,一味地追求"技术高消费"而忽视了对信息技术的管理和内部业务流程的变革,侧重点仍然只是事后的技术支持和故障解决方面,随着企业对于信息技术的依赖程度的加重, ...
- caddy 服务器的 Docker 镜像构建流程
构建一个包含 Caddy 服务器的 Docker 镜像,关键部分: https://github.com/caddyserver/caddy-docker/blob/master/Dockerfile ...
- 【原创】EtherCAT主站IgH解析(二)-- Linux/Windows/RTOS等多操作系统IgH EtherCAT主站移植指南
版权声明:本文为本文为博主原创文章,转载请注明出处.如有问题,欢迎指正.博客地址:https://www.cnblogs.com/wsg1100/ 前言 目前,EtherCAT商用主站有:Aconti ...
- Spring Boot 整合 Fisco Bcos(部署、调用区块链合约)
简介 在上一节,介绍了Spring Boot 整合 Fisco BCOS的最最基础的案例(SpringBoot成功连接Fisco BCOS,并访问其节点网络 --> 文章链接). 本节,咱们继续 ...
- Freertos学习:07-队列
--- title: rtos-freertos-07-队列 EntryName : rtos-freertos-07 date: 2020-06-23 09:43:28 categories: ta ...
- 『vulnhub系列』Hack Me Please-1
『vulnhub系列』Hack Me Please-1 下载地址: https://www.vulnhub.com/entry/hack-me-please-1,731/ 信息搜集: 使用nmap进行 ...
- Nuxt3 的生命周期和钩子函数(十)
title: Nuxt3 的生命周期和钩子函数(十) date: 2024/6/30 updated: 2024/6/30 author: cmdragon excerpt: 摘要:本文详细介绍了Nu ...
- Python pip 切换为国内镜像源
参考文章:https://codeplayer.vip/p/j7tmc [windows] 备份记录指令:(永久全局设置pypi国内镜像源地址) 1 pip config --global set g ...
- Java子类是否能继承父类上的注解
子类可以继承到父类上的注解吗? 在编写自定义注解时,可以通过指定@Inherited注解,申明自定义注解是否可以被继承:@Inherited只能实现类上的注解继承. 实现情况可细分为以下几种 未申明@ ...