Mybatis连接池学习心得
我们知道,在xml文件配置数据库连接时,常常用到的这么一个属性type,它有三个取值POOLED、UNPOOLED和JNDI
POOLED其实就是采用传统的javax.sql.DataSource规范中的连接池。
连接池是一个用于存储连接的容器,用完既还,而不是销毁。而这个容器是一个集合对象,而且必须是线程安全的,不能两个线程拿到同一个连接,而且必须实现队列的特性,先进先出。
当请求一个连接时,首先拿出去的是队列的第一个连接,也就是索引为0的连接
这时候,之前索引为1的连接变成0,以保证每次过来请求连接时都拿的是第一个索引的连接。
当连接用完归还时
它自动归还池中,并排到队列中的最后一位。
我们进到PooledDataSource源码中分析可以看到,它先进行判断是否有空闲的连接,如果有,那么就取出队列的第一个连接出来用。
如果没有空闲连接,那么判断活动连接是否已经超出设定的最大连接数,没超出则new一个连接出来使用。
如果空闲连接没有,活动连接也超出最大设置值,那么它就会把最老的那个连接拿过来重新使用。
使用连接池的好处
数据库连接池技术带来的好处:
1. 资源重用
由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增进了系统运行环境的平稳性(减少内存碎片以及数据库临时进程/线程的数量)。
2. 更快的系统响应速度
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。
3. 新的资源分配手段
对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,使用数据库连接池技术。设置某一应用最大可用数据库连接数,避免某一应用独占所有数据库资源。
4. 统一的连接管理,避免数据库连接泄漏