Mybatis 作用域和生命周期

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();
}

 

 

转载于:https://www.cnblogs.com/jwen1994/p/10805904.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值