关于对象池的疑问

上次在banq的一篇文章中看到:banq大哥其实不提倡使用spring这种单例方式来控制资源,他建议对于业务bean使用对象池技术,数据bean使用缓存,还说使用单例不够,请问banq大哥,你说的数据bean是指查询数据后返回的pojo对象吗?对象池对于频繁使用的对象控制创建的次数,有个条件,如果这个对象创建时开销并不是很大,就没有必要使用对象池,统常一个业务bean创建时根本没有什么开销,使用spring单例管理就行了,还用什么对象池,对于数据bean,如果使用hibernate的时候,hibernate已经有二级缓存,所以使用spring+hibernate就可以解决并发量的问题,请banq说明

>如果这个对象创建时开销并不是很大,就没有必要使用对象池
可以这么考虑。我也没说不赞成单例 Jdon框架也使用单例

要注意单例和POOl对于控制资源的作用,POOL有最大值,这样能够阻击超过服务器极限的峰值访问,而单例则不能,这就是为什么现在我们又需要单例又需要POOL的原因。

另外单例如果加同步会将多用户系统变成单用户,这些都是潜在的危险,而POOL则为每个线程开辟专用通道。


[该贴被banq于2007-11-01 15:28修改过]

>如果按照一个来说,单例一个,那么就只能一个线程也就是一个用户通过访问了,那不是单用户系统吗?

没错,POOL最大10个,10用户同时来,马上分配,这是多任务,但是如果使用将业务bean使用单例,不管有多少个用户/线程来,都会去调用这一个实例,就像在tomcat下的servlet一样,不管有多少个请求来,servlet的实例总是一个,你是什么意思?

>这样能够阻击超过服务器极限的峰值访问,而单例则不能
为什么?单例总是一个,POOL还得多个的可能,怎么会有超过服务器极限的峰值访问

>如果按照一个来说,单例一个,那么就只能一个线程也就是一个用户通过访问了,那不是单用户系统吗?

pool我是知道怎么会事,如果pool最大10,我可以将10个业务bean放进去,如果有10用户来,我马上分配出去,这样不错,但如果此业务bean作为单例,不管有多少个用户(jsp线程)来,它总是调用这一个单实例,有什么关系?就像tomcat下的servlet,不管有多少个请求来,servlet总有一个实例,是供多个线程调用,你想说什么?

如果按照一个来说,单例一个,那么就只能一个线程也就是一个用户通过访问了,那不是单用户系统吗?

你对POOL机制没有了解,假设POOL有最大值10个,那么并发10个用户请求进来时,POOL中十个实例全部被分配出去了。如果并发来11个请求,POOL中只能分配10个,第11个就只能等待,等10个一个用完归还Pool才可以再借出来用,这样不是保护你的服务器了吗?如果你服务器CPU和内存最大只能支撑10个并发用户,如果来15或者200个请求,马上击溃服务器。

>不管有多少个用户/线程来,都会去调用这一个实例
对,不管多少用户都会调用单例,这样就可能超过服务器的处理极限,击垮服务器了啊,就相当于撑死了。

所以,既不能服务器饿着,也不能服务器饱死。

呵呵,banq大哥一直提倡在业务层使用pool的原因是不想把并发用户的个数限制局限在前端服务器,pool不但可以对请求作限制,同时也对内存资源作了限制,这样应用系统才具有很强的可升缩性,不至于在人多的时候死机,当然了,如果前端Server设置了pool最大数,业务层就可以使用单例了

Bang:可否举个例子,在一个web系统当中,做服务端的时候,在什么情况下你用到了pool。

主要是,我不太用pool除了这次写服务器软件的时候我用了pool。

但是一般的web项目当中服务端,倒是没用到。

Service类在整个项目中单例就够了。 domain model我觉得把他们放入到cache当中就可以了。