JSP Session管理(ThreadLocal)(国外英文资料).docVIP

  • 6
  • 0
  • 约8.61千字
  • 约 18页
  • 2017-07-06 发布于河南
  • 举报

JSP Session管理(ThreadLocal)(国外英文资料).doc

JSP Session管理(ThreadLocal)(国外英文资料)

JSP Session管理(ThreadLocal) JSP会话管理(ThreadLocal) 在各种会话管理方案中,模式得到了大量使用ThreadLocal是ThreadLocal。 java中一种较为特殊的线程绑定机制。通过ThreadLocal存取的数据,总是与当前线程相关, 也就是说,JVM为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出 现的并发访问问题提供了一种隔离机制。 首先,我们需要知道,SessionFactory负责创建会话,SessionFactory是线程 安全的,多个并发线程可以同时访问一个SessionFactory并从中获取实例而会话。 会议并非线程安全,也就是说,如果多个线程同时使用一个会话实例进行数据存取, 则将会导致数据存取逻辑混乱下面是一个典型的servlet,我们试图通过一个类会话。 变量会话实现会话的重用,以避免每次操作都要重新创建: 公共课testservlet扩展HttpServlet { 私有会话; public void doGet(HttpServletRequest请求, httpservletresponse响应) 抛出IOException {返回, 会议= getsession(); dosomething(); flush()会话; } dosomething() { public void /基于会话的存取操作 } } 代码看上去正确无误,甚至在我们单机测试的时候可能也不会发生什么问题,但这样的代 Hibernate开发指南1版 2004年9月2日这么多开源项目。为什么不打开你们的文件呢? 码一旦编译部署到实际运行环境中,接踵而来的莫名其妙的错误很可能会使得我们摸不找头脑。 问题出在哪里? 首先,运行是多线程的而应用服务器并不会为每个线程都创建一个Servlet Servlet, 实例,也就是说,testservlet在应用服务器中只有一个实例(在Tomcat中是这样,其他的 应用服务器可能有不同的实现),而这个实例会被许多个线程并发调用,doGet方法也将被不 同的线程反复调用,可想而知,每次调用doGet方法,这个唯一的testservlet实例的 会议变量都会被重置,线程一的运行过程中,其他的线程如果也被执行,那么会话 的引用将发生改变,之后线程一再调用会话,会话与其之前所用的可能此时的 会议就不再一致,显然,错误也就不期而至。 的出现ThreadLocal,使得这个问题迎刃而解。 我们对上面的例子进行一些小小的修改: 公共课testservlet扩展HttpServlet { 私人ThreadLocal localsession =新threadlocal(); public void doGet(HttpServletRequest请求, httpservletresponse响应) 抛出IOException {返回, localsession集(getsession()); dosomething(); flush()会话; } dosomething() { public void 会话的会话(session)localsession get() =; /基于会话的存取操作 } } 可以看到,localsession是一个ThreadLocal类型的对象,在doGet方法中,我们 通过其集方法将获取的会话实例保存,而在做方法中,通过得到方法取 出会话实例。 这也就是ThreadLocal的独特之处,它会为每个线程维护一个私有的变量空间。实际上, 其实现原理是在JVM中维护一个地图,这个地图的关键就是当前的线程对象,而价值则是 线程通过ThreadLocal。集方法保存的对象实例。当线程调用得到方法时ThreadLocal, 会根据当前线程对象的引用ThreadLocal,取出地图中对应的对象返回。 这样,ThreadLocal通过以各个线程对象的引用作为区分,从而将不同线程的变量隔离开 来。 Hibernate官方开发手册的示例中,提供了一个通过ThreadLocal维护会话的好 榜样: 公共类HibernateUtil { 私有静态SessionFactory SessionFactory; 静态{ 尝试{ //创建SessionFactory SessionFactory =新 configuration()。configure()。buildsessionfactory(); } catch(更改前){ 抛出RuntimeException( “配置问题:如“+ getmessage(), 前任 ); } } public static final ThreadLocal会话=新threadlocal(); 公共静态会

文档评论(0)

1亿VIP精品文档

相关文档