962148150 发表于 2016-11-26 06:58:36

MyBatis的SqlSessionFactory的创建问题

  <!--@page { margin: 0.79in }P { margin-bottom: 0.08in }-->
  在MyBatis文档中,提到SqlSessionFactory最好在程序中只被创建一次。建议使用Singleton或者Spring、Guice等dependencyinjection框架。
  Spring中使用MyBatis完全可以采用Spring-mybatis,无须考虑factory的生命周期。
  本文考虑自己实现Singleton机制。选用之前我的Singleton文章中提到的第四种Singleton实现方案,lazyloading模式。
  大体思路:
  实现一个Holder类,该类是Singleton的,将SqlSessionFactory作为该类的成员变量。Holder类的构造函数只会被调用一次,并且会将SqlSessionFactory实例化。以后每次调用Holder.getFactory()方法就能获得同一个SqlSessionFactory对象。不过由于我还没有找到支持创建时参数的方案,使用另一个Singleton对象Configuration作为依赖。
  使用代码如下:
  Configuration.getInstance().setXmlPath("com/lifeix/mybatis/xml/dbConfig.xml");
  SqlSessionFactorySingletonHolderfactoryHolder = SqlSessionFactorySingletonHolder.getInstance();
  SqlSession session =factoryHolder.getFactory().openSession();
  Configuration类代码如下:
  public class Configuration {private static class SingletonHolder{private static final Configuration INSTANCE = new Configuration();}public static Configuration getInstance(){return SingletonHolder.INSTANCE;}private Configuration() {}@Getter @Setterprivate String xmlPath;}
  SqlSessionFactorySingletonHodler类的代码如下:
  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);}}}@Getterprivate SqlSessionFactory factory;private Logger log;}
  希望对不使用Spring等框架的人有帮助。
页: [1]
查看完整版本: MyBatis的SqlSessionFactory的创建问题