前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mybatis入门 连接池介绍与分类 Mybatis使用POOLED UNPOOLED配置连接池的原理分析

Mybatis入门 连接池介绍与分类 Mybatis使用POOLED UNPOOLED配置连接池的原理分析

原创
作者头像
韦恩少爷的背
修改2020-02-24 10:36:46
3.2K0
修改2020-02-24 10:36:46
举报
文章被收录于专栏:SSM框架学习

一、连接池

1.概念:其实就是一个容器(集合),存放数据库连接的容器。

当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器

容器其实就是一个集合对象,该集合必须是线程安全的,不能两个线程拿到统一连接

该集合还必须实现队列的特性:先进先出

2.好处:

​ 1.节约资源

​ 2.用户访问高效

3.实现:

1.标准接口:DataSource javax.sql包下的

​ 1.方法:获取连接

​ 获取连接:getConnection()

​ 归还连接:Connection.close()如果连接对象Connection是从连接池中获得的,那么调用Connection.close()方法,则不会再关闭连接了。而是归还连接

2.一般我们不去实现它,有数据库厂商来实现

​ 1.C3P0:数据库连接池技术

​ 2.Druid:数据库连接池实现技术,由阿里巴巴提供的

二、Mybatis连接池

Mybatis 中也有连接池技术,但是它采用的是自己的连接池技术。

有三种方式的配置:

配置的位置:

在Mybatis的主配置文件SqlMapConfig.xml 配置文件中的dataSource标签,type属性就是表示采用何种连接池方式。

代码语言:javascript
复制
type属性的取值:
	POOLED			传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现
	UNPOOLED		采用传统的获取连接的方式,虽然也实现了javax.sql.DataSource接口,但是并没有使用池的思想
	JNDI			采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到的dataSource是不同的。
					注意:如果不是web或者maven的war工厂,是不能使用的。
					经常使用的tomcat服务器,采用连接池就是dbcp连接池

三、POOLED与UNPOOLED结果对比

POOLED

从池中取一个连接使用

在这里插入图片描述
在这里插入图片描述

UNPOOLED

每次都会创建一个新的连接

创建了用完就关闭 渣男

在这里插入图片描述
在这里插入图片描述

四、POOLED与UNPOOLED代码比较

MyBatis内部分别定义了实现了java.sql.DataSource接口的 UnpooledDataSource,PooledDataSource类来表示UNPOOLED、POOLED类型的数据源。

CTRL+N进行查找

在这里插入图片描述
在这里插入图片描述

两个都继承了DataSource

UNPOOLED配置连接池分析

找到getConnection

在这里插入图片描述
在这里插入图片描述

跟doGetConnection进去,发现在创建properties对象,传用户名密码

在这里插入图片描述
在这里插入图片描述

再跟进去,就发现了熟悉的DriverManager,我们先进入initializeDriver看

  1. initializeDriver负责组成驱动
  2. 创建连接
  3. 返回连接
在这里插入图片描述
在这里插入图片描述
这就是UNPOOLED,每次都会注册驱动,获取连接,返回连接

POOLED配置连接池分析

在这里插入图片描述
在这里插入图片描述

跟popConnection进去

在这里插入图片描述
在这里插入图片描述
代码解释
在这里插入图片描述
在这里插入图片描述

如果为null,同步代码块,这一点为了线程安全

在这里插入图片描述
在这里插入图片描述

idleConnection空闲的connection如果是控(取反——空闲的连接还有的话

在这里插入图片描述
在这里插入图片描述

这里可以看一下idleConnection发现就是一个集合对象,印证了前面说的定义

在这里插入图片描述
在这里插入图片描述

先去看空闲有没有,有就去一个出来remove0

在这里插入图片描述
在这里插入图片描述

活动的连接池数量小于设定的最大值就可以创建一个连接

在这里插入图片描述
在这里插入图片描述

目前的意思是有空闲的就给你拿一个空闲的,没有的话就看一下连接池有没有位置,给你创建一个新的 都不满足的话就只有拿一个最老的(最先进来的)把他返回获取。

pooled总的来说就是:
  1. 先去看空闲池有没有
  2. 再去看活动池是否到达最大数量,没达到就创建一个连接
  3. 活动池也满了就找活动池中最先进来的拿来设置和清理

(觉得有帮助的话点个赞嘻嘻)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、连接池
    • 3.实现:
    • 二、Mybatis连接池
      • 三、POOLED与UNPOOLED结果对比
        • POOLED
        • UNPOOLED
      • 四、POOLED与UNPOOLED代码比较
        • UNPOOLED配置连接池分析
        • POOLED配置连接池分析
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档