01 遇到的问题
–如果我们做一个请求时候多次使用sqlsession对象这样就会造成sqlsession 浪费,也就是资源浪费,效率也会降低
–我们需要达到的目的就是用户发出的一个请求中实现sqlsession的共享
–请求没有改变,线程就不会改变
–最终的目的就是在同一个线程中实现数据sqlsession的共享
02解决方案
ThreadLoacl: 作用 在同一个线程中实现数据(sqlsession)的共享
底层使用的map集合 map.put(key,value);
map.put(线程的ID,conn)
03代码实现
public class DBUtil { private static SqlSessionFactory factory; private static ThreadLocal<SqlSession> tl=new ThreadLocal<>(); static { InputStream inputStream = null; try { //[1]解析myBatis.xml文件 inputStream = Resources.getResourceAsStream("mybatis.xml"); //[2]获得sqlsession工厂 factory=new SqlSessionFactoryBuilder().build(inputStream); } catch (IOException e) { e.printStackTrace(); } } //获得sqlsession对象 public static SqlSession getSqlSession(){ //获得ThreadLoacl中的sqlsession对象 SqlSession sqlSession = tl.get(); if(sqlSession==null){ sqlSession = factory.openSession(true); //把创建好的对象放到ThreadLoacl tl.set(sqlSession); } return tl.get(); } //关闭sqlsession public static void closeAll(){ SqlSession sqlSession = tl.get(); if(sqlSession!=null){ sqlSession.close(); } tl.set(null); } }