学习mybatis不得不了解SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession。这里主要是讲解它们的生命周期以及一般最佳实践。 一般来说对象的生命周期也就是对象创建到销毁的过程,如果在这个过程中,如果实现的代码质量不佳,那么很容易造成程序上的错误或者效率的降低。

  1、SqlSessionFactoryBuilder

    SqlSessionFactoryBuilder可以被jvm虚拟机所实例化、使用或者销毁。一旦使用SqlSessionFactoryBuilder对象创建SqlSessionFactory后,SqlSessionFactoryBuilder类就不需要存在了,也就是,不需要保持对象的状态,可以随意的由jvm销毁。因此SqlSessionFactoryBuilder对象的最佳使用范围是方法内部。

  2、SqlSessionFactory

    SqlSessionFactory对象是由SqlSessionFactoryBuilder创建。一旦创建SqlSessionFactory类的实例,该实例应该在应用程序执行期间都存在,根本不需要每一次操作数据库时都创建,所以其最佳实践方式就是单例模式,或者使用Spring框架来实现单例模式对SqlSessionFactory对象进行有效管理(后续会讲解)。

  3、SqlSession

     SqlSession对象由SqlSessionFactory类创建,需要注意的是,每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享,是线程不安全的,其实我们去扒看SqlSession接口定义,可以发现,里面定义了数据的增删改查以及事务处理以及实例对象的关闭。那么很显然在操作该对象的时候必须要保持其线程安全,不然在并发情况下肯定会乱套。或者将SqlSession实例对象存放在一个类的静态字段甚至是实例字段中。

  4、简单封装

   由1、2、3得知,SqlSessionFactoryBuilder会被jvm自动销毁、SqlSessionFactory不需要每次操作数据库都创建、SqlSession必须是线程安全的,那么针对这3点,以下做了一个简单封装。

   SyncSqlSessionFactory类主要是获取SqlSessionFactory单例对象

package com.mybatis.util;

import java.io.IOException;
import java.io.InputStream; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class SyncSqlSessionFactory { private static SqlSessionFactory sqlSessionFactory; private SyncSqlSessionFactory() {
} synchronized public static SqlSessionFactory getSqlSessionFactory() { try {
if (sqlSessionFactory == null) {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources
.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
}
} catch (IOException e) {
e.printStackTrace();
} return sqlSessionFactory;
}
}

  SafeSqlSessionUtil类保证SqlSession线程安全的前提下封装了事务的回滚提交操作。

package com.mybatis.util;

import org.apache.ibatis.session.SqlSession;

public class SafeSqlSessionUtil {

    private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();

    public static SqlSession getSqlSession() {

        SqlSession sqlSession = threadLocal.get();

        return sqlSession == null ? SyncSqlSessionFactory.getSqlSessionFactory()
.openSession() : sqlSession; } public static void commit() {
if (threadLocal.get() != null) {
threadLocal.get().commit();
threadLocal.get().close();
threadLocal.set(null);
}
} public static void rollback() {
if (threadLocal.get() != null) {
threadLocal.get().rollback();
threadLocal.get().close();
threadLocal.set(null);
}
}
}

  5、使用示例

try {

            SqlSession sqlSession = SafeSqlSessionUtil.getSqlSession();

            //基本操作
sqlSession.delete("");
sqlSession.update("");
sqlSession.select("",null); } catch (Exception e) { SafeSqlSessionUtil.rollback(); }finally{ SafeSqlSessionUtil.commit(); }

  6、需要说明的地方

  synchronized:如果某个synchronized方法是static的,那么当线程访问该方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在的类所对应的Class对象。Java中,无论一个类有多少个对象,这些对象会对应唯一一个Class对象,因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,它们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始。

  ThreadLocal:线程级别的隔离。它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。多数情况下ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。

  理解得更加通俗一点就是一个是锁机制进行时间换空间,一个是存储拷贝进行空间换时间。

MyBatis之八:需要说明的几个java api的生命周期以及封装的更多相关文章

  1. [转]JAVA虚拟机的生命周期

    JAVA虚拟机体系结构 JAVA虚拟机的生命周期 一个运行时的Java虚拟机实例的天职是:负责运行一个java程序.当启动一个Java程序时,一个虚拟机实例也就诞生了.当该程序关闭退出,这个虚拟机实例 ...

  2. java 静态变量生命周期(类生命周期)

    Static: 加载:java虚拟机在加载类的过程中为静态变量分配内存. 类变量:static变量在内存中只有一个,存放在方法区,属于类变量,被所有实例所共享 销毁:类被卸载时,静态变量被销毁,并释放 ...

  3. Java类的生命周期详解

    引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告 ...

  4. 【转】Java 类的生命周期详解

    一. 引 言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大 ...

  5. 【转载】详解java类的生命周期

    原文地址:http://blog.csdn.net/zhengzhb/article/details/7517213 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑, ...

  6. Java线程的生命周期(转)

    Java线程的生命周期 一个线程的产生是从我们调用了start方法开始进入Runnable状态,即可以被调度运行状态,并没有真正开始运行,调度器可以将CPU分配给它,使线程进入Running状态,真正 ...

  7. Java 对象的生命周期

    Java对象的生命周期 在Java中,对象的生命周期包含下面几个阶段: 1.      创建阶段(Created) 2.      应用阶段(In Use) 3.      不可见阶段(Invisib ...

  8. Java虚拟机(三)垃圾标记算法与Java对象的生命周期

    前言 这一节我们来简单的介绍垃圾收集器,并学习垃圾标记的算法:引用计数算法和根搜索算法,为了更好的理解根搜索算法,会在文章的最后介绍Java对象在虚拟机中的生命周期. 1.垃圾收集器概述 垃圾收集器( ...

  9. [Java]类的生命周期(上)类的加载和连接[转]

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java ...

随机推荐

  1. logback.xml_appender配置

    logback<appender> <appender>: <appender>是<configuration>的子节点,是负责写日志的组件. < ...

  2. Android常用控件之FragmentTabHost的使用

    最近在学TabHost时发现TabActivity在API level 13以后不用了,所以就去寻找它的替换类,找到FragmentActivity,可以把每个Fragment作为子tab添加到Fra ...

  3. UI特效--Android利用ViewFlipper实现屏幕切换动画效果

    .屏幕切换指的是在同一个Activity内屏幕见的切换,最长见的情况就是在一个FrameLayout内有多个页面,比如一个系统设置页面:一个个性化设置页面.2.介绍ViewFilpper类ViewFl ...

  4. 常用sql命令

    --1) 创建一张学生表,包含以下信息,学号,姓名,年龄,性别,家庭住址,联系电话 CREATE TABLE student (     [id] [int] IDENTITY(1,1) NOT NU ...

  5. Unicode转为UTF8

    Unicode转换为UTF8 要说这个转换也简单,使用WideCharToMultiByte两次或者直接一次就可以转换. 今天在弄VLC的时候,由于VLC的视频文件名使用UTF8编码,因此当路径中包含 ...

  6. Install_ruby

    Install rvm 1 2 3 $ curl -L get.rvm.io | bash -s stable $ source ~/.bashrc $ source ~/.bash_profile ...

  7. 搜狐云景paas平台实践之路

    前言: 搜狐云景作为搜狐的paas平台,在2014年5月22日的云计算大会上正式发布了公测.初测,注册用户必须先申请邀请码参与公测会赠送用户100元电子券,经过实名认证之后会再赠送100电子券,目测可 ...

  8. 【Spark学习】Apache Spark监控与测量

    Spark版本:1.1.1 本文系从官方文档翻译而来,转载请尊重译者的工作,注明以下链接: http://www.cnblogs.com/zhangningbo/p/4137952.html

  9. 如何使用git创建远程仓库(供局域网多人使用)

    用git init(默认创建的是私人的仓库)创建的仓库,推送是不会成功的. 因此在git server端,我们要用 git --bare init --shared=group 来创建一个bare库, ...

  10. usb mass storage device

    Problem adding USB host device to KVM Windows guest machine. Status: CLOSED CURRENTRELEASE   Aliases ...