最近用到一个数据库连接池,由于要分析其各种性能指标,所以对数据库连接池技术做了一个简单的分析。从网上找到一个关于连接池设计的文章,写的不错。我认为:如果要设计一个数据库连接池,可以参考它的基本思路;如果要提高性能,还有很多细节要仔细研究,并做细致的分析对比。以下是转载的文章。
连接池原理
连接池技术的核心思想是:连接复用,通过建立一个数据库连接池以及一套连接使用、分配、治理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。另外,由于对JDBC中的原始连接进行了封装,从而方便了数据库应用对于连接的使用(非凡是对于事务处理),提高了开发效率,也正是因为这个封装层的存在,隔离了应用的本身的处理逻辑和具体数据库访问逻辑,使应用本身的复用成为可能。连接池主要由三部分组成:连接池的建立、连接池中连接的使用治理、连接池的关闭。下面就着重讨论这三部分及连接池的配置问题。
1.1 连接池的建立
应用程序中建立的连接池其实是一个静态的。所谓静态连接池是指连接池中的连接在系统初始化时就已分配好,且不能随意关闭连接。Java中提供了很多容器类可以方便的构建连接池,如:Vector、Stack、Servlet、Bean等,通过读取连接属性文件 Connections.properties与数据库实例建立连接。在系统初始化时,根据相应的配置创建连接并放置在连接池中,以便需要使用时能从连接池中获取,这样就可以避免连接随意的建立、关闭造成的开销。
1.2 连接池的治理
连接池治理策略是连接池机制的核心。当连接池建立后,如何对连接池中的连接进行治理,解决好连接池内连接的分配和释放,对系统的性能有很大的影响。连接的合理分配、释放可提高连接的复用,降低了系统建立新连接的开销,同时也加速了用户的访问速度。下面介绍连接池中连接的分配、释放策略。
连接池的分配、释放策略对于有效复用连接非常重要,我们采用的方法是一个很有名的设计模式:Reference Counting(引用记数)。该模式在复用资源方面应用的非常广泛,把该方法运用到对于连接的分配释放上,为每一个数据库连接,保留一个引用记数,用来记录该连接的使用者的个数。具体的实现方法是:
当客户请求数据库连接时,首先查看连接池中是否有空闲连接(指当前没有分配出去的连接)。假如存在空闲连接,则把连接分配给客户并作相应处理(即标记该连接为正在使用,引用计数加1)。假如没有空闲连接,则查看当前所开的连接数是不是已经达到maxConn(最大连接数),假如没达到就重新创建一个连接给请求的客户;假如达到就按设定的maxWaitTime(最大等待时间)进行等待,假如等待maxWaitTime后仍没有空闲连接,就抛出无空闲连接的异常给用户。
当客户释放数据库连接时,先判定该连接的引用次数是否超过了规定值,假如超过就删除该连接,并判定当前连接池内总的连接数是否小于 minConn(最小连接数),若小于就将连接池布满;假如没超过就将该连接标记为开放状态,可供再次复用。可以看出正是这套策略保证了数据库连接的有效复用,避免频繁地建立、释放连接所带来的系统资源开销。
1.3 连接池的关闭
当应用程序退出时,应关闭连接池,此时应把在连接池建立时向数据库申请的连接对象统一归还给数据库(即关闭所有数据库连接),这与连接池的建立正好是一个相反过程。
1.4 连接池的配置
数据库连接池中到底要放置多少个连接,才能使系统的性能更佳,用minConn和maxConn来限制。minConn是当应用启动的时候连接池所创建的连接数,假如过大启动将变慢,但是启动后响应更快;假如过小启动加快,但是最初使用的用户将因为连接池中没有足够的连接不可避免的延缓了执行速度。因此应该在开发的过程中设定较小minConn,而在实际应用的中设定较大minConn。maxConn是连接池中的最大连接数,可以通过反复试验来确定此饱和点。为此在连接池类ConnectionPool中加入两个方法getActiveSize()和 getOpenSize(),ActiveSize 表示某一时间有多少连接正被使用,OpenSize表示连接池中有多少连接被打开,反映了连接池使用的峰值。将这两个值在日志信息中反应出来, minConn的值应该小于平均ActiveSize,而maxConn的值应该在activeSize和OpenSize之间
问题:
>是否每一个用户连接都要占用一个Connection,suchas在pool中设定最大连接数为10,比如有10个用户同时连接时就达到pool的最大连接了呢? 如果访问量很大的门户站点,最大连接数是不时应该设置很大呢?
::一般来说,连接池设置的时候,是允许设置最小连接数和最大连接数的。最小连接数是用于系统空闲的时候的,这样可以降低database的压力。当访问增多,所需连接数超出最小连接数时,系统会再创建连接,并放入连接池。当访问量很大时,最大连接数当然也会相应增大。但对于设计的好的系统来说,数据库访问时间占总处理时间的比例不应该很高。比如可以利用cache的技术,来降低对数据库的访问次数。
>
>当访问连接超过了最大连接数时,怎么处理?
> 继续为用户创建新连接,这时保存conn的vector的size()已经超过了最大连接数,如何对超过这部分的连接进行管理,继续把他们加入到pool中?
::如果超出了最大连接数,一般的poolmanager会重试数次,做等待。而往往等一会儿就会有空闲连接了。若仍未取到连接,可以有不同的处理方法,一般是返回一个null啦。这种情况应该记录,这可以帮助你了解最大连接数应该是多少。
>
>连接超过过期的处理,比如在一个JSP页面中调用一个poolbean中的conn,这个bean的scope设置为什么比较好?page吗?
>是否需要在这个jsp页面最后把这个conn归还给pool呢?还是留着给用户下一个页面使用?
>
::用完的连接当然应该立即返回,要知道从连接池取一个连接是很快的,而若你一直霸占着连接,导至池中连接不够,再创建连接的时间是很长的。一个connection永远只应该在一个页面甚至一次事务的范围内使用。
>如果不把他归还的给pool的话,这个conn会在多久后就超时失效呢?怎么处理这种失效的connection,Hashtable他并不知道这个conn是否已经失效呢,Hashtable只是保留这个object而已?
>
::这会根据你的设置来定的。若总是不返回连接,池中连接委有快会耗尽,后台进程就会检查空连接的情况,并加以释放。
事实上在poolman中,是有一个线程一直在运行的,可以设置隔多少时间就重建连接。
Hashtable当然是什么都不知道的啦。它只是一个装东西的房间而已。另外会有一个线程来做仓库管理员的。
分享到:
相关推荐
对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接的配置,实现数据库连接池技术。某一应用最大可用数据库连接数的限制,避免某一应用独占所有数据库资源。 在较为完备的数据库连接池实现中,可根据...
数据库连接池技术,如HikariCP、C3P0、Druid等,是提高应用程序性能和效率的重要手段。连接池预先创建并维护一定数量的数据库连接,当应用需要时可以从池中获取,使用完毕后归还。这样避免了频繁创建和销毁连接的...
### 在MyEclipse中使用Weblogic数据库连接池技术 #### 一、概述 本文将详细介绍如何在MyEclipse环境中配置并使用Weblogic数据库连接池技术。通过本教程,您将了解整个配置流程,并掌握如何利用Java命名与目录接口...
而数据库连接池技术是提高应用程序性能和资源管理的关键部分,尤其在处理大量并发请求时。本文将深入探讨JSP如何与数据库连接池技术结合,以及它们在实际应用中的作用。 一、数据库连接池概念 数据库连接池是管理...
本篇将深入探讨JSP中如何运用数据库连接池技术,以及它的重要性。 数据库连接池,也称为连接池,是在应用服务器启动时预先初始化的一组数据库连接。当应用程序需要与数据库交互时,不再直接创建新的连接,而是从...
### 基于JDBC的数据库连接池技术研究 #### 一、引言 随着互联网技术的迅猛发展,特别是Web应用的广泛普及,传统的客户端/服务器(C/S)架构已经逐渐被浏览器/服务器(B/S)三层架构所取代。在这种背景下,为了提高...
JSP 教程数据库连接池技术 数据库连接池技术是提高 Web 应用系统性能的重要技术。传统的数据库连接方式存在许多不足之处,例如每次操作都需要重新建立数据库连接,限制了数据库操作的性能。数据库连接池技术可以...
JSP教程_数据库连接池技术 数据库连接池技术是JSP开发中的一种重要技术,它可以大大提高数据库访问速度和性能。本章主要介绍数据库连接池技术的概念、原理、优缺点和配置方式。 数据库连接池技术的介绍 数据库...
数据库连接池技术是目前在开发基于Web的分布式系统中常用的一种性能优化技术。它主要是为了解决频繁创建和关闭数据库连接所带来的性能瓶颈问题,尤其是在高并发的环境下,能够显著提高系统的响应速度和效率。 在...
### 基于Java的数据库连接池技术的设计与实现 #### 概述 数据库连接池技术是现代软件开发中的一项关键技术,特别是在Java企业级应用中。它通过预先创建一定数量的数据库连接,并将这些连接组织成一个池,来提高...
数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了...
数据库连接池技术及其在Web系统开发中的应用 数据库连接池技术是指在Web系统开发中,通过池化数据库连接的方式来提高系统性能和可靠性的技术。这种技术可以避免传统的数据库连接模式中频繁建立和关闭连接的开销,...
Java JDBC 数据库连接池...Java JDBC 数据库连接池技术可以解决频繁的数据库连接操作对系统资源的占用,提高系统的性能和可靠性。同时,连接池技术也可以和其它技术结合使用,例如 EJB 技术,实现高效的数据库访问。
《基于JDBC的数据库连接池技术研究与应用》 在当今互联网时代,Web应用程序的开发已经从传统的桌面应用转向了基于B/S架构的模式。Java的Servlet+JSP+JavaBean技术因其跨平台、安全、高效和可移植的特性,成为了开发...
在Eclipse中使用JBoss数据库连接池技术,主要是为了提高应用程序的性能和资源管理效率。数据库连接池技术允许应用程序重复使用已经建立的数据库连接,而不是每次需要时都创建新的连接,从而减少了数据库连接的创建和...
### 基于Java的数据库连接池技术在即时通信系统中的应用 #### 一、引言 随着互联网技术的发展,即时通信系统(Instant Messaging Systems, IMS)已成为人们日常生活中不可或缺的一部分。这类系统需要频繁地与...