SqlSessionFactoryBuilder
这个类可以在任何时候被实例化、使用和销毁。一旦您创造了就不需要再保留它了。所以 SqlSessionFactoryBuilder 实例的最好的作用域是方法体内(即一个本地方法变量)。您能重用 SqlSessionFactoryBuilder 创建多个 SqlSessuonFactory 实例,但最好不要把时间、资源放在解析 XML 文件上,而是要从中解放出来做最重要事情。
SqlSessionFactory
一旦创建,将会存在于您的应用程序整个运行生命周期中。很少或根本没有理由去销毁它或重新创建它。最佳实践是不要在一个应用中多次创建 SqlSessionFactory。这样做会被视为"没品味"。所是 SqlSessionFactory 最好的作用域范围是一个应用的生命周期范围。这可以由多种方式来实现,最简单的方式是使用 Singleton 模式或静态 Singleton 模式。但这不是被广泛接受的最佳做法,相反,您可能更愿意使用像 Goole Guice 或 Spring 的依赖注入方式。这些框架允许您创造一个管理器,用于管理 SqlSessionFactory 的生命周期。
SqlSession
每个线程都有一个 SqlSession 实例,SqlSession 实例是不被共享的,并且不是线程安全的。因此最好的作用域是 request 或者 method,决不要用一个静态字段或者一个类的实例字段来保存 SqlSession 实例引用。也不要用任何一个管理作用域,如 Servlet 框架中的 HttpSession,来保存 SqlSession 的引用。如果您正在用一个 WEB 框架,可以把 SqlSession 的作用域看作类似于 HTTP 的请求范围。也就是说,在收到一个HTTP请求,您可以打开一个SqlSession,当您把 response 返回时,就可以把 SqlSession 关闭。关闭会话是非常重要的,您应该要确保会话在一个 finally 块中被关闭。
SqlSession session = sqlSessionFactory.openSession(); try{ //do work }finally{ session.close(); }
在您的代码里都使用这一模式将保证所有的数据库资源被正确地关闭(假如您没有把您自己的数据库连接传递 Mybatis 管理,这表明您希望自己管理连接)
Mapper实例
Mappers 是创建来绑定映射语句的接口,该 Mapper 实例是从 SqlSession 得到的.因此,所有实例的作用域跟创建它的 SqlSession 一样。但是, mapper 实例最好的作用域是 method,也就是它们应该在方法内被调用,使用完即被毁。并且 mapper 实例不用显式地被关闭。虽然把 mapper 实例保持在一个 request 范围(与 SqlSession 相似)不会产生太大的问题,但是您可能会发现,在这个层次上管理太多资源可能会失控。保持简单,就是让 mapper 保持在一个方法内。下面的例了演示了这种做法。
SqlSession session = sqlSessionFactory.openSession(); try{ BlogMapper mapper = session.getMapper(BlogMapper.class); //do work }finally{ session.close(); }