工具类:mybatis中使用Threadlocal开启session及关闭session
程序员文章站
2022-05-14 09:43:49
1、线程容器,给线程绑定一个Object 内容,后只要线程不变,可以随时取出. 1.1 改变线程,无法取出内容. 1 final ThreadLocal threadLocal = new ThreadLocal<>(); 2 threadLocal.set("测试"); 3 new Thread( ......
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 }
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 }
上一篇: 看儿子的书
下一篇: 分布式缓存Hazelcast案例一