经过之前的项目构建,我们已经得到了一个可以使用的最基本的项目。

其中已经包括整个执行的过程。但是我们在完成之后也遇到了很多问题,我们就要慢慢的一步步解决这些问题。

讲道理,今天我们其实应该直接开始看源码,看看第一步也就是SqlSessionFactoryBulider是如何创建工厂的了。

但是别急,兄弟,我们要求的是最仔细,而不是最快。

有两件很重要的装备我们还没有,现在看还早了一些。

今天就要讲述第一件重要的装备:生命周期。(如果之前和我一样都是使用Spring管理的MyBatis的话对它应该好好学习一下)

废话说多了,赶紧开始了。

简记名字

在说之前,因为每个组件的名字都太长了,我简单记作下面这样

SqlSessionFactoryBuilder---->Builder、构建者

SqlSessionFactory ----->Factory、工厂

SqlSession----->产品、会话

SqlMapper----->接口

各个组件的生命周期

构建者:他的作用就是创建一个工厂。那么仔细想想,当工厂建造完成之后,它就没什么用了。那么没用的东西,在java中肯定要回收掉了。

所以对于它来说,建造完成工厂之后就被回收了,所以它的生命周期应该只存在与方法的局部。

工厂:工厂的作用是产生产品。那么仔细想想,工厂可不能生产一个产品之后就挂掉了。所以它肯定不能马上就被回收掉。

所以对于工厂来说,我们对于一个应用会不停的要求产品,所以它的生命周期应该整个应用中。

但是,少了不行,但是如果太多行不行呢?

按照现实情况来说,建造一个工厂成本挺大的吧,会占用很多面积吧,所以工厂肯定建造不了太多了。

按照程序的角度来说呢,一个工厂就占用了一个数据库连接,我们知道数据库的连接数是有限的,如果占用的太多,那么肯定是不行的。

所以我们这里可以采用单例模式,只建立一个工厂,我们只要从这个工厂里面拿产品就可以了。这也就是这个工厂存在的意义了。

产品:对于产品来说,功能就是去执行一个对应的mapper,那么显然,执行完成之后,这个产品就没有用了,要赶紧回收,不然占用了别人操作数据库的机会就不好了。

所以产品的生命周期挺短的,应该是在请求数据库处理事物的过程中。而且回收的代码需要放在finally中,也就是无论出现什么情况都要回收,不能浪费。

mapper:这个就很好办了,产品造就它,它就出现了,产品销毁了,那么他也就没了。

设计单例模式

现在这件装备爆出来了,赶紧捡起来咯。

当我们知道了这些组件的生命周期之后,我们显然要对我们之前的代码进行调整了,这里设计一个最简单的单例模式来满足那个建造者的要求咯。

我们先看一下最简单最基本的单例模式的实现。

public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}

基本上就是上面这个样子啦。具体原理我这边就不多说了,如果对于上面代码有疑问的话就要好好补补基础咯。

然后照着这个基本的样子就可以基本实现我们的要求了。

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException;
import java.io.InputStream; public class SqlSessionFactoryBuilderTest { private volatile static SqlSessionFactory sqlSessionFactory = null;
private SqlSessionFactoryBuilderTest(){}
public static SqlSessionFactory getSqlSessionFactory(){
if (sqlSessionFactory == null){
synchronized (SqlSessionFactoryBuilderTest.class){
if (sqlSessionFactory == null){
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
}
}
return sqlSessionFactory;
}
}

然后修改一下主要测试类

public class MainTest {

    public static void main(String[] args) throws Exception {
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryBuilderTest.getSqlSessionFactory();
SqlSession session = sqlSessionFactory.openSession();
try {
Demo demo = (Demo) session.selectOne("com.xex.dao.mapper.DemoMapper.selectDemo");
System.out.println(demo.getValue());
} finally {
session.close();
}
}
}

到此为止我们已经完成了单例模式

通过了对于各个组件生命周期的了解,我们修改了我们的代码,让它更加贴近实际一些。

我们也解决了部分我们在之前提出的问题。

这一章这对于我们以后学习源码是一个基础,需要掌握。

MyBatis源码解析【3】生命周期的更多相关文章

  1. 【MyBatis源码解析】MyBatis一二级缓存

    MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...

  2. Mybatis源码解析(一) —— mybatis与Spring是如何整合的?

    Mybatis源码解析(一) -- mybatis与Spring是如何整合的?   从大学开始接触mybatis到现在差不多快3年了吧,最近寻思着使用3年了,我却还不清楚其内部实现细节,比如: 它是如 ...

  3. Mybatis源码解析(四) —— SqlSession是如何实现数据库操作的?

    Mybatis源码解析(四) -- SqlSession是如何实现数据库操作的?   如果拿一次数据库请求操作做比喻,那么前面3篇文章就是在做请求准备,真正执行操作的是本篇文章要讲述的内容.正如标题一 ...

  4. Mybatis源码解析-DynamicSqlSource和RawSqlSource的区别

    XMLLanguageDriver是ibatis的默认解析sql节点帮助类,其中的方法其会调用生成DynamicSqlSource和RawSqlSource这两个帮助类,本文将对此作下简单的简析 应用 ...

  5. mybatis源码-解析配置文件(四-1)之配置文件Mapper解析(cache)

    目录 1. 简介 2. 解析 3 StrictMap 3.1 区别HashMap:键必须为String 3.2 区别HashMap:多了成员变量 name 3.3 区别HashMap:key 的处理多 ...

  6. mybatis源码-解析配置文件(四)之配置文件Mapper解析

    在 mybatis源码-解析配置文件(三)之配置文件Configuration解析 中, 讲解了 Configuration 是如何解析的. 其中, mappers作为configuration节点的 ...

  7. mybatis源码-解析配置文件(三)之配置文件Configuration解析

    目录 1. 简介 1.1 系列内容 1.2 适合对象 1.3 本文内容 2. 配置文件 2.1 mysql.properties 2.2 mybatis-config.xml 3. Configura ...

  8. Mybatis源码解析,一步一步从浅入深(一):创建准备工程

    Spring SpringMVC Mybatis(简称ssm)是一个很流行的java web框架,而Mybatis作为ORM 持久层框架,因其灵活简单,深受青睐.而且现在的招聘职位中都要求应试者熟悉M ...

  9. Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码

    在文章:Mybatis源码解析,一步一步从浅入深(一):创建准备工程,中我们为了解析mybatis源码创建了一个mybatis的简单工程(源码已上传github,链接在文章末尾),并实现了一个查询功能 ...

  10. Mybatis源码解析,一步一步从浅入深(三):实例化xml配置解析器(XMLConfigBuilder)

    在上一篇文章:Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码 ,中我们看到 代码:XMLConfigBuilder parser = new XMLConfigBuilder(read ...

随机推荐

  1. Google Android Studio Kotlin 开发环境配置

    Google 近日开发者大会宣布Kotlin成为Android开发的第一级语言,即Android官方开发语言,可见Google对Kotlin的重视,本文就介绍一下Android Studio下的Kot ...

  2. 用C语言模仿Python函数

    首先得说明一点,C 语言不是函数式编程语言,要想进行完全的函数式编程,还得先写个虚拟机,然后再写个解释器才行(相当于 CPython ). 下面我们提供一个例子,说明 C 语言函数可以"适度 ...

  3. javaWeb学习总结(1)- Tomcat服务器学习和使用(2)

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  4. Struts2入门(一)

    今天学习Struts2首先struts是一个成熟的框架.Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Cont ...

  5. Unity游戏程序员面试题及解答

    典型的一些如手写排序算法.一些基本数学问题,在此就不列举了.以下整理出一些代表性的.有参考价值的题,真实面试题,附有本人的解答,欢迎讨论. 题1.指出下列哪些属于值类型? int System.Obj ...

  6. keyup实现在输入状态不发送搜索请求,停止输入后发送

    个人需求:通过keyup事件配合后台elasticsearch(弹性搜索),用户在输入状态不发送请求,等停止输入后发送请求. 这是个思考笔记,因为项目临时需要弹性搜索功能,所以临时想了这么个法子,方法 ...

  7. charles抓包,打断点,连接手机抓包

    写给我自己: 如果是使用charles抓包.一定要tm的保证手机和电脑连的是一个网. charles抓本地包的操作 1.打开charles, 2.打开浏览器访问某网页,就可抓到对应的包 charles ...

  8. 打开IIS的快捷键

    [windows键+R]→在运行界面输入“inetmgr”→点击回车键,即可以出现IIS界面

  9. 限制容器对CPU的使用 - 每天5分钟玩转 Docker 容器技术(28)

    上节学习了如何限制容器对内存的使用,本节我们来看CPU. 默认设置下,所有容器可以平等地使用 host CPU 资源并且没有限制. Docker 可以通过 -c 或 --cpu-shares 设置容器 ...

  10. ssh隧道

    最近有需求使用ssh隧道,顺便研究了下,以下记录一下大概说明 ssh隧道顾名思义在可以通过ssh连接的server之间建立加密隧道,常用于突破网络限制 常用三种端口转发模式:本地端口转发,远程端口转发 ...