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

时间:2021-02-08 22:01:30

今天整理硬盘,发现一个刚毕业那会儿收藏的问题了。记得刚毕业的时候出去面试, 有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.****.net/sunxing007 

 

相关文章