本节课的问题

本节课的问题

本节课用到了ThreadLocal,ThreadLocal会为里面的变量创造副本,因为SqlSession是一个公共变量,为了解决线程不同步的问题引入了ThreadLocal ??

但是为什么并没有真正用到ThreadLocal,sqlSession的释放最终还是通过方法内部的finally语句执行的,那么问题来了,如果我这个数据库被多个客户端通过服务器访问到,怎么保证数据的同步,也许一个用户正在使用sqlSession查询数据,但是另一个用户已经把sqlSession关闭了.

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

对呀,你调用一次getSession方法,就会获得一个新的SqlSession的,祝学习愉快~

http://img1.sycdn.imooc.com//climg/5c2f3d910001995006200292.jpg

提问者 楚楚提 2019-01-04 17:59:36

http://img1.sycdn.imooc.com//climg/5c2f2d5200016be510110746.jpg

这是本节课的代码,本节课提到一个多次点击查看但是显示的是同一个用户问题:

但是findAll和findById用的是同一个session,照这个逻辑,index页面已经使用了findAll方法,sqlSession已经被关闭了,但是这个问题为什么在detail里面才暴露出来:

http://img1.sycdn.imooc.com//climg/5c2f2de50001583111330198.jpg

上图是跳转到index页面的,此时userDao是FindAllServlet的userDao

http://img1.sycdn.imooc.com//climg/5c2f2e110001363411330280.jpg

上图是findById的,userDao也是新建的,但是虽然userDao是新建的,他们获取sqlSession的方法是一致的,也就是应该是同一个sqlSession,前者在findAll之后就关闭了,为什么不影响detail的第一次查看呢?

同样detail的第二次查看出现的问题,应该第一次查看就该出现啊?

  • 提问者 楚楚提 #1
    难道说openSession这个方法每次返回的都是不同的session?
    2019-01-04 18:36:26
chrismorgen 2019-01-04 14:13:43

1、ThreadLocal是线程本地变量工具类,可以防止各个线程之间的变量互不干扰,适用于高并发编程,一般用来解决数据库连接、Session管理等,在老师的案例中,只是提了一下可以用这个ThreadLocal类,实际上并没有将SqlSession放进ThreadLocal中,所以它是与当前案例没有影响的。

2、你的使用场景就可以用ThreadLoacl来解决,当很多线程需要多次使用同一个对象,并且需要该对象具有相同初始化值的时候建议使用ThreadLocal。祝学习愉快~

  • 提问者 楚楚提 #1
    还有一个问题,不方便贴图,在回答里面,麻烦看一下
    2019-01-04 17:54:07
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Java数据库开发与实战应用2018版
  • 参与学习           人
  • 提交作业       277    份
  • 解答问题       4297    个

Java数据库开发的必备技能,从流行的MySQL数据库开始,到Java原生的数据库管理接口JDBC的使用,再到常用的数据持久化框架MyBatis,让你向Java工程师的目标又迈进了一步!

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师