连接池介绍
创始人
2024-06-02 13:44:24
0

一、JDBC数据库连接池的必要性

1、在开发基于数据库的web程序时,传统的模式基本是按以下步骤:

(1)在主程序中建立数据库连接

(2)进行sql操作

(3)断开数据库连接

2、这种模式开发,存在的问题:

(1)普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用。若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。

(2)对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库

(3)这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。

二、数据库连接池技术

1、数据库连接池的基本思想:

就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

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

数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

三、多种开源的数据库连接池

1、JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口通常由web服务器(Weblogic, WebSphere, Tomcat)提供实现。也有一些开源组织实现的连接池框架,知名的如下:

(1)DBCP 是Apache提供的数据库连接池。tomcat服务器自带dbcp1.0数据库连接池。速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持,tomcat7开始重新开发高并发连接池取代了dbcp1.0。

(2)C3P0 是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以,hibernate官方推荐使用。

(3)BoneCP 是一个开源组织提供的数据库连接池,速度快。

(4)Druid 是阿里提供的数据库连接池,据说是集DBCP 、C3P0 、Proxool优点于一身的数据库连接池,但是速度不确定是否有BoneCP快。

(5)HikariCP是目前使用最广泛的连接池, (pronounced Hi-ka-lee)

2、DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池

3、DataSource用来取代DriverManager来获取Connection,获取速度快,同时可以大幅度提高数据库访问速度。

特别注意:

(1)数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。

(2)当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close();但conn.close()并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。

三、使用连接池

以HikariCP为例,要使用JDBC连接池,先添加HikariCP的依赖如下:

com.zaxxerHikariCP2.7.1

紧接着,我们需要创建一个DataSource实例,这个实例就是连接池:

HikariConfig config =newHikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/test");
config.setUsername("root");
config.setPassword("password");
config.addDataSourceProperty("connectionTimeout","1000");// 连接超时:1秒
config.addDataSourceProperty("idleTimeout","60000");// 空闲超时:60秒
config.addDataSourceProperty("maximumPoolSize","10");// 最大连接数:10
DataSource ds =newHikariDataSource(config);

注意创建DataSource也是一个非常昂贵的操作,所以通常DataSource实例总是作为一个全局变量存储,并贯穿整个应用程序的生命周期。

有了连接池以后,我们如何使用它呢?和前面的代码类似,只是获取Connection时,把DriverManage.getConnection()改为ds.getConnection():

try(Connection conn = ds.getConnection()){// 在此获取连接...}// 在此“关闭”连接

通过连接池获取连接时,并不需要指定JDBC的相关URL、用户名、口令等信息,因为这些信息已经存储在连接池内部了(创建HikariDataSource时传入的HikariConfig持有这些信息)。一开始,连接池内部并没有连接,所以,第一次调用ds.getConnection(),会迫使连接池内部先创建一个Connection,再返回给客户端使用。当我们调用conn.close()方法时(在try(resource){...}结束处),不是真正“关闭”连接,而是释放到连接池中,以便下次获取连接时能直接返回。

因此,连接池内部维护了若干个Connection实例,如果调用ds.getConnection(),就选择一个空闲连接,并标记它为“正在使用”然后返回,如果对Connection调用close(),那么就把连接再次标记为“空闲”从而等待下次调用。这样一来,我们就通过连接池维护了少量连接,但可以频繁地执行大量的SQL语句。

通常连接池提供了大量的参数可以配置,例如,维护的最小、最大活动连接数,指定一个连接在空闲一段时间后自动关闭等,需要根据应用程序的负载合理地配置这些参数。此外,大多数连接池都提供了详细的实时状态以便进行监控。

相关内容

热门资讯

小学三年级描写玫瑰花的作文【... 小学三年级描写玫瑰花的作文 篇一玫瑰花是我最喜欢的花之一。它是世界上最美丽的花朵之一,被誉为“花中皇...
三年级暑假作文:夏夜(经典6... 三年级暑假作文:夏夜 篇一夏夜的星空夏夜的星空美得像一幅画。当太阳落下地平线,天空渐渐暗下来的时候,...
三年级作文《可爱的小狗》(最... 三年级作文《可爱的小狗》 篇一可爱的小狗小狗是一种非常可爱的动物。它们有着软软的毛发和圆圆的大眼睛,...
我们的学校三年级作文六十个字... 我们的学校三年级作文六十个字 篇一我们的学校很美丽。校园里有很多树木和鲜花,四季都有不同的景色。教室...
美丽的海底世界三年级作文40... 篇一:美丽的海底世界海底世界真是美丽极了!在这里,我看到了各种各样奇特的鱼儿和珊瑚。我最喜欢的就是小...
三年级作文《有趣的游戏》范文... 三年级作文《有趣的游戏》范文 篇一有趣的游戏大家好!我是小明,今天我要给大家介绍一个非常有趣的游戏—...
小学三年级作文假期的生活50... 小学三年级作文假期的生活500字 篇一假期的生活假期来临了,我可是兴奋得不得了。因为这段时间,我可以...
三年级作文姥姥家的葡萄树【优... 三年级作文姥姥家的葡萄树 篇一姥姥家的葡萄树我家住在一个小镇上,每年暑假,我都会去姥姥家玩。姥姥家有...
小学三年级抗疫情作文300字 2020年小学三年级抗疫情作文300字  众志成城,万众一心,抗击疫情,共度难关,加油!下面是小编收...
小学三年级作文400字 【精华】小学三年级作文400字合集九篇  在平平淡淡的学习、工作、生活中,大家都不可避免地要接触到作...
小学三年级作文800字(优质... 小学三年级作文800字 篇一我最喜欢的动物我最喜欢的动物是猫。猫有一只灵活的身体,一双亮晶晶的大眼睛...
秋天的变化三年级作文【优选3... 秋天的变化三年级作文 篇一秋天的变化秋天是一个美丽而神奇的季节。在这个季节里,大自然的一切都在发生变...
2018世界杯足球赛作文三年... 2018世界杯足球赛作文三年级 篇一热闹的世界杯足球赛今年的夏天,全世界都沸腾了!因为2018世界杯...
可爱的灰仓鼠三年级优秀作文【... 可爱的灰仓鼠三年级优秀作文 篇一灰仓鼠是一种非常可爱的小动物,它们通常生活在森林或草地中。我非常喜欢...
三年级作文猴子下山【通用6篇... 三年级作文猴子下山 篇一猴子下山的故事,是我们小时候听过的经典故事之一。今天,我要给大家讲一个不同寻...
小学三年级作文我是妈妈的小助... 小学三年级作文我是妈妈的小助手 篇一我是妈妈的小助手我是一个小学三年级的学生,我有一个非常好的妈妈。...
三年级作文我当小家长400字... 三年级作文我当小家长400字作文大全 篇一作为三年级的小学生,我有着当小家长的责任和义务。今天,我要...
谁是我的老师作文三年级49篇... 谁是我的老师作文三年级49篇 篇一我亲爱的老师在我三年级的时候,我遇到了很多不同的老师。有的是我的班...
春节小学三年级作文300字(... 春节小学三年级作文300字 篇一快乐的春节春节是我最喜欢的节日。春节是中国最重要的传统节日,也是全家...
书的字述600字作文(优秀3... 书的字述600字作文 篇一:阅读的魅力阅读是一种独特的体验,它能够带我们进入一个全新的世界,让我们与...