关于连接池原理

2016/02/28 Database

### 理解中的连接池

前两天和室友讨论了关于数据库连接池的概念。总结是:

比如:数据库设置的连接池为10.每次数据库创建了连接后,会问下“连接池”是否还有位置, 有的话,这个连接就进入连接池,然后数据库从连接池从取连接进行处理。又有数据库连接创建了, 重复刚才的动作。当连接池一直处于满的状态,新建的连接就会等待连接池的空位出现。 另一方面,数据库从连接池中取出连接操作,操作完后,会把这个连接放回连接池给下一个 新建的连接使用。当发现连接池此时的容量满了,这个连接就不会放回连接池了,而是会被销毁。 总结下就是:连接池中的连接有两个结局:1.回到连接池继续使用;2.被销毁。

其他人博客中的总结内容。

为什么在连接数据库时要使用连接池

  数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的性能低下。
  数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并讲这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库联接对象),由应用程序动态地对池中的连接进行申请、使用和释放。
  对于多于连接池中连接数的并发请求,应该在 请求队列中排队等待。
  并且应用程序可以根据池中连接的使用率, 动态增加或减少池中的连接数。
  连接池技术尽可能多地重用了消耗内存地资源,大大节省了内存,提高了服务器地服务效率,能够支持更多的客户服务。
  通过使用连接池,将大大提高程序运行效率,同时,我们可以通过其自身的 管理机制来 监视数据库连接的数量、使用情况等


数据库连接池的基本原理
连接池的工作原理主要由三部分组成,分别为连接池的建立、连接池中连接的使用管理、连接池的关闭。

第一、连接池的建立。一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意 创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。Java中提供了很多容器类可以方便的构建连接池,例如Vector、Stack等。

第二、连接池的管理。连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其 管理策略是:   
当客户请求数据库连接时,首先查看连接池中是否有空闲连接, 如果存在空闲连接,则将连接分配给客户使用;
如果没有空闲连接,则查看当前所开的连接数 是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;
如果达到就按设定的 最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。   
当客户释放数据库连接时,先判断 该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。   
该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。   

第三、连接池的关闭。当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。

《高性能MySQL》中的内容

8.4.7 线程缓存

线程缓存保存那些当前没有与连接关联但是准备为后面新的连接服务的线程。 当一个新的 连接创建时,如果缓存中有线程存在,MySQL从缓存中删除一个线程,并把它分配给这个新 的连接。当连接关闭时,如果线程缓存还有空间的话,MySQL又会把线程放回缓存。如果没有空间的话,MySQL会销毁这个线程。只要MySQL在缓存里还有空闲的线程,它就可以迅速地相应连接请求,因为这样就不用为每个连接创建新的线程。也就是可以减少创建和销毁线程动作的资源消耗。很多缓存池,或连接池,都是这样的原理,当然,具体会有些区别,但目的都是几乎一致的,就是为了减少不必要的资源消耗。至于设置多少缓存池或连接池,我觉得是在项目系统中不断磨合和调试得出的一个合适的值,并且随着时间推移,这个值还会动态变化,当变化的比较大的时候,就要考虑重新配置了。

Search

    Table of Contents