Mybatis:SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession,单例模式
参考:
MyBatis中核心对象生命周期和作用域
笔记:
SqlSessionFactoryBuilder:
-
一旦创建了 SqlSessionFactory,就不再需要它了(生命没了)
-
局部变量
SqlSessionFactory:
-
说白了就是可以想象为 :数据库连接池
-
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。
-
因此 SqlSessionFactory 的最佳作用域是应用作用域。
-
最简单的就是使用单例模式(参考:单例模式)或者静态单例模式。
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式(Singleton)的目的是为了保证在一个进程中,某个类有且仅有一个实例。
因为这个类只有一个实例,因此,自然不能让调用方使用
new Xyz()
来创建实例了。所以,单例的构造方法必须是private
,这样就防止了调用方自己创建实例,但是在类的内部,是可以用一个静态字段来引用唯一创建的实例的:public class Singleton { // 静态字段引用唯一实例: private static final Singleton INSTANCE = new Singleton(); // private构造方法保证外部无法实例化: private Singleton() { } }
那么问题来了,外部调用方如何获得这个唯一实例?
答案是提供一个静态方法,直接返回实例:
public class Singleton { // 静态字段引用唯一实例: private static final Singleton INSTANCE = new Singleton(); // 通过静态方法返回实例: public static Singleton getInstance() { return INSTANCE; } // private构造方法保证外部无法实例化: private Singleton() { } }
或者直接把
static
变量暴露给外部:public class Singleton { // 静态字段引用唯一实例: public static final Singleton INSTANCE = new Singleton(); // private构造方法保证外部无法实例化: private Singleton() { } }
所以,单例模式的实现方式很简单:
- 只有
private
构造方法,确保外部无法实例化;- 通过
private static
变量持有唯一实例,保证全局唯一性;- 通过
public static
方法返回此唯一实例,使外部调用方能获取到实例。Java标准库有一些类就是单例,例如
Runtime
这个类:Runtime runtime = Runtime.getRuntime();
SqlSession
-
连接到连接池的一个请求!
-
SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。
-
用完之后需要赶紧关闭,否则资源被占用!