为什么需要使用数据库连接池
-
普通的JDBC数据库连接(Connection对象) 使用
DriverManger
获取,每次向数据库建立连接的时候都要将 Connection 加载到内存,在验证用户名和密码(得花费0.05S-1S的时间) ----> 建立JDBC连接得开销是很大的 -
需要数据库连接的时候,就向数据库获取一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。
-
对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。
-
这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃.
连接池图解
连接池中的Connection对象 预先存在吗?
- 应用启动成功之后,就在连接池中预先存储5个Connection对象,就像你去火车站买票,是你去了火车站就有卖票窗口,还是去了火车站给你现场搭建卖票窗口
初始连接数:
- 你去火车站买票时,卖票窗口就已经存在了。
最大连接数:
- 春运期间,去火车站买票的人很多,既有的窗口已经无法满足买票需求,就会新增窗口,但是新增窗口是有上限的,并不是无限新增,设置最多新增数20,即同时最多只能有20个窗口卖票。
- 连接池初始化时只有5个连接对象,将最大连接数设置为20个。当5个客户端 占有了5个连接对时,连接池中就没有连接对象了,这时第6个客户端,第7个客户端来获取连接对象时,就会在为它们新增2个连接对象,但是最多只能有20个
最小连接数:
- 在不是旅游高峰期和春运时,买票人不是很多,尤其是在凌晨时,没有必要开5个卖票窗口,这时可以关闭3个窗口。只留下两个窗口
最大等待时间:
- 当20个连接对象都被占有时,设置一个最大等待时间,如果过了最大等待时间,则提示系统繁忙
最大连接时间 :
- 避免占着茅坑不拉屎情况,如果20个 连接对象都被获取,而这20个连接一直什么都不做,也不归还连接对象,这样后边的客户端将陷入无须等待
连接池得最大好处:重复利用了每一个Connection对象,节省了性能开销
连接池概述
在Java中,使用 javax.sql.DataSource 接口来表示连接池/数据源
注意:DataSource 和 JDBC 一样仅仅是一个接口,由各大服务器厂商来实现
常用的DataSource 的实现
- C3P0:Hibernate 推荐,但是该连接池在07年之后就不在更新了,不建议使用:性能差
- DBCP:Apache 组织的项目,Spring推荐
- Druid::阿里巴巴的项目(又称德鲁伊),号称宇宙第一强,性能超群,世界上最好的连接池
使用连接池和不使用连接池的区别在哪里?
- 如何获取连接对象
- 没有使用连接池则通过DriverManager 来获取,直接从DBMS 连接
- 使用连接池则直接通过连接池获取 (DataSource对象.getConnection())
- 释放连接对象
- 没有连接池:conn.close()直接和数据库服务器断开连接
- 存在连接池:conn.close()是把Connection对象归还给连接池,并没有断开与数据库服务器的连接
不同的连接池创建DataSource 对象的方法和配置不一样,操作连接池最重要的是如何获取DataSource对象