Database Connection Pool 数据库连接池-01-概览

拓展阅读

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

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

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

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

连接池的作用

资源重用

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

更快的系统响应速度

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

新的资源分配手段

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

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

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

中间件

常见实现对比

20180904-dbcp-compare.png

参考网上资料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.hqwc.cn/news/537828.html

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

相关文章

QT c++ 双精度数拆分和组合 Tool

本文描述QT c的双精度数拆分和合并&#xff0c;即双精度浮点数拆为四个16位无符号整数以及将四个16位无符号整数组合为双精度浮点数。 开发平台&#xff1a;win10QT6.2.4 MSVC2019 64 bit 在本文的最好列出了代码和可执行文件打包下载链接&#xff08;可直接使用&#xff09;…

国创证券|炒股有哪八不碰?

炒股存在以下八不碰&#xff1a; 1、散户多的个股不碰 散户较多&#xff0c;则阐明市场上的散户在不断地买入该股&#xff0c;主力在不断地卖出该股&#xff0c;筹码逐步从主力的手中流入散户的手中&#xff0c;这会引起市场上的投资者惊惧&#xff0c;大量地抛出手中的股票&…

maven打包把所有依赖的jar copy到一个文件夹

在maven项目中&#xff0c;是使用依赖坐标来引入jar包&#xff0c;在引入jar包的时候&#xff0c;maven也会默默的帮助我们导入这个jar包所依赖的jar包。 但是当我们打包项目使用jar包运行的时候&#xff0c;往往会出现缺少jar的情况&#xff1a; 如果我们一个一个添加缺少的…

Android系统 关于ntp的修改(网络时间同步)

一&#xff0c;现象&#xff1a; 1. NTP介绍 NTP&#xff1a;网络时间协议&#xff0c;英文名称&#xff1a;Network Time Protocol&#xff08;NTP&#xff09;是用来使计算机时间同步化的一种协议&#xff0c;它可以使计算机对其服务器或时钟源&#xff08;如石英钟&#x…

input输入框支持明文暗文切换

input输入框支持明文暗文切换 场景与思路实现 场景与思路 我们通常实现密码框的时候会直接使用 input ,设置它的 type 为 password&#xff0c;如果要实现明文和暗文的切换&#xff0c;实际上就是 type“text” 和 type"password"的切换。 实现 样式上我们可以先找…

Igraph入门指南 5

2、graph_from系列&#xff0c;将其他R数据结构转换成图 2-1 邻接矩阵转图&#xff1a;graph_from_adjacency_matrix 可以接受Matrix包创建的稀疏矩阵作为参数 邻接矩阵中行的顺序被保留&#xff0c;并作为图中顶点的顺序。 本函数几个重要的参数&#xff1a; weighted&am…

EPSON X1E000341003100 FA-238A石英晶体谐振器

EPSON X1E000341003100 FA-238A是一款无源晶振&#xff0c;具有特定的频率和尺寸规格。这款晶振的频率为20MHz&#xff0c;尺寸为3.20 x 2.50mm &#xff0c;这使得它非常适合用于小型化设计中。它的温度范围从-40℃到125℃&#xff0c;并且具有20ppm的频率稳定性&#xff0c;这…

软考高级:软件工程单元测试(驱动模块、被测模块、桩模块)概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

FX110网:1月美国零售货币资金环比上升2.61%,嘉盛环比上升1.86%

美国商品期货交易委员会&#xff08;CFTC&#xff09;发布的最新月度报告显示&#xff0c;2024年1月零售货币存款与上月相比上升2.61%。 这份报告涵盖在美国运营的注册零售货币对交易商&#xff08;RFED&#xff09;和经纪自营商。包括嘉信理财&#xff08;CHARLES SCHWAB Futu…

重学SpringBoot3-集成FreeMarker

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-集成FreeMarker 1. 添加 FreeMarker 依赖2. 配置 FreeMarker 属性&#xff08;可选&#xff09;3. 创建 FreeMarker 模板4. 编写控制器5. 运行应用程序F…

【Java/Image】给指定路径下图片反色并加上当前日期形式的水印

【需求】 从通达信软件截屏下来的K线图&#xff0c;在打印前需要反色&#xff0c;打印后需要手动加上当前日期&#xff0c;这些都可以由程序代替手工完成。 以下是期待的效果。 【关键点】 给图片反色用的是梯度法&#xff0c;这个在网络上已有成型代码&#xff1b; 给图片…

【考研学子必看 ★2024考研国家线及调剂策略(3)】

----------------------------------------------------------------------------------------------------- 考研复试科研背景提升班 教你快速深入了解掌握考研复试面试中的常见问题以及注意事项&#xff0c;系统的教你如何在短期内快速提升自己的专业知识水平和编程以及英语…