最近在站点上加了个记数器,结果老是出现负数,百思不得其解。一查,原来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溢出(即转换值为负数)
MATLAB中负数8位二进制与10进制之间的转换
java 进制转换,二进制 十进制 十六进制 正数 负数的进制等等!.docxjava 进制转换,二进制 十进制 十六进制 正数 负数的进制等等!.docx
负数测试 对负数进行判断
修正了前版本不能转换负数的形式,修正了负数时产生的问题
Matlab负数十进制转二进制代码 对于基础有用
项目里需要将人民币转换为大写,有时可以输负数,保留两位小数
自写进制转换(可正可负,可带小数).rar 自己写的。还有很多地方可能需要修改。 可以在二,八,十,十六...负数。小数都可以。 但是负数与小数没有同时存在进行转换。 如果有人完成。可以联系。 大家共同学习进步。
获取字符的码值,包括中文。 进制转换包括:十进制(整数/小数/负数)转成二进制、八进制、十六进制。 供需要学习Java基础的朋友参考学习。
excel表格中负数的人民币金额怎么转换成大写.docx
十六进制转换成二进制,处理负数,二进制最高位是1表示负数,0表示正数。源代码,已测试,
(word完整版)Matlab负数十进制转二进制代码.doc
遗传算法(GA),带模拟退火处理方式,带适应度为负数时,选择的处理方式。大家可以参考一下,及时交流。遗传算法(GA),带模拟退火处理方式,带适应度为负数时,选择的处理方式。大家可以参考一下,及时交流。遗传...
WinForm 中输入负数验证 C# 中textBox输入负数验证
易语言取随机负数源码,取随机负数,取随机数增强
Excel批量转换负数为正数.doc
通过excel的Frequency 函数 实现 连续正数,负数 最大次数统计 的小案例 公式为数组公式 输入完公式后 按 Ctrl+Shift+ Enter 公式才成立生效 连续为正数的次数 方法1 =MAX(FREQUENCY(IF(SIGN(B2:B31)+1,ROW(2:31)...
通过js获取table某一列 td 里面的值,并将其正数变成负数 负数变成正数