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