最初发表在这里。
连接池为什么能够提高性能呢? 打个比喻吧:
从前有一条河,河水弯弯向东流。河东有个村庄叫河东村,河西有个小镇叫河西镇,河东村的村民经常要跨过小河到河西镇去购买些日常用品,但是小河上没有桥啊,怎么办呢?村民只好每次过河的时候,千辛万苦,披荆斩棘,搭起一座独木桥,等买完东西回来的时候,再把桥给拆了。
这样过了许多年,村民们慢慢觉得这样不划算啊,每次河都要花那么大力气搭桥,当初何必把桥拆了呢。但想想这也不是办法,如果个个都不“过河拆桥”,那么用不了几年,河上不就全是破破破烂烂的独木桥吗,严重影响市容市貌啊。怎么办呢?大家想啊想,有一天终于想出个办法来了,成立一个独木桥管理委员会,专门管理在修桥事务,以供村民使用 。因为技术限制,大家造出来的桥只能一次只能供一个人使用,而且造型也不漂亮,因此委员会制定了一个策略:
1、过河的人要在委员会处领取“桥梁使用证”,一证一桥,用完需将证件交回给委员会。
2、委员会事先造好一定数量的桥,如10座,以供人们使用。
3、当有人需要过桥向委员会索取证件时,委员会检查当前是否有空闲的桥,有则派发使用证,如果当前造的桥都有人用,则检查是否桥的数量已经达到上限(20座),如果没有则马上派人新造一座桥,并向该村民派发通行证。
4、如果桥的数量已经达到预先设定的上限(20座)了,那么,委员会只好让申请人暂时等候,等前面的人回来交还使用证再给该村民派发。
5、如果某些桥在一定时间内没人使用,委员会就会它拆掉。
这样一来,村民们再也不用重复建设了,大大减少了对河岸树木的毁坏,保护了植被,杜绝了水土流失,于是风调雨顺,人们过上了快乐的生活。
河东村就是我们的应用,河西镇是数据库。连接池就像那个委员会吧,那个“桥梁使用证”就是DataSource返回的Connection了。那些独木桥就是物理连接,每台机器是有限制的,而且造价十分“昂贵”。村民们用完桥梁后,只能把证件交还给委员会,绝对不能把桥给拆了。
如果不用DataSource,我们直接用DriverManager来实现自己的连接池可以吗?可以,但必须首先解决一个问题:怎样防止村民在交还证件的时候顺便把桥给拆了(都是用Connection.close()).而且,有资料说直接使用DriverManager建立连接池是没有效果的,因为通过DriverManager的getConnection方法取得是数据库的物理连接,而这跟DataSource中不一样,是没有经过driver程序的优化的。
因此,我们还是尽量用DataSource吧,好处多多。