自己想实现一个数据库连接池,看了网上说的原理,但是有一些地方不太清楚。
连接池初始化不太难,根据配置生成一定数量的连接放在Vector或者栈里面。
但是,里面说的如果连接达到允许的最大值,就让用户等待,这个怎么实现的啊,怎么让用户等待呢?
还有就是一个连接使用完毕,怎么将它回收到连接池?如何判断这个连接是否使用完毕啊?难道要将一个连接与特定用户绑定起来吗,用户退出了 ,这个连接才释放?

解决方案 »

  1.   

    让用户等待,可以有两种思路。
    比如,从你的连接池中取得连接的方法是getConnection();
    1.当你在getConnection方法中判断连接被用完的时候,你可以阻塞线程。等待一定的时间后,再尝试取得。这样用户的pg那边就只能等待,直到你成功的取得连接返回给他。当然,你也可以设置最多尝试多少次。
    2.更合理的方式,只要不能取得连接,就抛出一个异常。用户捕获异常后,wait()一定的时间,再尝试取得。还有就是一个连接使用完毕,怎么将它回收到连接池?
    这个,你当然要开放一个方法,专门用来回收用完的连接。而不是直接让用户conn=null的方式解决。
      

  2.   

    你把连接池想得太简单了!要做个连接池必须要考虑这些问题:1:客户端在调用 Connection#close() 方法时,并不是真正的关闭连接,而是将连接还回到池中去以便于重用
    2:连接池中连接可以已经存在很长时间了,数据库一般都会有个连接超时的,当连接超过超时时间时数据库会主动断开连接,连接池必须检查池中连接的健康状态
    3:与数据库网络连接断开时,之后又重新连上了,那那些池中的连接该如何处理
    4:当连接池中连接全部用完的时候,该采取什么策略
    5:你的连接池是否实现了 javax.sql.DataSource 接口,这个接口连接池一般都应实现等等诸如此类的问题,要解决这些问题是比较棘手的!
      

  3.   

    对于上楼所说的问题 1 是为了解决,用户不管是否使用你的连接池,其 JDBC 操作都是按照标准来做的,并不是像某些网上所谓的连接是使用什么 releaseConnection() 方法来做的,这种方式的话让用户的代码与你的连接池紧密地耦合在一起,属于一种不良设计!
      

  4.   


    网上那些所谓的连接池 100% 都有问题,要么设计有缺陷,就是很多东西没有考虑到,根据不能适用于正式环境开发。连接池的设计和实现都非常复杂,自己很难完成一个能够使用的连接池。建议看看一些常用的开源连接池:DBCP、C3P0、Proxool