zoukankan      html  css  js  c++  java
  • MyBatis源码解析【3】生命周期

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

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

    讲道理,今天我们其实应该直接开始看源码,看看第一步也就是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();
            }
        }
    }

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

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

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

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

  • 相关阅读:
    【pandas】'Styler' object has no attribute 'highlight_between'
    【原创】3行代码搞定:Python批量实现多Excel多Sheet合并
    【挑战阿里面试题-10种方法实现DataFrame转list】
    SpringCloud+RocketMQ实现分布式事务
    分布式事物SAGA
    分布式事务TCC
    多线程学习——思维导图
    .NET CLI简单教程和项目结构
    使用Google Fonts注意事项
    如何在印刷品中使用遵循SIL Open Font License协议的字体
  • 原文地址:https://www.cnblogs.com/linkstar/p/7111708.html
Copyright © 2011-2022 走看看