最近在站点上加了个记数器,结果老是出现负数,百思不得其解。一查,原来tomcat默认开启了session的持久化,也就是说关掉tomcat后session还存在,在启动tomcat时会重新加载这些session,而对应些session的用户可能早就关掉浏览器或session己经过期,而存在application中的记数器却己经为0了。也就是说有session存在计数器却为0,那么当这些session过期时触发destory方法,就会倒致计数器为负了。
下面这篇文章说的很清楚了:
地址:http://xiaolongfeixiang.iteye.com/blog/560800
关于在线人数统计,大都使用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行,你会看到注释:
这说明默认的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:将在线人数存放在数据库中,每次改变在线人数,都要访问数据库。(加重了数据库访问量)
分享到:
相关推荐
将正数转换成负数,负数转换成正数, int main(int argc, char* argv[]) { float k; c.f=-10; k=0-c.f; printf("k=%f\n",k); printf("Hello World!\n"); return 0; }
当long类型的时间戳转换为int类型时,如果long值超过了int能表示的最大值(2^31 - 1,即2,147,483,647),就会发生溢出,转换后的结果会变成负数。例如,在提供的代码片段中,`int intTimeStamp = (int) ...
一段代码,队列,实现负数赶正数的功能
Matlab 负数十进制转二进制代码 Matlab 是一个功能强大的编程语言,广泛应用于科学计算、数据分析和可视化等领域。在 Matlab 中,对十进制数的二进制表示是一个非常重要的操作。然而,Matlab 的内置函数 dec2bin ...
在编程和计算领域,负数测试是一个常见的任务,特别是在处理数学运算、数据分析或者逻辑判断时。这个主题主要涉及如何正确地识别和处理数值中的负数情况。以下是对负数测试的详细阐述: 首先,让我们理解什么是负数...
MATLAB中负数8位二进制与10进制之间的转换
"数制互转换v0.2(支持负数)"这个项目显然关注的是实现不同数值系统之间的转换,特别是增加了对负数的支持。这涉及到二进制、八进制、十进制和十六进制等常见数制之间的转换。 在前一版本中,可能存在无法处理负数的...
如果session销毁时计数器显示在线人数为0,则将其重置为1,避免出现负数。 - 使用`@WebListener`注解标注监听器类,以确保监听器可以被Spring boot自动检测并使用。 - 如果是在传统的Java Web应用中,则需要在web....
在处理负数时,无论是从十六进制转二进制还是直接处理二进制,都要记住最高位的符号位规则。源代码中可能包含了这样的逻辑,首先将十六进制转换为二进制字符串,然后检查最高位,根据需要应用补码规则。这个过程可能...
Matlab 负数十进制转二进制代码 在 Matlab 中,进行十进制到二进制的转换可以使用 dec2bin 函数,但是该函数只能对正数进行转换。为了实现负数的十进制到二进制的转换,需要使用补码表示法。 在本代码中,我们编写...
Excel 批量转换负数为正数 Excel 批量转换负数为正数是指在 Excel 表格中将大量的负数转换为正数,以便于更方便地进行数据分析和处理。以下是相关的知识点: 1. ABS 函数:ABS 函数是 Excel 中的一个数学函数,...
这篇文章将深入探讨这些主题,特别是针对Java编程语言。 首先,我们来谈谈字符的码值。码值是每个字符在计算机内部表示的数值。对于英文字符,我们通常使用ASCII码,它是一个7位的二进制编码系统,包含了128个不同...
- **随机负数的边界处理**:确保生成的随机负数不会超过指定的负数边界,避免出现无效值。 通过理解和应用这些方法,你可以根据实际需求在易语言中灵活地生成各种随机负数,从而提升你的程序功能和性能。在开发过程...
这个过程涉及到将数字转换成符合人类阅读习惯的货币格式,包括添加逗号分隔符,处理负数,以及在必要时添加前导零。本文将深入探讨如何实现这一功能,并结合标签"源码"和"工具",给出一个实用的解决方案。 首先,...
本文将深入探讨如何使用C++实现二进制(Binary)、十六进制(Hexadecimal)和十进制(Decimal)之间的相互转换,同时涵盖小数和负数的处理。 一、十进制与二进制转换 1. 十进制转二进制:可以采用除2取余法。将十...
自写进制转换(可正可负,可带小数).rar 自己写的。还有很多地方可能需要修改。 可以在二,八,十,十六...负数。小数都可以。 但是负数与小数没有同时存在进行转换。 如果有人完成。可以联系。 大家共同学习进步。
本文主要讨论了负数在二进制系统中的表示方法,以及如何通过原码、反码和补码进行减法运算。理解这些概念对于深入理解计算机底层运算至关重要。 首先,计算机中的负数是通过一个额外的符号位来表示的。在二进制数中...
Excel 中负数的人民币金额转换为大写的公式应用 在财务记账中,经常会遇到负数的金额,而 Excel 的单元格格式设置无法满足要求。本节将提供一个可供负数、正数使用的函数公式来将人民币金额转换为大写。 公式解析 ...
而当2号公交车有6个人下车时,人数减少,我们用负数来表示这个变化。 在古代中国,负数的概念已有悠久的历史。据《九章算术》记载,大约2000多年前,中国人已经使用“粮食入仓为正,出仓为负;收入的钱为正,付出的...
遗传算法(GA),带模拟退火处理方式,带适应度为负数时,选择的处理方式。大家可以参考一下,及时交流。遗传算法(GA),带模拟退火处理方式,带适应度为负数时,选择的处理方式。大家可以参考一下,及时交流。遗传...