连接池组件分析

本文详细探讨了数据库连接池的设计思路,包括连接打开、连接管理策略和关闭过程,并通过代码示例展示了如何实现。稳定性分析部分展示了连接池在实际应用中的表现。关键词涉及数据库连接池、JDBC、连接复用、资源管理。

There is no stable job outside the system.
talk is cheap, show me the code,make a better result.

目录

在这里插入图片描述

概述

数据库连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。

需求:

连接池是常用的应用场景,连接池的工作原理主要由三部分组成,分别为
1.连接池的建立
2.连接池中连接的使用管理
3.连接池的关闭

设计思路

在这里插入图片描述

实现思路分析

1.连接打开

1.连接打开
连接打开意味着获取连接的过程。我们会申请连接,连接会从连接池中返回一个有效连接。
Java中提供了很多容器类可以方便的构建连接池,例如Vector、Stack等。

2.获得连接和链接管理

连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:

当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。

当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务

该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。

3.连接关闭

连接用完之后就会调用释放的方法。释放连接过程就是把连接放回连接池过程

拓展Demo实现

我们先实现一个基本的获取链接的过程:

相关代码如下:

// 获取数据库连接
		public Connection getConnection() {
			Connection conn = null;
			lock.lock();
			try {
				while (pool.size() < 0) {
					try {
						condition.await();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				if (!pool.isEmpty()) {
					System.out.println("复用链接");
					conn = pool.removeFirst();
				}
				System.out.println("新建链接");
				return conn;
			} finally {
				lock.unlock();
			}
		}
	
		// 释放数据库连接
		public void releaseConnection(Connection conn) {
			if (conn != null) {
				lock.lock();
				try {
					// 释放连接过程就是把连接放回连接池过程
					pool.addLast(conn);
					condition.signal();
					System.out.println("放回链接");
				} finally {
					lock.unlock();
				}
			}
		}

测试代码:


    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 20, 200, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(10));
        for (int i = 0; i < 20; i++) {
            AA a = new AA();
            executor.execute(a);
        }
    }
}


class AA extends Thread {
	
	private static final int INIT_CONNECTIONS = 10;
	private static final String DRIVER_CLASS = "";
	private static final String USERNAME = "root";
	private static final String PASSWORD = "root";
	private static final String URL = "jdbc:mysql://127.0.0.1:3306/abom";
    @Override
    public void run() {
    	
    	   try {
             main pool = new main();
          	Connection conn = (Connection) DriverManager.getConnection(URL, USERNAME, PASSWORD);
           
            System.out.println("得到conn:   " + conn);
         
				Thread.sleep(2000);
				
				  pool.releaseConnection(conn);
			} catch (InterruptedException  |SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
          
    }
}

效果:

在这里插入图片描述

稳定性分析:

利用JVM工具我们可以得出如下稳定性分析:链接稳定增长较为稳定。
在这里插入图片描述

小结:

主要讲述了连接池相关原理和简单实现,链接策略待实现,设计上里面有许多不足,请大家指正~

参考资料和推荐阅读

  1. 连接池简介及手写简单连接池.
  2. 理解数据库连接池底层原理之手写实现.
  3. Java-数据库系列(一)–JDBC链接数据库 手写连接池.
  4. 详解数据库连接池概念、原理、运行机制等.

欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

迅捷的软件产品制作专家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值