前戏--被面试官虐待的经历
来自面试官发自灵魂深处的拷问:说说你对连接池的理解;
一脸懵逼的我:“额~ ~ ~,连接池是把数据库的连接统一进行管理,做到连接复用的目的”;
咄咄逼人的面试官:“嗯,没错,还有呢? 说说连接池的原理”;
一脸懵逼的我:“还有吗?额~~,不清楚耶”;
咄咄逼人的面试官:“你简历上写着精通这,精通那,但我感觉你只是会用,连熟悉都说不上,是谁给你的自信来面试高级架构师职位的? 下次面试把简历写真实一点,回去吧!一会赶不上二路汽车了!”;
委屈的我: ↓
以上是博主之前真实的面试经历,一点都不夸张,每当面试官问了好几个问题都回答不上来的时候,你就能感受到面试官充满嫌弃的表情,而你又是一副走也不是,留也不是的尴尬局面,只能安静地坐在面试间被尽情的蹂躏;从这以后,我就发奋图强,势必要日后令人刮目相看,于是乎,在家日以夜继的学习,中国经过简单的半小时研究,终于让我掌握了数据库连接池的原理;
为什么要用连接池
要回答这个问题,我们先来了解一下以前的项目是怎样连接数据库的,在以前的项目,因为并发量较小, 所以每次请求都会创建一个连接,使用完之后在销毁连接,这样的小项目用起来似乎没什么太大影响;
但现在是什么时候啊?都21世纪了,人家并发量都是过亿级了,这样频繁地开启关闭连接,对数据库来说,都是极大的消耗,并且每次连接数据库是需要时间的,因为数据库许需要验证你的登录账号和密码,最终的影响就是会造成系统效率低下,响应速度慢,为了解决这一难题,数据库连接池就发明出来了,连接池的解决方案就是在系统启动时先创建好一定数据的连接,放在空闲线程池中,需要用到的时候从池中取出使用,用完之后在放回空闲线程池,空闲的连接就静静地躺在队列里面;这项技术极大地减少了连接数据库时的消耗,大大地减少了内存使用;最重要的是做到连接复用机制;池中的连接都由应用程序来管理,决定什么时候创建连接和释放连接;先看看一个大概的流程图,然后我们在细讲
线程池概念
- 空闲连接池 : 已创建的连接池,当后端需要访问数据库时,先判断空闲连接池有无可用的连接,如果有,会从空闲连接池中取出一个连接,变为活动连接,用完后会放回空闲连接池
- 活动连接池:正在使用的连接
- 最大连接数:最多能创建几个连接
详细流程
当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。具体流程走向如下图
传统连接和连接池区别
1、传统连接方式
传统连接方式是每一个请求就使用去连接一次数据库,以mysql为例,当服务器收到请求时,服务器就会开启一个连接,连到数据库。我们知道java代码连接数据库的时候使用的是http协议,首先需要建立tcp连接,然后再经过数据库的连接;最后才是执行sql语句,执行完后还得关闭数据库和http的连接;光连接的开销就不得了;下图是不使用连接池的流程图
2、连接池方式
当我们使用了连接池后,就可以省去又长又臭又重的http连接,因为连接已经启动好并且放在空闲线程里面了,所以我么们需要用的时候直接去队列里面取就好了,省去了大量连接的资源消耗;既节省了网络开销,又提升了响应速度,系统的性能成倍数提升;
连接池常用参数详解
1、initialSize
初始化连接数,也就是系统一开始启动时将会创建的连接数量;
2、MinIdle
最小连接数,也叫空闲连接池,当系统启用后,连接池中的数量将不少于 MinIdle 的数量;如果发现空闲线程池中的数量不足,那么会启用新的连接放入池中;
3、MaxActive
连接池最大连接数量,每次使用完连接都会判断池中的连接数是否超过最大连接数, 如果创建的连接数量达到最大连接数,将会回收剩余空闲的连接,确保不会超过最大连接数;
4、maxWait
获取连接时最大等待时间,单位毫秒。超时将抛出异常;
完
其实连接池还是比较简单的,如果你学过java的线程池,那么你会更容易理解连接池的原理,知道思路之后,相信大家肯定也可以自己手写一个连接池出来!