文章目录
1. 作用域(Scope)和生命周期2. 作用域理解1. SqlSessionFactoryBuilder2. SqlSessionFactory3. SqlSession
1. 作用域(Scope)和生命周期
理解我们目前已经讨论过的不同作用域和生命周期类是至关重要的,因为错误的使用会导致非常严重的并发问题。
2. 作用域理解
1. SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 的作用在于创建 SqlSessionFactory创建成功后,SqlSessionFactoryBuilder 就失去了作用所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
2. SqlSessionFactory
SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象。因为 MyBatis 的本质就是 Java 对数据库的操作,所以 SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中所以一旦创建了 SqlSessionFactory,就要长期保存它,直至不再使用 MyBatis 应用所以可以认为 SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。所以说 SqlSessionFactory 的最佳作用域是应用作用域。
3. SqlSession
SqlSession 就相当于一个数据库连接(Connection 对象)你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪所以用 try…catch…finally… 语句来保证其正确关闭。所以 SqlSession 的最佳的作用域是请求或方法作用域。