BBS水木清华站∶精华区

发信人: vago (无中生有), 信区: Java        
标  题: Re: java.lang.OutOfMemoryError? 
发信站: BBS 水木清华站 (Wed Jan 17 15:07:58 2001) 
 
正是因为thread的开销太过昂贵,所以为每个登录用户分配一个thread的方案在 
后不适合了(扩充性太差)。 
面向持久连接的client/server程序并不意味着一定要使用持久的socket连接,这是 
两个层面的东西,事实上,设计良好的c/s程序一开始就要定义自己的通讯协议,同样 
也要决定是否连接是否有状态,只要可以追踪client的状态历史就可以被认为是面向 
连接的。 
应用程序的通讯协议完全取决于程序自身的需要和设计,其可以在任何一种底层通讯 
协议上进行封装,无论是tcp还是http(事实上http也是在tcp之上的协议)。 
 
提问题的兄弟的程序无疑是有状态的,他要的用户连接无疑是终端用户登录建立的连接 
和tcp的socket的连接没有多大的逻辑关系,通过一对一的socket的持久连接的确可以 
满足应用程序的功能要求(很直观嘛),但另外我们另外还有n种方案满足他的要求, 
java中还有rmi,servlet 
 
java中的thread是针对一个代码段的,jdk中实现的socket的i/o之所以是block的,我想 
是因为i/o的native的实现对于thread是atomic的。但这一点也不与是使用一个threadpool 
冲突,只要绕开那段i/o就可以了(就是不要让应用程序的逻辑依赖那段i/o) 
 
socketpool + threadpool + connectionpool,这也是目前比较流行的方案了。 
 
为每一个用户分配一个socket,为每一个socket分配一个thread绝不是逻辑上的必然, 
甚至是一个应该摒弃的方案。 因为可扩充性实在太差。 
 
NBIO是native的,native除非必要不要使用,因为那会给java程序带来一场恶梦。 
 
【 在 kasper (回来了) 的大作中提到: 】 
 udp的服务器用这种方法是可以的,但是TCP持久连接的服务器用Threadpool也没用的, 
 因为每个socket都是阻塞的,必须有一个线程对应一个socket,同时有1000个用户连接, 
 就得有1000个thread。 
 当然这个前提是用blocking socket,前面我说的non-blocking的socket可以用来解决 
 这个问题。 
 tomcat里用threadpool,主要是因为thread创建开销大,http是短时连接的协议,所以 
 用threadpool可以去掉每次连接都创建thread的开销。 
 
 
-- 
 
A: B在撒谎 
B: A说得对 
 
 
※ 来源:·BBS 水木清华站 smth.org·[FROM: 211.101.134.245] 

BBS水木清华站∶精华区