`
xiaolongfeixiang
  • 浏览: 236844 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Session持久化的实例分析

阅读更多

 

关于在线人数统计,大都使用SessionListener监听器实现。

 

SessionListener 触发源:

1、Session Create 时

2、Session timeout 时

3、显式调用session的invalidate方法 时

4、在Tomcat设置Session持久化为FALSE的情况下,Tomcat关闭时,触发Session destroy事件

 

5、在Tomcat设置Session持久化为TRUE的情况下,Tomcat重启后,检测到Session超时时,触发Session destroy事件(可归入第2中情况中)



如何Tomcat  Session持久化配置?

在默认的情况下,Tomcat6是提供了这项功能的。请查看$TOMCAT_HOME$/conf/context.xml。在大概24行,你会看到注释:

 

    <!-- Uncomment this to disable session persistence across Tomcat restarts -->
    <!--
    <Manager pathname="" />
    -->
 

 

这说明默认的Tomcat是支持Session持久化的。当然,取消注释也就取消了这个功能。

 

Session持久化&不持久化


如果Tomcat配置为Session的不持久化,在Tomcat关闭时,会自动触发Session destroy事件。


如果Tomcat配置为Session的持久化,在Tomcat关闭时,不会触发Session destroy事件。而是将每个Session中内容写入到文件中。当Tomcat再次启动时,会读取该参数,并且验证Session是否TimeOut(但是这个验证似乎有点延迟,大概几秒钟吧。如果检测到超时,则Tomcat会自动触发Session Destroy事件)。


失败案例分析:

最近在分析一个其他人写的应用中,发现在线人数出现负数的情况。原因是没有修改Tomcat的默认配置,因此Session的持久化功能是开启的。当Tomcat重启后,由于在线人数是Listener中的Static常量,所以重启后会归零。重启后,如果触发了Session Destroy事件,那么就会出现在线人数为负的情况。

但是,重启后用户的什么操作会触发Session Destroy事件呢?


首先,1个大前提是用户的浏览器在Tomcat重启的间隔都一直存在,且未进行其他操作。(很简单,如果在重启期间,进行任何操作的话,肯定会看到“服务器无法响应”的错误信息,自然就离开了。也就不会有以后了。。)

然后,分2种情况:

情形1: 如果Tomcat关闭的时间大于Session的超时时间。Tomcat会自动地触发Session Destroy事件。上面已经说了,这个“自动”是有延迟的。如果用户进行任何操作,都会立即触发Session Destroy事件。

情形2:如果Tomcat的关闭时间小于Session的超时时间,那么用户点击“注销”等类似的注销功能、或者Session超时,就会触发Session Destroy事件。

解决的办法:


方案1:关闭Tomcat Session 持久化的功能。取消那句注释即可。

方案2:将在线人数存放在数据库中,每次改变在线人数,都要访问数据库。(加重了数据库访问量)

 

 

小弟如果有什么分析不对之处,欢迎大家提意见!!

2
1
分享到:
评论
4 楼 wdmmjyy 2015-10-19  
我也试了修改tomcat配置的方法,还是不行
3 楼 lonyi 2011-10-24  

学习了
2 楼 gaoxiang1985 2011-08-30  
做了一个用户session的拦截,如果session过时或者session消失的时候,重新回到login登录页面重新登录。
现在是如果时间超时了,可以回到登录页面重新登录。
如果重启服务器了,session依然还在。
menu.jsp画面用
<%= request.getSession().getAttribute("LoginPerson") %>
方法可以获得loginperson。
但是从menu画面next.jsp画面。
next.jsp也有
<%= request.getSession().getAttribute("LoginPerson") %>
方法,但是获取不到loginperson。


我用了你的方法,也试了一下,也不行。还是会直接到menu画面,请问还有要注意的吗
1 楼 qingfeng825 2010-11-02  
分析得很好!

相关推荐

    基于Hibernate的Java对象持久化技术分析--农户征信管理平台的设计

    在“基于Hibernate的Java对象持久化技术分析--农户征信管理平台的设计”项目中,我们深入探讨了如何利用Hibernate来实现农户征信数据的有效存储和管理。 1. Hibernate简介:Hibernate是一个开源的ORM框架,它允许...

    Java持久化框架的选择.pdf

    以下是对常见Java持久化框架的分析和比较。 1. Entity Enterprise JavaBean (EJB) 技术 EJB技术是针对Java平台的企业版的一种托管的服务器端组件架构。在EJB架构中,应用服务器将管理一个或多个已部署的EJB的生命...

    Express-Session源码分析

    在生产环境中,我们通常需要使用持久化存储来确保session数据不会因服务器重启而丢失。例如,可以使用Redis作为session store,通过`connect-redis`中间件实现。 2. 安全性考虑 确保设置合理的`secret`值,以防止...

    Net Session购物车示例_sessiongwc.rar

    当用户在电商网站浏览商品并添加到购物车时,这些信息通常不会持久化存储,而是临时保存在服务器的Session中。这个"Net Session购物车示例"就是演示了如何通过.NET框架创建一个简单的购物车功能,利用Session对象...

    Hibernate和struts的整合架构中数据持久化技术的应用研究.pdf

    #### 实例分析 为了进一步理解这种整合架构的实际应用,以下是一个具体的例子:管理员小模块的实现。 1. **数据持久层的实现**:在数据持久层,需要使用Hibernate框架来创建数据访问对象(DAO)。首先定义实体类...

    Hibernate概述及实例分析

    【Hibernate概述及实例分析】 Hibernate 是一款在Java环境中广泛应用的对象/关系数据库映射(ORM)框架,它将复杂的数据库操作转化为对Java对象的操作,简化了数据持久化的过程。ORM技术的核心在于将对象模型(如...

    HibernateSession , Transaction 研究

    在Hibernate中,`Session`充当了应用程序与数据库之间的桥梁,它是持久化操作的主要接口。`Session`负责管理对象的状态,执行SQL语句,并处理事务。当创建一个新的`Session`实例时,它会与数据库建立一个连接。在...

    tomcat做session共享需要的全部jar包

    Memcached因其高性能和轻量级特性,在分布式环境中常被用作Session持久化存储。 5. **Minglog**: Minglog可能是一个日志记录库,它可以帮助开发者追踪和分析与Session共享相关的操作,对于调试和优化系统性能至关...

    NHibernate中的Session示例源代码

    在NHibernate中,`Session`是一个核心概念,它是数据库会话的代理,负责对象的持久化操作。下面我们将深入探讨`Session`的工作原理以及相关的源代码知识。 首先,`Session`是NHibernate的接口`ISession`的实现,它...

    重写hibernate的session简单增删改查

    Hibernate的Session是与数据库交互的主要接口,它负责对象的持久化操作,如保存、更新、删除和查询。Session提供了事务管理和缓存管理的功能,确保了数据的一致性和性能。 1. 增加(Create) 在Hibernate中,增加...

    tomcat7-redis-session共享 demo程序

    这种方式避免了传统的session复制导致的性能问题,并且使得session数据的持久化成为可能。 首先,了解Tomcat7,它是Apache软件基金会的开源Java Servlet容器,广泛用于部署Java Web应用程序。它支持Servlet、JSP和...

    weblogic集群下的session复制

    - **持久化存储**:除了内存中的复制,WebLogic还提供了将Session数据持久化到磁盘的能力,以防所有服务器同时故障。 - **复制策略**:WebLogic提供了多种复制策略,如全复制(所有节点都复制所有Session)和部分...

    session 版的BBS

    2. 服务器验证用户身份后,生成一个session ID,将其与用户信息关联,并存储在服务器的内存(或持久化存储中,如数据库)。 3. 服务器将session ID返回给客户端,通常通过设置一个名为`PHPSESSID`(或其他类似名称)...

    asp.net中session对象模式剖析

    4. **SQLServer(SQL服务器模式)**:通过这种方式,Session数据将被存储在一个SQL Server数据库中,以表的形式持久化存储。 #### 2. 不同Session模式的比较 为了更好地理解不同Session模式之间的区别,下面列出了...

    hibernate02:session对象、hql查询、在线查询也叫对象查询、离线查询

    在IT领域,Hibernate是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发者能够更加专注于业务逻辑,而不是繁琐的数据存取。本话题主要聚焦于`Hibernate02`,涵盖`Session`对象、HQL(Hibernate Query ...

    Session HashTable 购物车源代码

    3. **安全性与持久化**:由于Session数据默认保存在内存中,可能需要考虑Session溢出和服务器重启导致的购物车信息丢失问题。一种解决方案是定期将Session数据持久化到数据库或文件系统中。 4. **性能优化**:在高...

    Hibernate源码解析(三)

    `Session`是Hibernate工作流程中的重要角色,它负责持久化对象与数据库之间的交互。通过`Session`,开发者可以执行查询、保存、更新和删除操作。源码解析可能会揭示`Session`内部的事务管理、缓存机制以及如何封装...

    将PHP的session数据存储到数据库中的代码实例

    然而,在分布式服务器环境或者需要持久化存储session数据以便将来分析的场景下,开发者往往会选择将session数据存储在数据库中。 在这个文档中,作者提供了两种实现将PHP session数据存储到数据库的方法,分别适用...

    EJB2 SessionBean

    在实践中,EJB2 SessionBean通常与EntityBean(持久化实体)和Message Driven Bean(消息驱动bean)配合使用,构建完整的Java EE应用程序。EntityBean处理数据库操作,SessionBean执行业务逻辑,而Message Driven ...

Global site tag (gtag.js) - Google Analytics