MyBatis:主要组件的生命周期。

现实中要想写出高效的程序只掌握MyBatis的基本用法是远远不够的。我们还要掌握他们的生命周期,这是十分重要的,尤其是在Web应用,Socket连接池等多线程场景中,如果我们不了解MyBatis组件的生命周期可能带来很严重的并发问题。

SqlSessionFactoryBuilder

SqlSessionFactory是利用XML或者Java编码获得资源来构建SqlSessionFactory的,通过他可以构建多个SessionFactory。他的作用就是一个构建器,一旦我们构建了SqlSessionFactory,他的作用就已经完结,失去了存在的意义,这时我们就应该毫不犹豫的废弃他,将他回收。所以他的生命周期只存在方法的局部,他的作用就是生成SqlSessionFactory对象。

SqlSessionFactory

SqlSessionFactory的作用是创建SqlSession,而SqlSession就是一个会话,相当于JDBC中的Connection对象。每次应用程序需要访问数据库,我们就要通过SqlSessionFactory创建SqlSession,所以SqlSessionFactory应该在MyBatis应用的整个生命周期中。而如果我们多次创建同一个数据库的SqlSessionFactory,则每次创建SqlSessionFactory会打开更多的数据库连接(Connection)资源,那么连接资源就很快会被耗尽。因此SqlSessionFactory的责任是唯一的,他的责任就是创建SqlSession,所以我们果断采用单例模式。如果我们采用多例,那么他对数据库连接的消耗是很大的,不利于我们统一的管理,这样便嗅到了代码的坏味道。所以正确的做法应该是使得每一个数据库只对应一个SqlSessionFactory,管理好数据库资源的分配,避免过多的Connection被消耗。

SqlSession

SqlSession是一个会话,相当于JDBC的一个Connection,他的生命周期应该是在请求数据库处理事务的过程中。他是一个线程不安全的对象,在涉及多线程的时候我们需要特别的当心,操作数据库需要注意其隔离级别,数据库锁等高级特性。此外,每次创建的SqlSession都必须及时关闭它,他长期存在就会使数据库连接池的活动资源减少,对系统性能的影响很大。我们往往通过finally语句块保证我们正确的关闭SqlSession。他存活于一个应用的请求和操作,可以执行多条SQL,保证事务的一致性。

Mapper

Mapper是一个接口,而没有任何是实现类,他的作用是发送SQL,然后返回我们需要的结果,或者执行SQL从而修改数据库的数据,因此他应该在一个SqlSession事务方法之内,是一个方法级别的东西。他就如同JDBC中的一条SQL语句的执行,他最大的范围和SqlSession是相同的。尽管我们想一直保存着Mapper,但是你会发现他很难控制,所以尽量在一个SqlSession事务的方法中使用他们,然后废弃掉。

有了上面的叙述,我们已经清楚了MyBatis组件的生命周期,如下图所示。

发布了124 篇原创文章 · 获赞 165 · 访问量 93万+

猜你喜欢

转载自blog.csdn.net/en_joker/article/details/104422462