先来看看java纯jdbc查询数据的示例:

try {//加载对应的驱动类Class.forName("com.mysql.cj.jdbc.Driver");//创建连接Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC", "root", "root123");String sql = "select * from t_user";//创建statementStatement createStatement = connection.createStatement();//利用statement执行SQL语句返回结果集ResultSet rs = createStatement.executeQuery(sql);//遍历结果集while(rs.next()) {System.out.print(rs.getString(1) + " > ");System.out.print(rs.getString(2) + " > ");System.out.print(rs.getString(3) + " > ");System.out.println(rs.getString(4));}//关闭rs.close();createStatement.close();connection.close();
} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();
} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();
} 

这是一个最基础的查询数据的示例,也是所有的使用Java ORM框架与数据库交互的底层,只不过是封装一下罢了,但是像这种使用DriverManager创建连接的方式,已经基本淘汰了,在应用中是比较浪费资源的,所以JDK就提供一种数据库连接池接口,供第三方组件实现,java.sql.DataSource,这个仅仅是个接口,具体的连接池的实现需第三方进行实现。

我们就直接先看一下Mybatis中的数据源连接池是怎么实现的。

设计模式

我们现需要了解一下数据源模块中的设计模式

工厂模式(Factory Pattern)

是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

UML:

但是这种工厂模式存在一定的弊端,比如在新增一个新业务模块的时候,是必须修改创建工厂的代码,违反了开闭原则

所以就有一种新泽设计模式,

抽象工厂模式(Abstract Factory Pattern)

是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

当业务扩展的时候新增扩展的工厂,无需修改工厂代码,Mybatis的数据源模块就是使用的抽象工厂设计模式。

源码分析

在源码中超级工厂如下:

package org.apache.ibatis.datasource;import java.util.Properties;import javax.sql.DataSource;/*** @author Clinton Begin*/
public interface DataSourceFactory {void setProperties(Properties props);DataSource getDataSource();}

设计的UML如下(一个工厂类对应只生产一种数据源):

JndiDataSourceFactory:是一个引用,可以直接获取应用级容器中的上下文数据源。

UnpooledDataSourceFactory:生产UnpooledDataSource的数据源工厂,单一连接,非使用了数据源连接池。

PooledDataSourceFactory:生产PooledDataSource数据源工厂,提供了一个线程安全的数据源连接池。

UnpooledDataSource

虽说是继承了DataSource但是并没有具体的实现了连接池的特性,可以看一下这个是怎么产出Connection

跟开始那个JDBC连接数据库的示例是一致的用法。

PooledDataSource

这个就是真正的数据源连接池的实现

连接池需要比较多的参数设置,比如超时,检测连接是否有效,活动的连接,空闲连接等等。

所以今天就讲讲比较核心的一些东西:

里面创建连接是通过创建UnpooledDataSource对象来产出连接的,连接主要是存于List当中,然后配合一系列的操作就变成了线程安全的连接池了,

但是Mybatis的连接池的连接并非直接的使用的Connection而是使用的PooledConnection,进去发现这个是个连接代理,给真正的连接进行了代理增强

连接池释放连接的过程

连接池获取连接的过程(这个就比较长了)

这里用到了并发编程的知识,大家可以看看我之前发布的博文,有讲解这一块的东西

进行校验后会将当前的线程添加到活动连接集合当中,

在获取PooledConnection对象后,获取的连接是代理的连接

解析基本结束了。

最后要提一下为什么在JDBC中使用连接只要用DriverManager.getConnection就能获取连接了,

因为在Class.forName("")加载的时候会去加载驱动类的静态代码块,将其驱动放到registeredDrivers集合中,这个是个CopyOnWriteArrayList读写分离集合

然后在DriverManager获取连接

Mybatis源码之数据源模块分析相关推荐

  1. Mybatis源码之缓存模块分析

    缓存这个东西在很多应用中都能看到它们的身影,这次就讲讲在Mybatis中的缓存是怎么应用的,虽然说吧Mybatis中的缓存基本不怎么用,用的更多是第三方组件redis.MongoDB.MemCache ...

  2. Mybatis源码之插件模块分析

    总结完这个Mybatis的整体主要功能基本上就差不多完,还有一些细节的部分,后续都会记录补充. 插件这个东西一般用的比较少,就算用的多的插件也算是PageHelper分页插件: PageHelper官 ...

  3. Mybatis源码之核心流程分析

    终于谈到了Mybatis最核心的东西了,最核心的就是通过配置XML文件或注解中的SQL,直接调用接口就能执行配置好的SQL语句并封装成对应的返回类型的数据. 先看一下Mybatis使用示例: //创建 ...

  4. apache缓存清理_深挖 Mybatis 源码:缓存模块

    作者:AmyliaY 出自:Doocs开源社区 原文:my.oschina.net/doocs/blog/4549852 MyBatis 中的缓存分为一级缓存.二级缓存,但在本质上是相同的,它们使用的 ...

  5. openssl源码之error模块分析

    看了openssl的erro模块,简单聊一聊该模块的一些事情. erro模块的作用是记录openssl在运行的过程中的错误情况,相当于工程开发中的日志统计功能.当然erro模块所记录的都是一些出错的地 ...

  6. MyBatis 源码分析 - 内置数据源

    1.简介 本篇文章将向大家介绍 MyBatis 内置数据源的实现逻辑.搞懂这些数据源的实现,可使大家对数据源有更深入的认识.同时在配置这些数据源时,也会更清楚每种属性的意义和用途.因此,如果大家想知其 ...

  7. MyBatis源码骨架分析

    源码包分析 MyBatis 源码下载地址:https://github.com/MyBatis/MyBatis-3 MyBatis源码导入过程: 下载MyBatis的源码 检查maven的版本,必须是 ...

  8. MyBatis 源码分析 - 缓存原理

    1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...

  9. 【Mybatis源码】源码分析

    [Mybatis源码]源码分析 (一)Mybatis重要组件 [1]四大核心组件 (1)SqlSessionFactoryBuilder (2)SqlSessionFactory (3)SqlSess ...

最新文章

  1. linux手机刷机包制作工具_刷GitHub提交记录工具制作
  2. webpack——解决当前 Web 开发面临的困境||webpack 概述
  3. Git 基础 - 打标签 tag
  4. 微信小程序 weui 使用方法
  5. PoE交换机的选择和使用注意事项介绍
  6. Oracle查询优化改写技巧与案例总结二
  7. cocos2dx-3.0(8)------Label、LabelTTF、LabelAtlas、LabelBMFont使用之法
  8. input标签用法与功能全面解析
  9. ASP.NET 教程
  10. Android设置全屏代码
  11. 自动采购订单 Auto PO
  12. python实现数据库的增删改查
  13. 计算机视觉期刊水平,计算机视觉和模式识别领域的SCI期刊菜鸡一枚,领域,识别,EditSprings,艾德思...
  14. 财阀还是民主?DeFi协议大战,暗潮汹涌
  15. AsyncTaskLoader1 自定义AsyncTaskLoader使用实例:面包师
  16. day01血字的研究
  17. RGB图像中特定颜色的提取
  18. 音频文件格式有哪些?误删音频文件如何恢复?
  19. Windows加密文件夹设置
  20. Deep Learning (中文版英文版)

热门文章

  1. 学计算机高中要买电脑,大一新生,打着学习的“口号”要求买电脑,父母到底该不该答应?...
  2. java this关键字表示当前对象,可以访问属性、方法、构造方法
  3. java 操作cursor数据库_Java连接各种数据库以及调用存储过程
  4. python获取手机通知栏消息_Python编写简单的通知栏脚本启动工具
  5. 启动linux_使用 UEFI 双启动 Windows 和 Linux | Linux 中国
  6. 小世界网络模型代码 c 语言,新的小世界网络模型实现文本特征的提取方法与流程...
  7. php strlen遇0截断,聊下php下的截断问题
  8. php mysql 图像_将图像插入MySQL并使用PHP检索图像
  9. 采集标签_分流器(二):灵活分流能力,数据采集无忧
  10. linux 运行ca.crt,linux下使用openssl生成 csr crt CA证书,opensslcsr