本节课的问题
本节课用到了ThreadLocal,ThreadLocal会为里面的变量创造副本,因为SqlSession是一个公共变量,为了解决线程不同步的问题引入了ThreadLocal ??
但是为什么并没有真正用到ThreadLocal,sqlSession的释放最终还是通过方法内部的finally语句执行的,那么问题来了,如果我这个数据库被多个客户端通过服务器访问到,怎么保证数据的同步,也许一个用户正在使用sqlSession查询数据,但是另一个用户已经把sqlSession关闭了.
正在回答
对呀,你调用一次getSession方法,就会获得一个新的SqlSession的,祝学习愉快~
这是本节课的代码,本节课提到一个多次点击查看但是显示的是同一个用户问题:
但是findAll和findById用的是同一个session,照这个逻辑,index页面已经使用了findAll方法,sqlSession已经被关闭了,但是这个问题为什么在detail里面才暴露出来:
上图是跳转到index页面的,此时userDao是FindAllServlet的userDao
上图是findById的,userDao也是新建的,但是虽然userDao是新建的,他们获取sqlSession的方法是一致的,也就是应该是同一个sqlSession,前者在findAll之后就关闭了,为什么不影响detail的第一次查看呢?
同样detail的第二次查看出现的问题,应该第一次查看就该出现啊?
1、ThreadLocal是线程本地变量工具类,可以防止各个线程之间的变量互不干扰,适用于高并发编程,一般用来解决数据库连接、Session管理等,在老师的案例中,只是提了一下可以用这个ThreadLocal类,实际上并没有将SqlSession放进ThreadLocal中,所以它是与当前案例没有影响的。
2、你的使用场景就可以用ThreadLoacl来解决,当很多线程需要多次使用同一个对象,并且需要该对象具有相同初始化值的时候建议使用ThreadLocal。祝学习愉快~
相似问题
登录后可查看更多问答,登录/注册
- 参与学习 人
- 提交作业 277 份
- 解答问题 4297 个
Java数据库开发的必备技能,从流行的MySQL数据库开始,到Java原生的数据库管理接口JDBC的使用,再到常用的数据持久化框架MyBatis,让你向Java工程师的目标又迈进了一步!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星