在web应用中如果不了解mybatis组件的生命周期可能带来很严重的并发问题,下面总结下SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession和Mapper的生命周期。
MyBatis核心组件:
- SqlSessionFactoryBuilder
- SqlSessionFactory
- SqlSession
- Mapper
一:SqlSessionFactoryBuilder
SqlSessionFactoryBuilder是利用XML或者java编码获得资源来构建SqlSessionFactory的,通过它可以构建多个SessionFatory。它的作用就是一个构建器,一旦我们构建了SqlSessionFactory,它的作用就已经完结,失去了存在的意义,这时我们就应该废弃它,将他回收。所以它的生命周期只存在于方法的局部,它的作用就是生成SqlSessionFactory对象
二:SqlSessionFactory
SqlSessionFactory的作用是创建SqlSession,而SqlSession就是一个会话,相当于jdbc中的Connection对象。每次应用程序需要访问数据库,我们就要通过SqlSessionFactory创建SqlSession,所以SqlSessionFactory应该在Mybatis应用的整个生命周期中。而如果我们多次创建同一个数据库的SqlSessionFactory,则每次创建SqlSessionFactory会打开更多的数据库连接资源,那么连接资源就会很快被耗尽。因此SqlSessionFactory的责任是唯一的,它的责任就是创建SqlSession,所以我们应该采用单例模式。每个数据库只对应一个SqlSessionFactory,管理数据库资源的分配,避免过多的Connection被消耗。
三:SqlSession
SqlSession是一个会话,相当于jdbc的Connection对象,它的生命周期应该是在请求数据库处理事务的过程中。它是一个线程不安全的对象,在涉及多线程的时候我们需要特别的担心,操作数据库需要注意隔离级别,数据库锁等高级特性。此外,每次创建的SqlSession都必须及时关闭它,它长期存在就会使数据库连接池的活动资源减少,对系统性能的影响很大。SqlSession存活于一个应用的请求和操作,可以执行多条sql,保证事务的一致性。
四:Mapper
Mapper是一个接口,而没有实现类,它的作用是发送sql然后返回我们需要的结果,或者执行sql从而修改数据库的数据,因此它应该在一个SqlSession事务方法之内,是一个方法级别的东西。如同jdbc中的一条sql语句执行,它的最大范围和SqlSession是相同的。尽管我们想一直保存着Mapper,但是你会发现很难控制,所以尽量在一个SqlSession事务的方法中使用它们,然后废弃掉。
Reference:https://blog.csdn.net/j903829182/article/details/71935048