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水木清华站∶精华区