日期:2014-05-18  浏览次数:20704 次

关于Spring的一个问题
现在正在看Spring in action这本书,没看完呢
现在有一个疑问,Spring的DI(依赖注入)其中用到了工厂模式吧,现在由Spring管理的Bean要么设单例(Singleton)只有一个,要么是(Prototype)(当然还有别的)每次调用就New一个。
现在我想的是为什么没有连接池那样的管理方式?比如某一个Service,频繁调用,不可以用“池”的管理方式?
是不是数据库连接池的存在的原因是java和数据库之间建立连接太费时,才使用的连接池来节省时间,而Spring管理Bean的时候Bean的生成及内存分配所用的时间对比起来根本没有必要这样?

新手,喷请轻喷……
------解决方案--------------------
说不清楚spring为什么这么设计。

但是连接池是由于消耗一定的资源,并且打开关闭数据库连接也是比较耗时的。如果打开的conn,没有正常关闭。那么会引起很多问题

但是java 对象不一样,gc可以回收。
------解决方案--------------------
我觉得主要是因为Spring不是gc,没法知道对象是否还被引用。如果像scope为request/session之类的我倒是觉得也许可以被管理,虽然也不知道引用但是程序中声明过了生命周期。(下次找个机会测试下Spring)
像EJB下可以@Remove标注一个方法通过调用该方法显式向容器声明生命周期结束,我觉得这Spring也可以有一个
------解决方案--------------------
现在对象创建是很廉价的操作,如果对象初始化不费事,原则上不用对象池,因为对象池有诸多问题,譬如:对象容器的同步、对象存储久了会进入老年代,增加了潜在full gc的次数,再而导致程序吞吐量下降,得不偿失
------解决方案--------------------
引用:
现在对象创建是很廉价的操作,如果对象初始化不费事,原则上不用对象池,因为对象池有诸多问题,譬如:对象容器的同步、对象存储久了会进入老年代,增加了潜在full gc的次数,再而导致程序吞吐量下降,得不偿失
谢谢指点,学习了。在很多地方也找到了类似的说法。

但是不死心啊.. 翻文档。EJB的specs里有句话说SLSB是are typically pooled;Spring里也找了下也是支持对象池的:Using TargetSources,同时有这么一句话:
Although the cost of creating a new object isn’t high in a modern JVM, the cost of wiring up the new object (satisfying its IoC dependencies) may be more expensive.
所以我还是坚持楼主说的这种情形可以用对象池

见到大神顺便请教个过程中想到的问题:比如缓存管理会不会出现你说的进入老年代以及后续的影响呢?如果有的话在主流的库里都怎么做的?