【修真院java小课堂】jdbc连接池原理及分析
大家好,我是IT修真院郑州分院第8期的学员,一枚正直纯洁善良的JAVA程序员。今天给大家分享一下,修真院官网JAVA任务一,拓展的知识点——jdbc连接池原理及分析。
1.背景介绍
为什么需要连接池?
最原始的数据库连接就是我们打开一个连接,使用过后再关闭该连接来释放资源。数据库连接是一种关键的有限的昂贵的资源,频繁的新建、打开、关闭连接 对jvm和数据库都有一定的资源负荷,尤其是应用压力比较大的时候,占用过多的资源容易产生性能问题。所以引入数据库连接池。
2.知识剖析
连接池使用原理
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
具体点说,在普通的数据库访问程序中,真正操作数据库的对象 得到的连接 是物理连接,调用连接对象的close()方法将关闭物理连接。而采用连接池技术,真正操作数据库的对象 得到的连接 是连接池中已经建立好的物理连接的一个句柄,调用连接对象的close()方法,物理连接并没有关闭。
3.常见连接池
dbcp:是java数据库连接池的一种,由Apache开发,通过数据库连接池,可以让程序自动管理数据库连接的释放和断开。
c3p0:是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。
两者最大的区别:dbcp需要手动释放资源,c3p0可以自动回收连接。dbcp效率高,稳定性差一点;c3p0稳定性好
4.常见问题
1.连接池的分配与释放
对于连接的管理可使用空闲池。即把已经创建但尚未分配出去的连接按创建时间存放到一个空闲池中。每当用户请求一个连接时,系统首先检查空闲池内有没有空闲连接。如果有就把建立时间最长(通过容器的顺序存放实现)的那个连接分配给他(实际是先做连接是否有效的判断,如果可用就分配给用户,如不可用就把这个连接从空闲池删掉,重新检测空闲池是否还有连接);如果没有则检查当前所开连接池是否达到连接池所允许的最大连接数(maxconn)如果没有达到,就新建一个连接,如果已经达到,就等待一定的时间(timeout)。如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户,如果等待时间超过预定时间timeout 则返回空值(null)。系统对已经分配出去正在使用的连接只做计数,当使用完后再返还给空闲池。
对于空闲连接的状态,可开辟专门的线程定时检测,这样会花费一定的系统开销,但可以保证较快的响应速度。也可采取不开辟专门线程,只是在分配前检测的方法。
2.连接池的配置与维护
连接池中到底应该放置多少连接,才能使系统的性能最佳?
系统可采取设置最小连接数(minconn)和最大连接数(maxconn)来控制连接池中的连接。最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应起来却慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。最大连接数是连接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过反复测试,找到最佳点。
5.扩展思考
什么情况下不适合使用连接池?
如果应用程序具有下列特征就不适合使用连接池,实际上,在这些应用程序上强制使用连接池反而会导致性能下降:
1.应用程序每天会重新启动多次:这通常出现在没有使用应用程序服务器的架构中,依赖于连接池的配置,应用程序每次启动时可能都会向连接池写入一条记录,这样反而增加了连接池的系统开销;
2.单用户应用程序,如果应用程序只需要为一个用户建立一个连接,这个时候使用连接池就显得多余了;
6.参考文献
https://blog.csdn.net/shuaihj/article/details/14223015
https://www.cnblogs.com/yizhixiaocaiji/p/4205933.html
https://www.jianshu.com/p/702e8659513b
7.更多讨论
1. 连接使用完毕是直接释放还是存在连接池中?
答:如果该连接是超出最小连接数后申请的连接,那么当该连接使用完后,释放之后,经过一定的时间之后会断开物理连接
如果该连接是在最小连接数范围之内的连接,那么该连接的释放只是把连接还给了连接池,物理连接并没有断开。
2.最大连接数是不是在mysql允许范围内越打越好?
答:首先,根据应用程序的需求,如果应用程序不需要建立较多连接,那么就不必要设置过多的连接
其次,根据服务器的性能,如果最大连接数消耗的资源已经超出了服务器能提供的资源,那么服务器会炸的。
所以,最大连接数是要综合考虑应用场景设置的
4.数据库连接池中的连接在空闲时会一直存在么?
答:dbcp和c3p0都有8小时内无请求断开连接的机制。所以如果空闲时间超过8小时,连接就不存在了。
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~
技能树.IT修真院
“我们相信人人都可以成为一个工程师,现在开始,找个师兄,带你入门,掌控自己学习的节奏,学习的路上不再迷茫”。
这里是技能树.IT修真院,成千上万的师兄在这里找到了自己的学习路线,学习透明化,成长可见化,师兄1对1免费指导。快来与我一起学习吧~
我的邀请码:22140638,或者你可以直接点击此链接:http://www.jnshu.com/login/1/22140638
网友评论