ThreadLocal

遇到的问题

   如果我们做一个请求时候多次使用sqlsession对象这样就会造成sqlsession 浪费,也就是资源浪费,效率也会降低

   我们需要达到的目的就是用户发出的一个请求中实现sqlsession的共享 

   请求没有改变,线程就不会改变 

   最终的目的就是在同一个线程中实现数据sqlsession的共享 

解决方案

   ThreadLoacl: 作用  在同一个线程中实现数据(sqlsession)的共享 

   底层使用的map集合  map.put(key,value); 

                      map.put(线程的ID,conn) 

代码实现

1.public class DBUtil {  
2.  
3.     private   static SqlSessionFactory factory;  
4.  
5.     private  static ThreadLocal<SqlSession>  tl=new ThreadLocal<>();  
6.  
7.      static {  
8.          InputStream inputStream = null;  
9.          try {  
10.              //[1]解析myBatis.xml文件  
11.              inputStream = Resources.getResourceAsStream("mybatis.xml");  
12.              //[2]获得sqlsession工厂  
13.               factory=new SqlSessionFactoryBuilder().build(inputStream);  
14.          } catch (IOException e) {  
15.              e.printStackTrace();  
16.          }  
17.      }  
18.      //获得sqlsession对象  
19.      public  static SqlSession   getSqlSession(){  
20.  
21.          //获得ThreadLoacl中的sqlsession对象  
22.          SqlSession sqlSession = tl.get();  
23.  
24.          if(sqlSession==null){  
25.  
26.               sqlSession = factory.openSession(true);  
27.  
28.               //把创建好的对象放到ThreadLoacl  
29.               tl.set(sqlSession);  
30.          }  
31.  
32.          return  tl.get();  
33.      }  
34.  
35.  
36.      //关闭sqlsession  
37.  
38.    public  static    void     closeAll(){  
39.  
40.        SqlSession sqlSession = tl.get();  
41.  
42.        if(sqlSession!=null){  
43.  
44.            sqlSession.close();  
45.  
46.        }  
47.        tl.set(null);  
48.    }  
49.  
50.}  

  

posted @ 2021-01-19 12:54  巧克力曲奇  阅读(82)  评论(0编辑  收藏  举报