自动归还的对象池--一个并不美丽的传说
有一个美丽的传说,精美的石头它会唱歌........
多么令人神往的事啊(不用买MP3了),既然连石头都会唱歌,于是太多的传说诞生了.
程序员杂志第十一期上,发表了一篇题为<<自动归还的对象池>>,作者为我们描述了一个美妙的
可以自动归还的对象池,让每一个痛苦于垃圾回收的程序员带来了心动的向往.
但传说真的会成为现实吗?
通读全篇,没有发现一行示意性的实现代码,所有代码片断只是示意了获取可回收对象的原理性
机制,比如我要向大家介绍一种高性能的httpserver,然后我告诉你:
ServerSocket sc = new ServerSocket(80);
这样就可以在80口上监听http请求连结.
知道写ServerSocket sc = new ServerSocket(80);连入门者都可以,可以写出能实际应用的
webserver的有几个人?把传说变为现实,我不客气地说一句,恐怕作者自己也只是一个梦想.
这不是重要的,因为毕竟有人能把传说成为现实,要不我们哪有weblogic,resin,tomcat("逻列
不超三"是一个道德)可用,但可以成为现实的传说并不都是美丽的.
java是面向对象的思想,对java编程的过程就是对自然的认识过程.自然界生死轮回,各循其道.
有生有死,才使整个世界不仅能正常运转,而且生生不息,假如现在有一种不死术(这不仅是每个
程序员在向往了),那一百年之后,整眼看去每个人都是耄耋之态,那还叫什么世界?
每个java对象都有它的生存期限,一个对象的生命周期不仅仅是受JVM管理,它还有受作业系统.
协议规范的限制.作者在他的美文中一直以Connection对象作为说明,我们也以Connection对象
来看看传说对它来说并不是美丽的.
我们知道,真实的连结池都实现了收缩功能,也就是在一定的周期内如果连结闲置超过
一定的时间,我们就销毁它,在需要的时候再产生新的Connection,正是这样生死有道才能使连结
池正常地工作.
而如果传说成了现实,Connection成了不死之物.那么在空闲的时候,它也要一直和数据库
连着,而一个数据库所能连结的数量是受限的.这样当这个应用没有需求的时候,其它应用也不能
有太多的连结机会.Connecion就如汽车,你一次申请了40辆,不管用不用,都一直这么占着,其它人别
想用.而实际的连结池是如果我只需要10辆我就先交还30辆,当我需要的时候再申请.所以及时让
Connecion死亡,让其它应用有建立连结的机会是一个有道德的程序员都应遵循的原则.而不是不
管是否需要都一直让Connection都活着.
另一方面,如果对象超过了它的生命周期,即使强行让他活着,那也只是行尸走肉,没有
生命力的对象为什么要强行让他生存?该走入历史的垃圾堆,说明它已经完成了它的使命,强行把
它们从垃圾堆中回收出来重用,幽灵复活那种可怕的情景大家在屏幕上都看到过吧?
还是以Connection来说明(原作者一直以这个对象来说明的),它的生命周期不仅仅被
JVM管理,而且它还受TCP协议约束,如果被收缩的Connection硬从垃圾堆中回收回来,我们看它会
出如何?如果这个Connection长时间闲置没有和数据库的交互,虽然从作为JVM来说它可以垃圾回
收器中重新找回来,但在协议层,数据库服务端因为Socket连结本身闲置超时,而挂起对它的响应.
这时再通过它执行Command,"Connection reset by peer:socket writ",一个虽然存活但没有生
命力的东西(纯蛋白质).
大千世界,生死有道,不可强行,以前中国人就是太天真地以为"人定胜天",才会在不产
煤的山上强行挖坑.改变自然的恶果我们已经预见或可以看到,就是在毁灭人类自己,适应自然,
保护自然,那才是真正美丽的传说.
本文地址:http://com.8s8s.com/it/it12601.htm