目前为止我们讨论的各种范围和生命周期类非常重要,错误使用它们会导致严重的并发问题。

注意:对象生命周期和依赖注入框架

依赖注入框架可以创建线程安全的,事务性的SqlSession和映射器,并将它们直接注入到bean中,这样您就可以忽略它们的生命周期。 您可能想看看MyBatis-Spring或MyBatis-Guice子项目,以了解有关将MyBatis与DI框架一起使用的更多信息。

SqlSessionFactoryBuilder

        可以实例化,使用和丢弃此类。 创建SqlSessionFactory后,无需保留它。 因此,SqlSessionFactoryBuilder实例的最佳范围是方法范围(即本地方法变量)。 您可以重用SqlSessionFactoryBuilder来构建多个SqlSessionFactory实例,但是仍然最好不要保留它,以确保释放所有XML解析资源用于更重要的事情。

SqlSessionFactory

最佳实践是不要在应用程序运行中多次重建SqlSessionFactory。 因此,SqlSessionFactory的最佳范围是应用程序范围。 这可以通过多种方式实现。 最简单的是使用Singleton模式或Static Singleton模式。

SqlSession

它是一个线程不安全的对象,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。在涉及多线程的时候我们需要特别的当心,操作数据库需要注意其隔离级别,数据库锁等高级特性。绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。如果您使用任何类型的Web框架,请考虑SqlSession遵循与HTTP请求相似的作用域。换句话说,每次收到的 HTTP 请求,就可以打开SqlSession,返回一个响应,然后就可以将其关闭。它长期存在就会使数据库连接池的活动资源减少,对系统性能的影响很大。 结束会话非常重要,应始终确保在finallly语句块中将其关闭。它存在于一个应用的请求和操作,可以执行多条SQL,保证事务的一致性。

以下是确保关闭SqlSession的标准模式


try (SqlSession session = sqlSessionFactory.openSession()) {
  // 你的应用逻辑代码
}


在您的代码中始终使用此模式将确保正确关闭所有数据库资源。

Mapper 实例

映射器实例的最佳作用域是方法作用域。 也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可丢弃。

下面的示例演示了这种做法。


try (SqlSession session = sqlSessionFactory.openSession()) {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
   // 你的应用逻辑代码
}


修改表生命周期 hive sql sqlsession生命周期_应用程序