对于ORM(Object Relational Mapping)框架而言,数据源的组织是一个非常重要的一部分,这直接影响到框架的性能问题。本文将通过对MyBatis框架的数据源结构进行详尽的分析,并且深入解析MyBatis的连接池。
本文首先会讲述MyBatis的数据源的分类,然后会介绍数据源是如何加载和使用的。紧接着将分类介绍UNPOOLED、POOLED和JNDI类型的数据源组织;期间我们会重点讲解POOLED类型的数据源和其实现的连接池原理。
MyBatis将数据源分为三种类型:
- unpooled,不使用连接池的数据源
- pooled,使用连接池的数据源
- JNDI,使用JNDI实现的数据源
相关的类分别在以下路径中:
org.apache.ibatis.datasource.unpooled
org.apache.ibatis.datasource.pooled
org.apache.ibatis.datasource.jndi
不使用连接池
每次获取连接的时候都需要新建。
1 | //unpooled数据源 |
使用连接池
对于pooled数据源,它有两个队列:空闲队列和活跃队列。
空闲队列中保存的是空闲的连接,活跃队列中保存的是正在被使用的连接。
当我们需要获取连接时,会按照以下步骤获取:
从空闲队列中获取连接;
空闲队列为空,则去查看活跃队列:
活跃队列未满,则新建连接并放入活跃队列;
活跃队列满,则挑选最早的连接查看是否过期:
最早的连接已过期,替换掉该连接;
最早的连接未过期,线程阻塞,等待唤醒。
1 | //pooled数据源,代码经过简化 |