ejb的性能问题

banq大哥一直提倡在业务层使用自己的pool,而不注张在业务层使用单例,这使我想起一个事情,在ejb中,ejb的无状态bean最多维持3-5实例,有可能多个线程调用的是同一个bean实例(这有点像spring的单例)如果有100个并发用户,系统让无法接受,表面上ejb是并发,实际上是对你的并发做了处理的,访问时需要排队的,实际上并不是并发,那么我想请教banq大哥,在高峰时期,ejb在性能上是怎么处理的?

>ejb的无状态bean最多维持3-5实例,有可能多个线程调用的是同一个bean实例(这有点像spring的单例)

ejb无态bean是ejb服务器使用POOL机制支持,这样不用ejb开发者操心,这就是和spring的区别,其实ejb这个也有些约定大于配置的意味,缺省先给你做好。

对呀,ejb服务器使用POOL来保持那3-5个BEAN,但用户很多,就有可能同一个无态BEAN被不同的用户使用,但是又一想,如果100多个并发,甚至更多并发,那其不是用户要等个半天,关于这方面的性能问题,是如何处理的?是不是使用集群处理的,如果是集群,那也就5-6台机器差不多了,如果有600个并发,第台是100个,还是不行呀,用户还要等个半天,请教banq怎么回事

>ejb无态bean是ejb服务器使用POOL机制支持,这样不用ejb开发者操心,这就是和spring的区别

使用spring时,前端服务器本身就有Thread pool,配一下,MaxThread就行了,spring专注业务,而且,现在的TOMCAT等,本身已经有pool的控制机制了,如:
<Connector
port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" /> 这不就是Thread POOL配制吗?有了它,业务层就不用管了

>现在的TOMCAT等,本身已经有pool的控制机制了
照你这个逻辑,那也不必使用数据库的连接池connection pool。POOL作用有很多方面,考虑问题不能在一个问题上钻牛角尖。

如果只是限制最大并发访问,配置tomcat是可以的,但如果考虑到程序的健壮性和兼容性,考虑到业务层不只是接受servlet访问,也可能接受RMI等客户端直接访问,只是配置tomcat的POOL就如同程序中hardcode了Oracle的专有SQL了。

另外,并发20个用户已经是一个中型网站的访问量,并发表示在某个时刻同时有20个请求,每个请求如果处理时间1秒,那么发生20并发可能性就很极低(打个比喻,一个4条高速公路发生四条道路都有并行车时的概率需要多少车辆流量才会发生呢,假设时速是120公里?),并发到100或600也只有新浪 ebay等全球大网站,这些网站当然需要使用集群技术。

你买本master EJB中译本看看,了解一下无态Bean的POOL机制。关于POOL该说的我已经都说了,以后就不和你讨论了,你不可能一下子理解,甚至不同意我提倡POOL的观点,这些都需要经验和积累,就象初学者看我说话要么看不懂,要么觉得很空的原因。

[该贴被banq于2007-11-17 18:15修改过]

谢谢banq大哥,我明白了