1、java连接池概念
-
背景
当我们需要进行数据库的相关操作时,需要先创建一个java.sql.Connection对象,但是创建该对象的资源消耗非常大,设想在Web应用中,为用户的每一个请求就操作一次数据库,当有10000个在线用户并发操作的话,就计算机而言,仅仅创建Connection对象不包括做业务的时间就要损耗很多时间,对性能要求严格的应用是不能容忍这种耗费的。
-
为什么如此浪费时间
创建一个java.sql.Connection对象的代价是如此巨大,是因为创建一个Connection对象的过程,在底层就相当于和数据库建立的通信连接,在建立通信连接的过程,消耗了这么多的时间,而往往我们建立连接后(即创建Connection对象后),就执行一个简单的SQL语句,然后就要抛弃掉,这是一个非常大的资源浪费!
-
解决方法,线程池
可以在创建了Connection对象,并操作完数据库后,可以不释放掉资源,而是将它放到内存中,当下次需要操作数据库时,可以直接从内存中取出Connection对象,不需要再创建了,这样就极大地节省了创建Connection对象的资源消耗。由于内存也是有限和宝贵的,这又对我们对内存中的Connection对象怎么有效地维护提出了很高的要求。我们将在内存中存放Connection对象的容器称之为 连接池(Connection Pool)。下面让我们来看一下MyBatis的线程池是怎样实现的。
2、你使用哪个连接池?
- 使用mybatis中的连接池
- 在想要了解数据库连接池原理之前需要了解一个Mybatis用来存放数据库连接池状态的类:PoolState、PooledConnection 以及 PooledDataSource 类属性以及之间的关系:
-
PoolState
- PoolState数据库连接池状态类、其内部有标识数据库连接池状态的各个属性、重点是两个属性:
List<PooledConnection> idleConnections
用于存放空闲状态的数据库连接。List<PooledConnection> activeConnections
用于存放活动状态的连接、也就是正在使用的数据库连接。 - PoolState内部持有一个DataSource引用、在PoolState被实例化时初始化、主要用于展示当前数据库连接的一些配置信息、比如用户名、密码等。
- PoolState数据库连接池状态类、其内部有标识数据库连接池状态的各个属性、重点是两个属性:
-
PooledConnection
- PooledConnection内部持有一个PooledDataSource、同样在PooledConnection被构造时实例化PooledDataSource、其中有两个属性
private long createdTimestamp; private long lastUsedTimestamp;
用来标识当前PooledConnection的创建时间和最后使用时间、用来判断此连接是否过期。
- PooledConnection内部持有一个PooledDataSource、同样在PooledConnection被构造时实例化PooledDataSource、其中有两个属性
-
PooledDataSource
- PooledDataSource 简单的线程安全的数据库连接池、对外提供数据库连接池功能。
3、知道哪些连接池
C3P0、DBCP、......
网友评论