生命周期
Mybatis的主要组件的生命周期:
SqlSessionFactoryBuilder
SqlSeesionFactoryBuilder是利用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事务方法之内,是一个方法级别的东西。它就如同一条SQL语句的执行,它最大的范围和SQLSession是相同的。尽管我们想一直保存着Mapper,但是不会发现它很难控制,所以尽量在一个SQLSession事务的方法中使用它,然后废弃掉。