……,可以看不起自己,但永远不要轻视别人。

ibm提供的是一个完整的企业级解决方案。如果有一个中央子系统,加上几十个分布子系统站群系统,这时候你拿tomcat那不是找罪受么。

websphere, weblogic好,当然好,动不动就10k美刀/cpu的价,不好行么?

但是开源的不要钱的不一定不好,拿我熟悉的说:
linux,好,说不好的请举手~ 我一年前托管的linux主机还up着呢
jboss/tomcat,已经被mac os x集成了
mysql,感觉还行,就是对unicode支持不好,希望4.1赶紧出来

偶十分佩服你们钻研不懈的学习精神,偶终于忍不住要发表一下意见。

AreYouOK说的是对的,sinio_feng 说的是不对的。

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

sinio提到的Apache的session的说法是不对的,apache httpd server本身不支持session,更多的作为一个web server,仅支持少量的SSI,CGI功能。我猜想你说的apache session大概是安装了PHP的Apache。php的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,就一句话 System.exit(0);,你运行一下,Weblogic Server马上关闭,换了任何App Server都得中招,只有一个例外,就是Resin。因为resin很狡猾,用一个脚本不断监视,一旦发现App Server down掉立刻重起。所以Resin也不是不中招,而是中招以后立刻重起罢了。

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

AreYouOK? 试验中为什么这么容易OutOfMemory,是因为你的512M内存真正被JVM拿来用的其实很少。你可以在Tomcat启动脚本里面使用 -Xms384 -Xmx384设定JVM分配384MB内存再试试,保证没那么容易OutOfMemory了。

至于为什么每次分配20MB内存,我还没有想明白。你换成String试试看。


我没有说webshpere怎么不好
我是说“一个中央子系统,加上几十个分布子系统站群系统”这样的情况并不多

我说的我讨厌这种作风是指
有的时候,有些人(特别是一些小公司里面)用了一些JSP,然后自封为J2EE企业级应用,到客户那里去吹嘘……

9494,开源的不一定不好。linux是很好。

但其它几个就罢了。当中最气的是mysql,几乎什么都支持,仅仅存数据。但数据超过百万级,就几乎和崩溃了查不多,性能大幅下降。做了一个项目使用的mysql快把我气吐血了。

这些东西做些小东西可以,但哪这些出去投标政府的大型MIS系统和给一些大企业做项目集成应用,估计仅因为技术方案就会被枪毙掉。

OSS的数据库中,不论MySQL还是PostgreSQL,都不足以承担企业级应用,不过有一个真正的OSS企业级数据库你们可能都没有注意到,就是SAPDB。

http://www.sapdb.org/

SAPDB支持的数据库功能完全兼容Oracle7.x,高级的数据库功能全都有,其性能完全足以和Oracle,DB2等商业级数据库媲美,并且SAP有些系统就是在SAPDB上面运行的,可见其稳定性。(SAPDB的高可靠性HP公司内部花了很多银子做过测试,我一个HP的朋友参与其中,告诉我的。)

SAPDB的缺点是查询速度相对比较慢,比MySQL和Oracle都要慢一些,在大规模的集群环境下可扩展性不如Oracle,DB2这些东东。

目前SAPDB已经被SAP公司捐赠给MySQL了。希望Tcx公司不要把SAPDB给毁了。

钝化和session的缓存没有关系。


对于缓存,偶常做的是小量数据会开一个内存的缓冲区,大量数据会直接写道硬盘上,缓冲区内留一个索引。

robin说的序列化的事提醒我了,HttpSession确实没有implements Serializabe。所以不能保存的硬盘上。一针见血。

sinio:
如果ws/wl是面向大客户,大项目的,那么自然有面向小客户小项目的AS存在。不要只盯着大客户,“3年不开张,开张吃3年”;关注小客户一样有丰厚的回报,1毛钱的短信使电信一年赚4亿呢。

如果投标大项目时报上tomcat,那就是投标人的脑问题了。反过来给小客户上ws/wl也一样。

》》至于为什么每次分配20MB内存,我还没有想明白。你换成String试试看。
逍遥兄,我忘了String是Unicode的了,一个char2字节,正好
换成String是不行,没有办法一次生成那么大一个字符串,循环的中间过程会生成很多垃圾并且可能不会立刻被收集调

论题结束吧,已经跑题了。再说也没什么意思了。

> 对于缓存,偶常做的是小量数据会开一个内存的缓冲区,大量数据会直接写道硬盘上,缓冲区内留一个索引 <

这有什么区别,你如何把大量"数据"写到硬盘上?这里的数据是什么呢?难道你可以把session对象的属性剥离出来作为数据单独保存?这基本上不可能实现。那么还是要把session对象写到硬盘上的呀,还不是必须可序列化?

HttpSession没有实现序列化接口,但只要服务器特定的子类能实现,就可以序列化到硬盘上,不过我始终认为服务器把session放到硬盘上是没有什么意义的

System.exit(0)的问题,那是因为对这段代码授予了完全的权限
是可以解决的,可以让webapp在沙箱中运行

我觉得sinio_feng可能是在session中保存一个id,把该id对应的大量数据存在硬盘上
不过这并不表示session在硬盘上

那相当于自己做了硬盘版的session implement。

话题已经跑远了。
就说session实现不用钝化的一种技术方案。

钝化是什么,钝化不过是把一个对象序列化存储而已。序列化也只是对对象的属性的存储,并不是什么很难的东西。

难道说在Java/c++这些面向对象语言之前,在出现钝化这个概念之前,就没有数据的缓存了。不明白为什么一个对象不能钝化就不能缓存。

如果只是在内存中保留session id, session的具体内容写入磁盘为什么不可以。
当然激活的session为了性能的考虑可以驻留内容,但没有激活的session写入磁盘是很正常的一种策略。这也是为什么有些服务器即使重新启动了,但只要保留有用户的session id 下次还可以取道此用户的session的原因。