遇到的问题
如果我们做一个请求时候多次使用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.}