mysql通俗易懂的数据库连接池原理及模拟实现
什么是数据库连接池?
当系统使用JDBC技术访问数据库时会创建一个connection对象,而该对象的创建过程是非常消耗资源的,并且创建对象的时间也特别长,假设系统一天有1万次的访问量,那么一天就会有1万个connection对象被创建,这极大的浪费数据库的资源,而且可能造成数据库服务器内存溢出,宕机。
为了解决以上问题,就引入了数据库连接池,它主要用来分配、管理、释放数据库的连接。系统启动的时候,数据库连接池首先会创建若干个(该数量可配置)connection对象,并将这些对象放入池中,当系统需要connection对象时,
数据库连接池会从池中分配一个事先创建好的connection对象给系统,当系统使用完毕或超时后,数据库连接池会将该connection对象重新放入池中。
这样就减少了创建connection对象所耗费的资源和时间,可以提高数据库操作的性能。
下图为数据库连接池原理图:

模拟编写一个数据库连接池
因为要用到数据库,所以需要将之前编写的JDBC相关的代码和jar包拷贝过来,创建一个SimpleConnectionPool类,里面需要实现下面三个功能:
1. 初始化一个数据库连接池,并向里面添加10个数据库连接;
2. 从连接池中获取连接;
3. 当程序用完连接后,需要将该连接重新放入连接池中。
需要注意:数据库连接池要保证线程安全!
/**
* 1. 初始化一个数据库连接池,并向里面添加10个数据库连接;
* 2. 从连接池中获取连接;
* 3. 当程序用完连接后,需要将该连接重新放入连接池中。
*/
public class SimpleConnectionPool { //创建一个存放连接的池子,注意要保证线程安全
//因为要频繁的对数据库连接池取出和存放操作,所以使用LinkedList池子
public static LinkedList<Connection> pool = (LinkedList<Connection>) Collections.synchronizedList(new LinkedList<Connection>()); //在类加载后向数据库连接池中存放10个数据库连接
static { try {
for (int i = 0; i < 10; i++) {
Connection con = DBUtil.getConnection();
pool.add(con);
}
} catch (SQLException e) {
e.printStackTrace();
} } //从连接池中获取连接
public static Connection getConnectionFromPool(){
Connection con = null;
//判断池子中是否还有连接对象
if(pool.size()>0){
con = pool.removeFirst();
}else{
//此时说明数据库连接池中没有可用的连接了
throw new RuntimeException("服务器忙,请稍后再试");
}
return con;
} //当程序用完连接后,需要将该连接重新放入连接池中
public static void release(Connection con){
pool.addLast(con);
} }
public class DBUtil {
private static String driverClass="com.mysql.jdbc.Driver";
private static String url="jdbc:mysql://127.0.0.1:3306/map?useUnicode=true&characterEncoding=utf-8";
private static String userName="root";
private static String password="root";
static{
try {
//加载驱动
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(url, userName, password);
}
}
欢迎关注微信公众号【Java典籍】,收看更多Java技术干货!
▼微信扫一扫下图↓↓↓二维码关注

mysql通俗易懂的数据库连接池原理及模拟实现的更多相关文章
- Java数据库连接池原理与简易实现
1.什么是数据库连接池 我们现在在开发中一定都会用到数据库,为了提高我们的系统的访问速度,数据库优化是一个有效的途径.我们现在开发中使用数据库一般都要经历以下的四个步骤:(1)加载数据库的驱动类,(2 ...
- JAVA和C#中数据库连接池原理与应用
JAVA和C#中数据库连接池原理 在现在的互联网发展中,高并发成为了主流,而最关键的部分就是对数据库操作和访问,在现在的互联网发展中,ORM框架曾出不穷, 比如:.Net-Core的EFCore.Sq ...
- JDBC数据库连接池原理
JDBC是java数据库连接的简称.它是一种用于实行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口组成.其相关的API都在java.sql.*包下 ...
- Java中数据库连接池原理机制的详细讲解以及项目连接数据库采用JDBC常用的几种连接方式
连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式 ...
- 【MySQL】自定义数据库连接池和开源数据库连接池的使用
数据库连接池的概念 数据库连接背景 数据库连接是一种关键的.有限的.昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性 ...
- 数据库连接池原理 与实现(动脑学院Jack老师课后自己的练习有感)
第一步: 首先创建一个数据库连接池的接口: 数据库连接池接口有两个主要的方法,其中一个getConnection(); 通过数据库连接池返回给用户封装的数据库连接对象 createConnectio ...
- Java中数据库连接池原理机制的详细讲解
连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池(Resource Pool).该模式 ...
- Java中数据库连接池原理机制的详细讲解(转)
连接池的基本工作原理 1.基本概念及原理 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理.我们知道,对于共享资源,有一个很著名的设计模式:资源池 (Resource Pool).该模 ...
- DBCP数据库连接池原理分析
在比较大的项目中,需要不断的从数据库中获取数据,Java中则使用JDBC连接数据库,但是获取数据库的连接可是相当耗时的操作,每次连接数据库都获得 .销毁数据库连接,将是很大的一个开销.为了解决这种开销 ...
随机推荐
- 记一次 XxlRpcException:xxl-rpc request timeout at 超时问题
事件起因 昨天有同事找我到,说他搭建的 XXL-JOB 任务调度系统不能工作了,调用总是出错(服务端返回 500)希望我能帮忙处理一下,不过说实话我也没有搭建过 XXL-JOB 的经验,但是既然同事请 ...
- 【原】iOS开发进阶(唐巧)读书笔记(二)
第三部分:iOS开发底层原理 1.Objective-C对象模型 1.1 isa指针 NSObject.h部分代码: NS_ROOT_CLASS @interface NSObject <NSO ...
- Spark执行流程(转)
原文地址:http://blog.jobbole.com/102645/ 我们使用spark-submit提交一个Spark作业之后,这个作业就会启动一个对应的Driver进程.根据你使 ...
- [随机化算法] 听天由命?浅谈Simulate Anneal模拟退火算法
Simulate Anneal模拟退火算法,是一种用于得到最优解的随机化算法. 如果可以打一手漂亮的随机化搜索,也许当你面对一筹莫展的神仙题时就有一把趁手的兵器了. 这篇题解将教你什么?SA的基本思路 ...
- TCP UDP基本编程(一)
tcp udp均可以用来网络通信,在使用之前建议先搜索一下相关网络连接的基本知识,可以更好的理解和使用,tcp建议看下如下文章:https://blog.csdn.net/chuangsun/arti ...
- c# 保留两位小数点
保留两位小数点 由于简单的原因大家直接看代码块. using System; namespace HelloWorld { class Program { static void Main(strin ...
- 有关logistic(sigmoid)函数回归
在神经网络中,经常用到sigmoid函数,y = 1 / (1+e-x) 作为下一级神经元的激活函数,x也就是WX(下文,W以θ符号代替)矩阵计算结果. 这个函数通常用在进行分类,通常分为1或0的逻辑 ...
- C/C++顺序数据结构——动态数组测试
这是一篇顺序表数据结构——动态数组的测试, 实现 //初始化数组 //插入 //根据位置删除 //根据值删除 //查找 //打印 //释放动态数组的内存 //清空数组 //获得动态数组容量 //获得动 ...
- python学习之【第十七篇】:Python中的面向对象(类和对象)
1.什么是类和类的对象? 类是一种数据结构,我们可以用它来定义对象,后者把数据值和行为特性融合在一起,类是现实世界的抽象的实体以编程形式出现.实例是这些对象的具体化.类是用来描述一类事物,类的对象指的 ...
- windows下如何安装Python虚拟环境
1.前言 由于Python的版本众多,还有Python2和Python3的争论,因此有些软件包或第三方库就容易出现版本不兼容的问题. 通过 virtualenv 这个工具,就可以构建一系列虚拟的Pyt ...