服务器

位置:IT落伍者 >> 服务器 >> 浏览文章

robbin 的 HttpSession 总结


发布日期:2018年06月05日
 
robbin 的 HttpSession 总结

HttpSession不是Java独有的概念JSPPHPASP都支持HttpSession偶对PHP还比较清楚JSP也比较清楚ASP没有研究过这个问题但估计和JSP一样

apache httpd server本身不支持session更多的作为一个web server仅支持少量的SSICGI功能我猜想你说的apache session大概是安装了PHP的Apachephp的session确实是每次都要在apache的临时目录建了session文件这有一定的缘故由于不像JSP有一个JVM专门开辟了一个内存区同时传统的apache在unix是进程模型进程间通讯比较困难对于进程间共享session的问题就是采取保存在硬盘上的办法只不过unix上的apache的IO效率特别高基本上不会有多少性能损失这就是你看到apache临时目录里面有很多session文件的原因

对于JSP来说在非集群环境下session是保存在JVM开辟的内存里面的那么究竟是否会使用某些算法例如LRU算法将不常用的session钝化在硬盘上呢?由于每个App Server实现不同我也不敢下断言但是就普遍情况而言是不会钝化在硬盘上的不论是Tomcat还是Weblogic都是如此其实这个问题很容易就可以想清楚session对象如果能够钝化在硬盘上必须实现序列化接口如果App Server没有要求你必须把所有session对象实现序列化接口的化就意味着肯定不会钝化到硬盘上否则App Server一钝化就很有可能报无法序列化的错误

因此session绝对不应该设为永远不过期实际上App Server也不会允许你这么做就是你在程序里面这么设也不起作用

由于大量session占用过多JVM内存导致JVM报告OutOfMemory的错误这是一个很常见的现象不管是多牛的App Server一样会中招!绝不会有例外也许某些人说这么容易中招的App Server还能在市场上混下去吗?

拿weblogic来说吧你写一个JSP就一句话 Systemexit();你运行一下Weblogic Server马上关闭换了任何App Server都得中招只有一个例外就是Resin因为resin很狡猾用一个脚本不断监视一旦发现App Server down掉立刻重起所以Resin也不是不中招而是中招以后立刻重起罢了

因此程序带来的性能问题不管多好的App Server都架不住你说JRun可以钝化到硬盘上我相信肯定有一个前提就是所有的session对象都必须可序列化否则也根本无法钝化

上一篇:httpheader的几种常用组合

下一篇:如何使用Delphi设计强大的服务器程序[2]