数据库连接池
为什么需要使用数据库连接池?
普通的JDBC数据库连接(Connection
对象)使用DriverManager
来获取,每次向数据库建立连接的时候都要将Connection
加载到内存中,再验证用户名和密码(大概花费0.05s~1s的时间)。也就是说数据库的连接是比较昂贵的(创建成本比较大)。
需要数据库连接的时候,就想数据库请求一个,执行完后再断开连接。这样的方法将会消耗大量的资源和时间
数据库的连接资源并没有得到很好的重复利用,若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将会占用很多的系统资源,严重的甚至会造成服务器的崩溃
对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄露,最终将导致重启数据库
这种开发不能控制被创建的连接对象数,系统资源会被毫无顾忌的分配出去,如果连接过多,也可能导致内存泄露,服务器崩溃
数据库连接池的基本属性
1.连接池是直接和数据库服务器连接在一起的,所以连接池有连接数据库的四个基本信息
- 驱动名称
- url
- username
- password
2.其它的状态
- 初始化连接数 - 即连接池中先准备的
Connection
对象的数量 - 最大连接数 - 连接池中最多有多少个
Connection
对象 - 最小连接数 - 最少存在多少个
Connection
对象 - 最大的等待时间 - 最多使用多长时间来申请获取
Connection
对象,如果到时间还没获取到,则自动放弃
在Java中,连接池使用javax.sql.DataSource
接口来表示连接池。
DataSource(数据源)和连接池(Connection Pool)是同一个。注意:DataSource仅仅是一个接口,由各大服务器厂商来实现
常用的DataSource的实现:
- DBCP:Spring推荐
- C3P0:Hibernate推荐
- druid:阿里巴巴的连接池
使用连接池和不使用连接池的区别?
1.获取Connection对象
- 没有使用连接池:
Connection conn = DriverManager.getConnection(url, username, password);
- 使用连接池:
Connection conn = DataSource对象.getConnection();
2.释放Connection对象
- 没有使用连接池:是和数据库断开连接
- 使用连接池:是把
Connection
对象返还给连接池中,并没有和数据库服务器断开
DBCP连接池
DBCP(DataBase connection pool)数据库连接池是 apache 上的一个Java连接池项目。官网
参考:
c3p0连接池
c3p0连接池,是Hibernate推荐使用的连接池,该连接池已有接近10年没有更新了。官网
参考: