Database Connection Pool 数据库连接池-01-概览及简单手写实现

拓展阅读

第一节 从零开始手写 mybatis(一)MVP 版本。

第二节 从零开始手写 mybatis(二)mybatis interceptor 插件机制详解

第三节 从零开始手写 mybatis(三)jdbc pool 从零实现数据库连接池

第四节 从零开始手写 mybatis(四)- mybatis 事务管理机制详解

连接池的作用

资源重用

由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上, 另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。

更快的系统响应速度

数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。 对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。

新的资源分配手段

对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,使用数据库连接池技术。 设置某一应用最大可用数据库连接数,避免某一应用独占所有数据库资源。

统一的连接管理,避免数据库连接泄漏

在较为完备的数据库连接池实现中,可根据预先设定的连接占用超时时间,强制收回被超时占用的连接。 从而避免了常规数据库连接操作中可能出现的资源泄漏(当程序存在缺陷时,申请的连接忘记关闭,这时候,就存在连接泄漏了)。

中间件

常见实现对比

参考网上资料Druid > TomcatJDBC > DBCP > C3P0,BoneCP 的性能方面没有深入比较,应该和 Tomcat Jdbc 差不多。

对于小型的系统,并发压力不大时,选择哪一种数据库连接池差别不会很大,主要考虑的应该是连接池的稳定性。

当并发量较高时,一般不会选择使用 DBCP 和C3P0,选 Druid 是较好的。

手动实现

自己实现一个简化版,便于理解原理。

  • 连接池接口
public interface IPool {/*** 获取新的数据库链接* @return 数据库链接*/PoolConnection getPoolConnection();
}

其中 PoolConnection 如下:

public class PoolConnection {/*** 是否繁忙*/private volatile boolean isBusy;/*** 数据库链接信息*/private Connection connection;
}
  • 核心实现
public class PoolImpl implements IPool {/*** 数据库驱动*/private final String jdbcDriver;/*** 数据库连接*/private final String jdbcUrl;/*** 数据库用户名*/private final String username;/*** 数据库密码*/private final String passowrd;/*** 连接池大小*/private final int size;/*** 数据库连接池列表*/private List<PoolConnection> poolConnections = new ArrayList<>();public PoolImpl(String jdbcDriver, String jdbcUrl, String username, String passowrd, int size) {this.jdbcDriver = jdbcDriver;this.jdbcUrl = jdbcUrl;this.username = username;this.passowrd = passowrd;this.size = size;init();}private void init() {try {//1. 注册数据库连接信息Driver sqlDriver = (Driver) Class.forName(jdbcDriver).newInstance();DriverManager.registerDriver(sqlDriver);//2. 初始化连接池initConnectionPool();} catch (InstantiationException | IllegalAccessException | SQLException | ClassNotFoundException e) {e.printStackTrace();}}/*** 初始化链接* @throws SQLException sql 异常*/private void initConnectionPool() throws SQLException {for(int i = 0; i < size; i++) {Connection connection = DriverManager.getConnection(jdbcUrl, username, passowrd);PoolConnection poolConnection = new PoolConnection(false, connection);poolConnections.add(poolConnection);}}@Overridepublic PoolConnection getPoolConnection() {if(poolConnections.size() <= 0) {return null;}PoolConnection poolConnection = getRealConnection();while (poolConnection == null) {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}poolConnection = getRealConnection();}return poolConnection;}/*** 获取数据库链接对象* @return 数据库链接对象*/private synchronized PoolConnection getRealConnection() {for(PoolConnection poolConnection : poolConnections) {// 寻找不处于繁忙状态的连接if(!poolConnection.isBusy()) {Connection connection = poolConnection.getConnection();// 测试当前连接是否有效try {if(!connection.isValid(5000)) {Connection validConnection = DriverManager.getConnection(jdbcUrl, username, passowrd);poolConnection.setConnection(validConnection);}} catch (SQLException e) {e.printStackTrace();}// 设置为繁忙poolConnection.setBusy(true);return poolConnection;}}return null;}
}
  • 线程池管理类

使用单例

public class PoolManager {/*** 连接池持有类*/private static class PoolHolder {private static String url = "";private static String driver = "";private static String username = "";private static String password = "";private static int size = 10;private static IPool poolImpl = new PoolImpl(driver, url, username, password, size);}/*** 内部类单利模式产生使用对象* @return 单例*/public static IPool getInstance() {return PoolHolder.poolImpl;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react 综合题-旧版

一、组件基础 1. React 事件机制 javascript 复制代码<div onClick{this.handleClick.bind(this)}>点我</div> React并不是将click事件绑定到了div的真实DOM上&#xff0c;而是在document处监听了所有的事件&#xff0c;当事件发生并且冒泡到document处的时候&a…

print(response, flush=True),这里面的flush是什么意思

print(response, flushTrue),这里面的flush是什么意思 在Python中&#xff0c;flushTrue 参数用于强制立即刷新输出缓冲区。当你打印&#xff08;使用 print 函数&#xff09;内容到控制台时&#xff0c;Python 通常会将输出缓存起来&#xff0c;并在缓冲区满或者遇到换行符时…

淘宝怎么把好评改为差评

在淘宝购物时&#xff0c;我们有时会因为某些原因想要将原来的好评改为差评。本文将为您介绍如何将淘宝的好评改为差评。 一、登录淘宝账号 首先&#xff0c;您需要使用淘宝账号登录到淘宝平台。确保您已经登录到自己的账号。 二、找到订单并进入评价管理页面 1. 进入“我的…

Facebook:连接世界的社交巨人

在当今数字化时代&#xff0c;Facebook作为全球最大的社交媒体平台之一&#xff0c;扮演着连接世界的重要角色。它不仅仅是一个社交网站&#xff0c;更是一个数字化的社交生态系统&#xff0c;影响着全球数十亿用户的生活和交流方式。本文将深入探讨Facebook的起源、用户规模和…

FreeRTOS操作系统学习——资源管理

资源管理 在实际的项目中&#xff0c;我们总是会遇到一些临界资源的访问&#xff0c;虽然可以用互斥量实现对资源的互斥访问&#xff0c;但是如果要实现安全的独占式单线程地访问临界资源&#xff0c;可以通过屏蔽/使能中断、暂停/恢复调度器等方法实现。 屏蔽中断 屏蔽中断…

uniapp——第1篇:基于vue语法的、比原生开发屌的小程序开发

前提&#xff0c;建议先学会前端几大基础&#xff1a;HTML、CSS、JS、Ajax&#xff0c;还有一定要会Vue!&#xff08;Vue2\Vue3&#xff09;都要会&#xff01;&#xff01;&#xff01;不然不好懂 博主作为大二前端小白&#xff0c;刚刚接触前端微信小程序开发时选择的是基于“…

electron + vtkjs加载模型异常,界面显示类似于图片加载失败的图标

electron vtkjs加载模型显示异常&#xff0c;类似于图片加载失败的效果&#xff0c;如上图。 electron开发版本&#xff1a;13。 解决方法&#xff1a;升级electron版本号。 注意&#xff1a;win7最高兼容electron 22版本。

多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测

多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测 目录 多维时序 | Matlab实现VMD-CNN-GRU变分模态分解结合卷积神经网络门控循环单元多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现VMD-CN…

c++指针的定义和使用

1、定义一个指针 int a10; //定义指针的语法&#xff1a;数据类型 * 指针变量名&#xff1a;int * p&#xff1b; //让指针记录变量a的地址&#xff1a;p &a; int a 10;int* p; p &a; cout << "a的地址为&#xff1a;" << &a <<…

Spring IOC和AOP

IOC&#xff08;Inverse of Control 控制反转&#xff09; 是一种设计思想&#xff0c;而不是一个技术实现。描述的是&#xff1a;Java开发领域对象的创建及管理问题。 如&#xff1a;现有类A依赖于B 传统开发方式&#xff1a;在类A中手动通过new关键字来new一个B对象出来使…

第二十二节 Java 流(Stream)、文件(File)和IO

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。 Java.io 包中的流支持很多种格式&#xff0c;比如&#xff1a;基本类型、对象、本地化字符集等等。 一个流可以理解为一个数据的序列。输入流表示从一个源读取数据&#xff0c;输出流…

基于ElasticSearch的海量AIS数据存储方法

文章目录 引言I 基于ElasticSearch的海量AIS数据存储方法1.1 关键点1.2 在Elasticsearch(ES)中存储船舶轨迹数据1.3 数据迁移工具:CanalII AIS信息项引言 船舶数据服务器,用来存储从来自全球各地AIS接收到的船舶实时动态数据。服务器自动将二进制的AIS数据流,通过标准的A…

社区居民医疗健康系统 微信小程序

设计原则 本社区健康医疗APP采用 Hbuildex技术&#xff0c;使用Java语言开发&#xff0c;充分保证了系统稳定性、完整性。 社区健康医疗APP的设计与实现的设计思想如下&#xff1a; &#xff08;1&#xff09;操作简单方便、系统界面安全良好、简单明了的页面布局、方便查询相…

GPT-4.5 Turbo意外曝光,最快明天发布?OpenAI终于要放大招了!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

【计算机网络篇】计算机网络的定义和分类

文章目录 &#x1f354;什么是计算机网络&#x1f5c3;️计算机网络的分类⭐按交换方式分类⭐按使用者分类⭐按传输介质分类⭐按覆盖范围分类⭐按拓扑结构分类 &#x1f6f8;小结 &#x1f354;什么是计算机网络 计算机网络是指将多台计算机或其他网络设备通过通信链路连接起来…

汇编语言程序设计 第2章:8086指令系统简介及寻址方式

文章目录 1. 指针的分类及格式1.1 指令的分类1.2 指令格式 2. 寻址方式MOV指令简介2.1 立即寻址2.2 寄存器寻址2.3 直接寻址2.4 寄存器间接寻址2.5 寄存器相对寻址2.6 基址变址寻址2.7 相对基址变址寻址 3. 数据传送指令3.1 通用数据传送指令3.2 地址传送指令&#xff08;LEA、…

C语言黑魔法第三弹——动态内存管理

本文由于排版问题&#xff0c;可能稍显枯燥&#xff0c;但里面知识点非常详细&#xff0c;建议耐心阅读&#xff0c;帮助你更好的理解动态内存管理这一C语言大杀器 进阶C语言中有三个知识点尤为重要&#xff1a;指针、结构体、动态内存管理&#xff0c;这三个知识点决定了我们…

C语言pthread使用互斥锁及条件变量的跨进程多生产多消费模型

创作灵感: 格局要打开,进程也要打开,看看进程外的世界 代码描述: 1 此代码基于一个: 使用互斥锁及条件变量的线程间生产消费模型 该模型使用粗粒度锁 将整个生产或消费过程锁住 直到生产满 或 消费空 才使用条件变量通知对方 在唤醒后执行检查 只有仓库全满 或 仓库全空…

java实现快速排序的方法

算法概念 快速排序&#xff1a;通过一趟排序将待排记录分隔成独立的两个部分&#xff0c;其中一部分记录的数据均比另一部分的数据小&#xff0c;则可分别对这两部分记录继续进行排序&#xff0c;以达到整个序列有序。 快速排序的最坏运行情况就是O&#xff08;n^2&#xff09…

手把手教你打造研究生个人简历模板|轻松驾驭简历设计

在简历设计中&#xff0c;如何展现自己的学历优势&#xff0c;是很多学生困扰的问题。 下面&#xff0c;我们首先从即时设计中分享一些不同风格的研究生简历模板。 风格多样的免费简历设计模板https://js.design/community?categorysearch&search%E7%AE%80%E5%8E%86&…