一次请求中,经过多次转发会有几条线程?
做了个测试,在MyBatisUtility工具类依赖ThreadLocal来设置获取或者删除 SQLSession,
在Service层中有一个类,类中的两个方法都使用了MyBatisUtility,(MyBatisUtilit.getSqlSession设置为成员变量)
在Servlet包下有两个Servlet相互转发,a转发给b,b在转发给index.jsp。(a、b都访问Service中的这个方法)
在第二刷新访问a 时,报出Executor was closed的错误,查看后发现,第二次 访问时 SQLSession 不存在。
如果我将MyBatisUtilit.getSqlSession设置为局部变量 就不会报错。
问题:多次转发下是不是开启多条线程?导致了ThreadLocal 中的 get() 方法获取不到 SQLSession?还是其他原因?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
成员变量被线程共享,第一次请求结束session被关闭,且第二次请求使用时又没通过MyBatisUtilit.getSqlSession重新获取session,所以在使用一个被关闭的session时报出Executor was closed错误
tomcat应该是一个请求一个线程,如果你做了redirect肯定是在不同线程中处理,如果你只是forward,应该还是同一个线程。