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类代码如下:
希望对不使用Spring等框架的人有帮助。
在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等框架的人有帮助。
相关文章推荐
- MyBatis的SqlSessionFactory的创建问题
- MyBatis的SqlSessionFactory的创建问题
- MyBatis的SqlSessionFactory的创建问题
- MyBatis核心SqlSessionFactory的创建
- MyBatis核心SqlSessionFactory的创建
- MyBatis核心SqlSessionFactory的创建
- Mybatis与Spring整合(Mybatis的sqlSessionFactory交由spring容器来创建)
- mybatis(四)动态拼sql以及不反序列化问题
- mybatis之 SqlSessionFactory单例创建
- SQL Server R2 2008中的SQL Server Management Studio 阻止保存要求重新创建表的更改问题的设置方法
- MyBatis 动态拼接Sql字符串的问题
- (SqlSessionTemplate和SessionFactory)sqlsession的产生过程,hibernate和mybatis的对比
- mybatis中修改数据库单一数据时,连带清空其他数据的问题【动态sql】
- Druid监控Mybatis不显示SQL问题
- mybatis动态sql解决关于There is no getter for property named 'certitype'错误问题
- spring配置mybatis的sqlsessionfactory
- 关于mybatis中sql常见问题处理
- hibernate4.3.8的dialect和创建SessionFactory遇到的一些问题
- mybatis创建一个或多个新用户 insert 字段和表名不确定时动态添加问题
- SSM框架day02-MyBatis——034——符合查询问题演示、035——动态SQL