数据库连接池, 没有说的那么简单

今天整理硬盘,发现一个刚毕业那会儿收藏的问题了。记得刚毕业的时候出去面试, 有4次被问到怎么实现一个数据库连接池,可见这个题目当初还是比较吃香的。当时的答案几乎都是这个样子的:在程序/server启动的时候,先申请一定数量的连接放到一个list中缓存起来,当程序需要使用数据库的时候,list中如果还有连接,则分配给它,若没有,则再次申请连接,然后分配给程序, 当程序使用完连接之后, 把链接归还到list。现在想想觉得好笑,如果今天还有人问我这个问题,我说不定会反问他,为什么要连接池,他不一定能脱口而出告诉我原因。

连接池无非就是提高的效率,提高了反映速度。因为数据库连接是一种tcp/ip连接,建立连接需要花费一定的时间,尤其当数据库server和web server不再一台机器上的时候,8秒钟都说不准。如果用户每次提交请求,都需要花费8秒钟建立数据库连接,最后会疯掉。

至少有两个问题需要考虑:1 连接池的缓存/分配策略。需要考虑最小连接数目,最大连接数目, 管理正在被使用的连接和未使用的连接, 处理因为网络超使等特别原因而无效的连接,什么时候再次申请连接等等,这些问题实现起来不难,就是繁琐。 2 Connection关闭问题。当程序调用Connection.close()之后,则这个连接对应的tcp/ip 连接就消失了,所以必须替换掉这种行为。这个问题解决起来也不难,jdk 动态代理就可以。pool里面不要放原生的Connection,而放被代理之后的, close方法被替换之后的Connection包装类。

在网上找了一个,稍加修改,注释明了。

当然,一个真正的连接池,需要考虑的问题远远不止这么多, 包括statement池,考虑result,事物,并发,分配策略等等。心血来潮, 把dbcp源码down下来看了看,很羞愧,没怎么明白。

 

转载请注明来自:http://blog.csdn.net/sunxing007 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值