MyBatis使用连接池
什么是连接池?
通俗来讲,连接池就是用于存储连接的容器
容器其实就是一个集合对象,该集合必须是线程安全的,不能两个线程拿到同一个连接;该集合还必须实现队列的特性-先进先出.
我们在实际的开发中都会使用连接池,因为他可以减少我们获取连接所消耗的时间.
MyBatis中的连接池
MyBatis中的连接池提供了三种方式的配置
配置的位置 :
- 主配置文件sqlMapConfig.xml中的DataSource标签,type属性就是表示采用何种连接方式
type属性的取值 :
- POOLED : 采用传统的javax.sql.DataSource规范中的连接池,MyBatis中有针对规范的实现;对应的实现类是PooledDataSource
- UNPOOLED : 采用传统的获取连接的方式,虽然也实现了javax.sql.DataSource接口,但是没有采用池的思想,也就没有上面说到的容器的概念,而是一种需要就申请的情况;对应的实现类是UnpooledDataSource
- JNDI : 采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到的DataSource是不一样的,如果不是web或者maven的war工程是不能使用的;Tomcat采用的是dbcp连接池.
PooledDataSource获取连接过程分析
PooledDataSource是采用连接池的方式,如前面所说.连接池是一个线程安全的容器,不过在这个类中存在两个池对象,分别为空闲池和活动池.
空闲池中存放的是还没有被使用的连接对象;活动池存放的是正在使用的对象,他们都是ArrayList类型的(实际上是一个队列).
在使用PooledDataSource获取连接的过程会进行如下操作.
- 线程获取连接,会先检查空闲池是否还有可用连接对象,如果有,直接来拿用即可,如果没有,跳到步骤2
- 查看活动池是否已满,如果未满,new一个新的连接对象,加入池中(入队),并且返回,如果已满,进入步骤3
- 选择最老的连接对象(下标为0的那个),清理这个对象的信息,完毕后将它返回
需要注意的是,上面的操作必须保证线程安全,所以将上面的操作放在同步代码块中(synchronized修饰)
实际开发中我们也是使用连接池的方式.