Java技术栈 —— 手写Java数据库连接池

Java技术栈 —— 手写Java数据库连接池

  • 一、连接池的作用
  • 二、讲解
    • 1.1 类图结构
    • 1.2 ConnectionPoolManager
    • 1.3 DataSourceConfig
    • 1.4 ConnectionPool与IConnectionPool
    • 1.5 ConnEntry
  • 三、收获
    • 3.1 CopyOnWriteArrayList累的使用(对本文代码的一点建议和指正)
    • 3.2 AtomicInteger类的使用
    • 3.3 Java定时任务

一、连接池的作用

  • 资源重用
  • 更快的系统响应速度
  • 新的资源分配手段
  • 统一的连接管理,避免数据库连接泄露
一、参考文章或视频链接
本文代码来源:[1] 《Java手写系列》-纯手写数据库连接池
本文代码的CSDN下载地址 - 0积分
[2] 《尝试手写一个框架(三)如何自己手写一套数据库连接池?》
[3] 《Java手写实现Mysql连接池》
[4] 《基于JAVA源代码生成PlantUML类图》
[5] 首先在Ubuntu下安装graphviz
[6] 在IDEA中配置dot的可执行位置
[7] 讲的很好 UML类图关系 - 稀土掘金
[8] 使用UMLDoclet和PlantUML从源码生成UML类图

二、讲解

1.1 类图结构

本图由IDEA中的PlantUML插件生成。在这里插入图片描述

1.2 ConnectionPoolManager

我认为这实际上是一个工厂类。通过这个类,User可以不关注获取细节,直接进行getConnection()操作。

1.3 DataSourceConfig

连接池配置信息类,读取配置信息。

1.4 ConnectionPool与IConnectionPool

ConnectionPool是连接池对象本身,IConnectionPool是,与ConnectionPoolManager构成关联关系。

1.5 ConnEntry

将Connection与创建时间time,组成一个Entry对,我这里对参考文章里的名字做了修改,我觉得这样的命名更贴切。

三、收获

3.1 CopyOnWriteArrayList累的使用(对本文代码的一点建议和指正)

对于freeConnsuseConns,作者是用CopyOnWriteArrayList对他们进行存放的,这个类保证了线程的安全性,不会出现多个线程竞争的资源安全性问题。但是我认为作者明显有点过度设计了,他的很多方法如ConnectionPool.createConnConnectionPool.getPoolEntry已经加了synchronized关键字,就没必要再对freeConnsuseConns这些再包装一层CopyOnWriteArrayList了,但是我打包的代码还是带了,您可以自行改为ArrayList

    ArrayList<ConnEntry> useConns = new ArrayList<ConnEntry> (); //泛型到字节码层面会有一个泛型消除的概念,请知悉
    ArrayList<Connection> freeConns = new ArrayList<Connection> ();

通常,CopyOnWriteArrayList的使用场景是:存在多个线程同时进行读写操作,且读多写少,这样CopyOnWriteArrayList可以提供更好的并发性能。

3.2 AtomicInteger类的使用

我写过一篇文章,讨论过AtomicBoolean类,Atomicxx属于并发包中的原子操作类,并且能保证线程之间的资源可见性,CSDN会吞微信公众号链接,我把url也直接放出来,有Worker线程类与连接池ConnectionPool类同时对其进行读写的需求,这里的AtomicInteger类倒不算过度使用。

3.2 参考文章或视频链接
[1] 《竹花代码》- 李论实践公众号
https://mp.weixin.qq.com/s?__biz=Mzg5ODU3Nzc0MA==&mid=2247483998&idx=1&sn=3654fc3e2d047f14e322a5007d5d5a02&chksm=c061267df716af6bacab2e1c53cd685f41012562791bd90fd7cb1ac7d20996fda4d9a2612d6b&token=1372824197&lang=zh_CN#rd

3.3 Java定时任务

这个项目的一个收获就是掌握了如何使用Java的定时任务,实现一个Worker类继承TimeTask(TimeTask implements Runnable),那么Worker类就是一个线程类,实现了对应的run方法后,就可以实现在main线程以外运行,对连接池情况进行监听,然后再用java.util.Timer().schedule()方法,对Worker类实现定时调度,那么对连接池的定时扫描就做好了,这样就可以关闭超时未释放的连接归还到连接池中。
值得一提的是,很多心跳线程也是用这种方式实现的。[1]

一、参考文章或视频链接
本文代码来源:[1] Java’s Heartbeat Functionality

全文完。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/348983.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【嵌入式学习】C++QT-Day2-C++基础

笔记 见我的博客&#xff1a;https://lingjun.life/wiki/EmbeddedNote/19Cpp 作业 自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度…

css display 左右对齐 技巧

.list_number{ display: flex; } .list_name_number{ width:100px; } //左边固定width .list_name_type{ //右边给flex:2 自动撑开 flex:2; }

使用antd design pro 如何设置不使用全局基础模板,开发开放公共页面。

修改config目录下的routes&#xff0c; 在指定需要开放不使用全局模版的路径&#xff0c;多个路径可单独添加或者直接按照分级添加模式&#xff1a; 这样添加了还不行&#xff0c;因为模版本身除了user模块以外&#xff0c;其他路径都需要登陆后才能访问&#xff0c;但一般做p…

《微信小程序开发从入门到实战》学习九十三

7.1 视图容器组件 7.1.3 swiper与swiper-item组件 swiper组件的显示效果如下图所示&#xff1a; indicator-dots、indicator-color和indicator-active-color三个属性用于设置swiper组件下方的指示点。设置指示点的颜色时&#xff0c;可以使用HexColor&#xff0c;也可以使用r…

力扣算法-Day18

18.四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1…

linux 查找文件或查找内容 (find grep)

一 linux 查找包含指定内容的文件&#xff1a; 在linux 有时我们只我知道内容但不知道文件在哪&#xff0c;可以使用find 与grep查找 例1 要查找指定目录&#xff08;默认包含子目录&#xff09;文件内容包含 xxx 的文件 find /etc/ -type f -exec grep -l "mysql"…

通过一个 Spring 的 HelloWorld 引入 Spring 要点

目录 一. 前言 二. 设计一个 Spring 的 HelloWorld 2.1. 创建 HelloWorld 项目 2.2. 核心要点一&#xff1a;控制反转&#xff08;IOC&#xff09; 2.3. 核心要点二&#xff1a;面向切面&#xff08;AOP&#xff09; 三. Spring 框架如何逐步简化开发 3.1. Java 配置方式…

接入技术以及互联网架构

1. 接入技术 1.1 两种物理基础设施&#xff1a;有线和无线基础设施 有线基础设施包括铜线和光纤电缆。铜线和光纤是用来传输数据的物理介质&#xff0c;其中光纤以其高速度和大容量而闻名&#xff0c;而铜线则是一种更传统的技术。 无线基础设施则包括高点&#xff08;如专门建…

时序分解 | MATLAB实现CEEMDAN+SE自适应经验模态分解+样本熵计算

时序分解 | MATLAB实现CEEMDANSE自适应经验模态分解样本熵计算 目录 时序分解 | MATLAB实现CEEMDANSE自适应经验模态分解样本熵计算效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现CEEMDANSE自适应经验模态分解样本熵计算 包括频谱图 附赠案例数据 可直接运行 …

GPT微信机器人部署,集成gpt问答、dall e3绘画、midjourney以及新闻热搜、天气等丰富联网功能,免费入群体验!

GPT问答和midjourney作为AI届两大亮点&#xff0c;都各自有官方体验方式。 同时&#xff0c;也有很多大神搭建了各类软件、平台供用户体验使用。 但是如果同时将GPT问答和midjourney集合到日常最常使用的微信呢&#xff1f; 打造一个微信机器人&#xff0c;不仅自己可以随时…

vue3 21 数据大屏scale

数据类型 &#xff1f;&#xff1a;&#xff0c;有就指定 40.根据菜单动态生成路由&#xff0c;将路由放到store里 配置路由数据类型&#xff1a; 在template标签上做遍历的好处是&#xff0c;标签不会渲染到页面 菜单的递归&#xff08;Menu&#xff09;: 130数据大屏:

使用mapstruct实现对象拷贝

Mapstructs实现对象拷贝: 单个对象拷贝(默认只拷贝属性名和方法名都相同的值)&#xff0c;当属性名或者属性类型不同时可使用Mapping注解进行映射List拷贝List嵌套List拷贝 代码示例 import lombok.AllArgsConstructor; import lombok.Data; import org.mapstruct.Mapper; i…

Buffer Pool

Buffer Pool 概念free链表flush链表LRU链表chunk 概念 MySQL在启动时向操作系统申请的一片连续的内存&#xff0c;默认128M。然后将这块内存分为一个一个缓冲页(16KB&#xff0c;因为页就是16KB的)。再为每个缓冲页创建对应的控制块用于管理。比如第一次查询数据之后&#xff…

RockChip DRM Display Driver

资料来源: 《Rockchip_DRM_Display_Driver_Development_Guide_V1.0.pdf》 《Rockchip_Developer_Guide_DRM_Display_Driver_CN.pdf》 一:DRM概述 DRM(Direct Rendering Manager)直接渲染管理,buffer分配,帧缓冲。对应userspace库位libdrm,libdrm库提供了一系列友好的…

jmeter之接口测试实现参数化(利用函数助手),参数值为1-9(自增的数字)

1.前言 思考&#xff1a;为什么不用postman&#xff0c;用postman的话就得导入csv文件/json文件 如果不想导入文件&#xff0c;postman是实现不了&#xff0c;因为postman每次只会运行一次 2.jmeter函数助手实现参数化 &#xff08;1&#xff09;新建“线程组”--新建“http…

nginx安装ssl模块http_ssl_module

查看nginx安装的模块 /usr/local/nginx/sbin/nginx -V若出现“–with-http_ssl_module”说明已经安装过&#xff0c;否则继续执行下列步骤 进入nginx源文件目录 cd /usr/local/nginx/nginx-1.20.2重新编译nginx ./configure --with-http_ssl_module如果组件linux缺少&…

【投稿优惠|EI优质会议】2024年材料化学与清洁能源国际学术会议(IACMCCE 2024)

【投稿优惠|优质会议】2024年材料化学与清洁能源国际学术会议(IACMCCE 2024) 2024 International Conference Environmental Engineering and Mechatronics Integration(ICEEMI 2024) 一、【会议简介】 随着全球能源需求的不断增长&#xff0c;清洁能源的研究与应用成为了国际…

一文深度解读多模态大模型视频检索技术的实现与使用

当视频检索叠上大模型Buff。 万乐乐&#xff5c;技术作者 视频检索&#xff0c;俗称“找片儿”&#xff0c;即通过输入一段文本&#xff0c;找出最符合该文本描述的视频。 随着视频社会化趋势以及各类视频平台的快速兴起与发展&#xff0c;「视频检索」越来越成为用户和视频平…

Go语言指针变量

1. 指针变量 区别于C/C中的指针&#xff0c;Go语言中的指针不能进行偏移和运算&#xff0c;是安全指针。 Go语言中的指针3个概念&#xff1a;指针地址、指针类型和指针取值。 1.1. Go语言中的指针 Go语言中的函数传参都是值拷贝&#xff0c;当我们想要修改某个变量的时候&a…

Top Down - Fantasy Forest (HDRP)

适用于任何自上而下游戏的近180个风格化资产的强大集合!无论是RTS、MOBA、RPG还是Hacknslash,此包都可以让您制作完整而详细的自上而下关卡。 特点: 共计177个预制件和4个粒子效果 6 个可平铺的地形纹理 7 棵树模型 24个灌木丛、草地和植物 14个蘑菇 20个资源节点(金、铁、…