zoukankan      html  css  js  c++  java
  • 工具类:mybatis中使用Threadlocal开启session及关闭session

    1、线程容器,给线程绑定一个Object 内容,后只要线程不变,可以随时取出.
    1.1 改变线程,无法取出内容.
    1 final ThreadLocal threadLocal = new ThreadLocal<>();
    2 threadLocal.set("测试");
    3 new Thread(){
    4     public void run() {
    5         String result = threadLocal.get();
    6         System.out.println("结果:"+result);
    7     };
    8 }.start();
    2、使用Threadlocal简化开发
    2.1定义工具类
        将SqlSession创建出来,存放到Threadlocal中,需要时再从中取出
     1 package com.test.util;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 
     6 import org.apache.ibatis.io.Resources;
     7 import org.apache.ibatis.session.SqlSession;
     8 import org.apache.ibatis.session.SqlSessionFactory;
     9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    10 
    11 public class MybatisUtil {
    12 
    13     //工厂
    14     private static SqlSessionFactory factory;
    15     //线程容器
    16     private static ThreadLocal<SqlSession> tl = new ThreadLocal<>();
    17     
    18     
    19     static{
    20         try {
    21             InputStream is = Resources.getResourceAsStream("mybatis.xml");
    22             factory = new SqlSessionFactoryBuilder().build(is);
    23         } catch (IOException e) {
    24             e.printStackTrace();
    25         }
    26     }
    27     /**
    28      * 获取session
    29      * 从线程容器中获取,没有则创建session在存放到线程容器中
    30      * @return
    31      */
    32     public static SqlSession getSession(){
    33         SqlSession sqlSession = tl.get();
    34         if(sqlSession == null){
    35             sqlSession = factory.openSession();
    36             tl.set(sqlSession);
    37         }
    38         return tl.get();
    39     }
    40     
    41     /**
    42      * 关闭session
    43      * 从容器线程中获取session,有则关闭,且将线程容器的session清空
    44      */
    45     public static void closeSession(){
    46         SqlSession sqlSession = tl.get();
    47         if(sqlSession != null){
    48             sqlSession.close();
    49         }
    50         tl.set(null);
    51     }
    52 }
    将工厂的产生改成单例模式
     1 package com.text.util;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.util.logging.Level;
     6 import java.util.logging.Logger;
     7 
     8 import org.apache.ibatis.io.Resources;
     9 import org.apache.ibatis.session.SqlSession;
    10 import org.apache.ibatis.session.SqlSessionFactory;
    11 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    12 
    13 
    14 public class MybatisUtil {
    15 
    16     //工厂
    17     private static SqlSessionFactory factory;
    18     //类线程锁
    19     private static final Class CLASS_LOCK = MybatisUtil.class;
    20     //线程容器
    21     private static ThreadLocal<SqlSession> tl = new ThreadLocal<>();
    22     //构造器私有化
    23     private MybatisUtil(){}
    24     
    25     public static SqlSessionFactory initSqlSessionFactory(){
    26         String resource = "mybatis.xml";
    27         InputStream is = null;
    28         try {
    29             is = Resources.getResourceAsStream(resource);
    30         } catch (IOException e) {
    31             Logger.getLogger(MybatisUtil.class.getName()).log(Level.SEVERE, null, e);
    32         }
    33         synchronized (CLASS_LOCK) {
    34             if(null == factory){
    35                 factory = new SqlSessionFactoryBuilder().build(is);
    36             }
    37         }
    38         return factory;
    39     }
    40     
    41     /**
    42      * 获取session
    43      * 从线程容器中获取,没有则创建session在存放到线程容器中
    44      * @return
    45      */
    46     public static SqlSession getSession(){
    47         SqlSession sqlSession = tl.get();
    48         if(sqlSession == null){
    49             if(factory == null){
    50                 initSqlSessionFactory();
    51             }
    52             sqlSession = factory.openSession();
    53             tl.set(sqlSession);
    54         }
    55         return tl.get();
    56     }
    57     
    58     /**
    59      * 关闭session
    60      * 从容器线程中获取session,有则关闭,且将线程容器的session清空
    61      */
    62     public static void closeSession(){
    63         SqlSession sqlSession = tl.get();
    64         if(sqlSession != null){
    65             sqlSession.close();
    66         }
    67         tl.set(null);
    68     }
    69 }
     
    2.2 定义过滤器
        过滤器可以在调用方法前及方法后添加代码
     1 package com.test.filter;
     2 
     3 import java.io.IOException;
     4 
     5 import java.io.InputStream;
     6 
     7 import javax.servlet.Filter;
     8 import javax.servlet.FilterChain;
     9 import javax.servlet.FilterConfig;
    10 import javax.servlet.ServletException;
    11 import javax.servlet.ServletRequest;
    12 import javax.servlet.ServletResponse;
    13 import javax.servlet.annotation.WebFilter;
    14 
    15 import org.apache.ibatis.io.Resources;
    16 import org.apache.ibatis.session.SqlSession;
    17 import org.apache.ibatis.session.SqlSessionFactory;
    18 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
    19 
    20 import com.test.util.MyBatisUtil;
    21 
    22 
    23 /**
    24  * 最开始是由Spring框架提出的.整合Hibernate框架是使用的是OpenSessionInView
    25  * 
    26  * 
    27  * @author Administrator
    28  *
    29  */
    30 @WebFilter("/*")
    31 public class OpenSessionInView implements Filter{
    32 
    33     @Override
    34     public void init(FilterConfig filterconfig) throws ServletException {
    35         // TODO Auto-generated method stub
    36     }
    37 
    38     @Override
    39     public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)
    40             throws IOException, ServletException {
    41 //        InputStream is = Resources.getResourceAsStream("mybatis.xml");
    42 //        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
    43 //        SqlSession session = factory.openSession();        
    44         SqlSession session = MyBatisUtil.getSession();
    45         try {
    46             filterchain.doFilter(servletrequest, servletresponse);
    47             session.commit();
    48         } catch (Exception e) {
    49             session.rollback();
    50             e.printStackTrace();
    51         }finally{
    52             MyBatisUtil.closeSession();
    53         }
    54 //        session.commit();
    55 //        session.close();
    56     }
    57 
    58     @Override
    59     public void destroy() {
    60         // TODO Auto-generated method stub    
    61     }
    62 }
     
  • 相关阅读:
    UVA 10617 Again Palindrome
    UVA 10154 Weights and Measures
    UVA 10201 Adventures in Moving Part IV
    UVA 10313 Pay the Price
    UVA 10271 Chopsticks
    Restore DB後設置指引 for maximo
    每行SQL語句加go換行
    种服务器角色所拥有的权限
    Framework X support IPV6?
    模擬DeadLock
  • 原文地址:https://www.cnblogs.com/wuweibincqu/p/10382386.html
Copyright © 2011-2022 走看看