您的位置:首页 > 数据库

MyBatis的SqlSessionFactory的创建问题

2012-02-09 22:01 344 查看
<!-- @page { margin: 0.79in } P { margin-bottom: 0.08in } -->

在MyBatis文档中,提到SqlSessionFactory最好在程序中只被创建一次。建议使用Singleton或者Spring、Guice等dependency injection框架。

Spring中使用MyBatis完全可以采用Spring-mybatis,无须考虑factory的生命周期。

本文考虑自己实现Singleton机制。选用之前我的Singleton文章中提到的第四种Singleton实现方案,lazy loading模式。

大体思路:

实现一个Holder类,该类是Singleton的,将SqlSessionFactory作为该类的成员变量。Holder类的构造函数只会被调用一次,并且会将SqlSessionFactory实例化。以后每次调用Holder.getFactory()方法就能获得同一个SqlSessionFactory对象。不过由于我还没有找到支持创建时参数的方案,使用另一个Singleton对象Configuration作为依赖。

使用代码如下:

Configuration.getInstance().setXmlPath("com/lifeix/mybatis/xml/dbConfig.xml");

SqlSessionFactorySingletonHolder factoryHolder = SqlSessionFactorySingletonHolder.getInstance();

SqlSession session = factoryHolder.getFactory().openSession();

Configuration类代码如下:

import lombok.Getter;
import java.io.IOException;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SqlSessionFactorySingletonHolder {
static class InnerHolder{
private static final SqlSessionFactorySingletonHolder INSTANCE;
static {
try {
INSTANCE = new SqlSessionFactorySingletonHolder();
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
}
public static SqlSessionFactorySingletonHolder getInstance(){
return InnerHolder.INSTANCE;
}
private SqlSessionFactorySingletonHolder() throws Exception {
init();
}
private void init() throws Exception {
log = LoggerFactory.getLogger(getClass());
Reader reader = null;
try {
reader = Resources.getResourceAsReader(Configuration.getInstance().getXmlPath());
factory = new SqlSessionFactoryBuilder().build(reader);
}catch(Exception ex){
log.error(ex.getMessage(),ex);
throw ex;
} finally {
try {
if(reader != null){
reader.close();
}
} catch (IOException ex) {
log.error(ex.getMessage(),ex);
}
}
}
@Getter
private SqlSessionFactory factory;
private Logger log;
}


希望对不使用Spring等框架的人有帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: