数据库连接池技术浅析

合集下载

数据库连接池技术的常见问题解析

数据库连接池技术的常见问题解析

数据库连接池技术的常见问题解析数据库连接池是现代软件开发中常用的技术,用于提高数据库操作效率和系统性能。

然而,在实际应用中,数据库连接池也面临一些常见的问题和挑战。

本文将对数据库连接池技术的常见问题进行解析,并提供解决方案。

1. 连接泄漏:连接泄漏是数据库连接池中最常见的问题之一。

当应用程序使用完连接后没有正确关闭它,连接将继续存在于连接池,直到占满连接池的最大连接数导致系统无法响应。

为解决该问题,可以在应用程序中使用finally块或try-with-resources语句来确保连接正确关闭。

2. 连接耗尽:连接耗尽是指数据库连接池中的所有连接都被占满,导致新的连接无法获取的情况。

这可能是由于配置不当、连接池大小设置不合理、数据库连接泄漏等原因引起的。

要解决连接耗尽问题,首先需要对系统负载和用户访问模式进行分析,调整连接池大小和最大连接数以适应不同的环境。

3. 连接超时:在高负载情况下,数据库连接池中的连接可能被占用时间过长而无法释放,导致其他请求等待过久而超时。

为了解决连接超时问题,可以在连接池配置中设置连接空闲时间和最大连接等待时间,使连接在空闲一段时间后自动释放并限制最长等待时间。

4. 数据库死锁:在多线程并发环境下,由于数据库事务未正确提交或回滚,可能导致数据库死锁。

这将占用数据库连接并导致连接池中的连接资源耗尽。

一种解决方法是使用合适的事务管理机制,及时释放和回滚事务。

另外,还可以设置合理的超时时间,将长时间未释放的连接强制回收。

5. 连接性能:连接池性能对系统整体性能起着至关重要的作用。

数据库连接是昂贵的资源,每次从连接池中获取连接都需要一定的时间开销。

为了优化连接性能,可以使用连接池预热机制,在系统启动时提前创建和验证连接,并将其放入连接池以备用。

还可以设置连接池中连接的最小数目,以保证连接的即时可用性。

6. 配置管理:连接池的配置是保证正常运行的关键。

然而,对于大型系统来说,连接池的配置常常会面临复杂的管理和调优问题。

java_数据库连接池原理_概述及解释说明

java_数据库连接池原理_概述及解释说明

java 数据库连接池原理概述及解释说明1. 引言1.1 概述数据库连接池是在应用程序与数据库之间充当中间层的一种技术,它能够管理数据库连接的创建、分配和释放,从而提供了更高效的数据库访问方式。

在开发Java应用程序时,使用数据库连接池可以极大地提高系统性能和扩展性。

1.2 文章结构本文将首先介绍数据库连接池的基本概念和作用,并解释其相对于传统连接方式的优势。

接着,我们将深入探讨数据库连接池的原理和实现机制。

然后,我们会介绍常见的Java中的数据库连接池框架,并演示如何通过配置文件进行连接池的配置。

最后,我们还会分享一些优化技巧,帮助你进一步提升数据库连接池的性能。

1.3 目的通过阅读本文,读者将掌握以下知识:- 了解数据库连接池的基本概念和作用;- 理解数据库连接池的原理及其在Java中实现方式;- 掌握常见的Java中使用到的数据库连接池框架;- 学习如何通过配置文件进行数据库连接池配置;- 了解如何优化数据库连接池性能以及相关技巧。

通过这些内容的学习,读者将能够更好地理解和使用数据库连接池,提高应用程序的性能和可拓展性。

同时,读者也将具备一定的优化数据库连接池的能力,使其适应不同规模和并发情况下的需求。

在下一章节中,我们将详细介绍数据库连接池的原理。

2. 数据库连接池原理:2.1 数据库连接概念解释:在Java开发中,与数据库进行交互通常需要建立一个数据库连接。

每次请求都需要创建和销毁连接会导致性能上的损耗。

而数据库连接池则是一种重复利用已有连接的机制,通过预先创建一定数量的数据库连接并将其保存在池中,以供程序使用,从而提高了数据库操作的效率。

2.2 连接池的作用和优势:数据库连接池的作用是管理和维护多个数据库连接,并提供这些连接给应用程序使用。

它具有以下几点优势:- 提高系统性能: 连接池可以避免频繁地创建和销毁数据库连接,从而减少了系统资源消耗和响应延迟。

- 资源利用率高: 连接池可以实现对已有连接的重复利用,最大限度地提高了资源的利用率。

数据库连接池深入详解

数据库连接池深入详解
数据库连接池是管理数据库连接的关键技术,能显著提高数据库操作的性能。它负责分配、管理和释放数据库连接,允许应用程序重复使用现有连接,避免重新建立。配置数据库连接池涉及多个参数,如最大连接数、最大空闲数等。在Tomcat中配置数据源需导入数据库文源名称、类型等相关信息。JNDI是Java命名与目录接口,通过名称与对象的绑定实现资源获取,可用于查找数据源。为确保连接有效性,常设置validationQuery进行连接验证,并将testOnBorrow、testOnReturn、testWhileIdle设为true。使用DBCP时需注意,若使用默认值且数据库连接因故断掉后,从连接池中取得的可能是无效连接。

数据库连接池技术的优化与配置

数据库连接池技术的优化与配置

数据库连接池技术的优化与配置数据库连接池是现代应用程序中常见的数据库访问技术。

它允许应用程序重复利用预先建立的数据库连接,从而提高数据库访问效率。

数据库连接池的优化和配置对于应用程序的性能和稳定性至关重要。

本文将就数据库连接池技术的优化与配置进行探讨。

首先,我们需要理解数据库连接池的工作原理。

数据库连接池是在应用程序启动时创建一定数量的数据库连接,并将其保存在连接池中。

应用程序需要访问数据库时,从连接池中获取连接并执行数据库操作。

操作完成后,将连接返回给连接池以供其他线程使用。

这种方式避免了频繁地建立和销毁数据库连接,提高了应用程序的性能。

优化数据库连接池的首要目标是提高连接的复用率。

一旦获取到连接,就要尽量减少连接的获取和释放操作。

为了实现这一目标,我们可以采取以下的优化措施:首先,合理配置连接池的大小。

连接池的大小应该根据应用程序的并发访问量和数据库服务器的负载情况来确定。

如果连接池过大,会造成资源浪费;如果连接池过小,会导致连接不足的问题。

基于实际情况的性能测试和监控是调整连接池大小的有效手段。

其次,要正确设置连接池的超时时间。

超时时间指的是连接在空闲状态下的最长存活时间。

如果连接在超过超时时间后仍未被使用,连接池将自动销毁该连接。

合理设置超时时间可以防止连接长时间占用连接池资源。

另外,需要关注连接池的初始连接数配置。

初始连接数指的是连接池在启动时所创建的连接数。

过少的初始连接数可能导致启动后连接不足的问题,而过多的初始连接数则会占用过多的资源。

应根据实际需求和系统资源情况进行调整。

对于连接池中已存在的连接,我们可以通过配置连接最大空闲时间来进一步优化。

最大空闲时间是指连接在空闲状态下的最长时间。

一旦连接的空闲时间超过最大空闲时间,连接将被连接池自动销毁。

通过设置最大空闲时间可以有效地管理连接池中的连接数量,减少资源浪费。

同时,应用程序也需要注意合理使用连接,以充分发挥连接池的优势。

在进行数据库操作时,应尽量将多个相关的操作放在同一连接中完成,避免频繁地获取和释放连接。

论软件开发中的数据库连接池技术

论软件开发中的数据库连接池技术

论软件开发中的数据库连接池技术随着互联网的飞速发展以及数据量的不断增长,数据库的使用量也呈现出井喷式增长的趋势。

然而,许多应用程序在使用数据库时,常常需要频繁地连接和断开数据库,这样会给数据库造成巨大的负担,导致应用程序的性能出现严重的问题。

因此,在软件开发中,数据库连接池技术成为了一种必备的技术手段。

一、什么是数据库连接池技术连接池技术是一种将数据库连接缓存起来,等待应用程序再次使用的技术。

通俗点说,它就像一个“存储库”。

在应用程序启动的时候,连接池会首先分配一定数量的数据库连接,然后将它们缓存起来。

当应用程序需要访问数据库时,它只需要从连接池中获取一个连接,使用完毕之后,再将连接返回给连接池。

这样一来,连接池就能够达到复用数据库连接的目的,从而提高应用程序的性能。

二、数据库连接池技术的优势1.减少数据库的负担数据库连接池技术能够显著地降低数据库的压力。

由于连接池能够复用数据库连接,应用程序访问数据库时,不需要频繁地连接和断开数据库,从而避免了大量的资源浪费。

2.增强应用程序的性能连接池技术能够显著地提高应用程序的响应速度和并发性能。

通过连接池管理数据库连接,可以减少应用程序的等待时间,从而提高应用程序的性能。

3.提高代码的重用性数据库连接池可以被多个应用程序共享,这不仅减少了数据库资源的浪费,而且也提高了代码的重用性。

这对于企业级应用程序来说,是非常重要的。

三、如何使用数据库连接池技术使用数据库连接池技术需要注意以下两点:1.合理设置连接池参数连接池参数包括最大连接数、最小连接数、超时时间、空闲连接数等。

要根据应用程序的实际需求和数据库负荷情况,合理设置连接池参数。

2.正确释放连接在使用连接池时,要注意正确释放连接。

如果连接没有正确释放,会导致连接池中一直有大量的连接存在,从而影响应用程序的性能。

四、数据库连接池技术的实现原理数据库连接池技术的实现原理比较简单,主要分为以下几步:1.在应用程序启动时,创建一定数量的数据库连接,并保存在连接池中。

数据库连接池技术解析

数据库连接池技术解析

数据库连接池技术解析数据库连接池技术是提升数据库访问效率常⽤的⼿段, 使⽤连接池可以提⾼连接资源的复⽤性,避免频繁创建、关闭连接资源带来的开销,池化技术也是⼤⼚⾼频⾯试题。

MyBatis 内部就带了⼀个连接池的实现,接下来重点解析连接池技术的数据结构和算法;先重点分析下跟连接池相关的关键类:PooledDataSource:⼀个简单,同步的、线程安全的数据库连接池PooledConnection:使⽤动态代理封装了真正的数据库连接对象,在连接使⽤之前和关闭时进⾏增强;PoolState:⽤于管理 PooledConnection 对象状态的组件,通过两个 list 分别管理空闲状态的连接资源和活跃状态的连接资源,如下图,需要注意的是这两个 List 使⽤ ArrayList 实现,存在并发安全的问题,因此在使⽤时,注意加上同步控制;重点解析获取资源和回收资源的流程,获取连接资源的过程如下图:参考代码: org.apache.ibatis.datasource.pooled.PooledDataSource.popConnection(String, String)//从连接池获取资源private PooledConnection popConnection(String username, String password) throws SQLException {boolean countedWait = false;PooledConnection conn = null;long t = System.currentTimeMillis();//记录尝试获取连接的起始时间戳int localBadConnectionCount = 0;//初始化获取到⽆效连接的次数while (conn == null) {synchronized (state) {//获取连接必须是同步的if (!state.idleConnections.isEmpty()) {//检测是否有空闲连接// Pool has available connection//有空闲连接直接使⽤conn = state.idleConnections.remove(0);if (log.isDebugEnabled()) {log.debug("Checked out connection " + conn.getRealHashCode() + " from pool.");}} else {// 没有空闲连接if (state.activeConnections.size() < poolMaximumActiveConnections) {//判断活跃连接池中的数量是否⼤于最⼤连接数// 没有则可创建新的连接conn = new PooledConnection(dataSource.getConnection(), this);if (log.isDebugEnabled()) {log.debug("Created connection " + conn.getRealHashCode() + ".");}} else {// 如果已经等于最⼤连接数,则不能创建新连接//获取最早创建的连接PooledConnection oldestActiveConnection = state.activeConnections.get(0);long longestCheckoutTime = oldestActiveConnection.getCheckoutTime();if (longestCheckoutTime > poolMaximumCheckoutTime) {//检测是否已经以及超过最长使⽤时间// 如果超时,对超时连接的信息进⾏统计state.claimedOverdueConnectionCount++;//超时连接次数+1state.accumulatedCheckoutTimeOfOverdueConnections += longestCheckoutTime;//累计超时时间增加state.accumulatedCheckoutTime += longestCheckoutTime;//累计的使⽤连接的时间增加state.activeConnections.remove(oldestActiveConnection);//从活跃队列中删除if (!oldestActiveConnection.getRealConnection().getAutoCommit()) {//如果超时连接未提交,则⼿动回滚try {oldestActiveConnection.getRealConnection().rollback();} catch (SQLException e) {//发⽣异常仅仅记录⽇志/*Just log a message for debug and continue to execute the followingstatement like nothing happend.Wrap the bad connection with a new PooledConnection, this will helpto not intterupt current executing thread and give current thread achance to join the next competion for another valid/good databaseconnection. At the end of this loop, bad {@link @conn} will be set as null.*/log.debug("Bad connection. Could not roll back");}}//在连接池中创建新的连接,注意对于数据库来说,并没有创建新连接;conn = new PooledConnection(oldestActiveConnection.getRealConnection(), this);conn.setCreatedTimestamp(oldestActiveConnection.getCreatedTimestamp());conn.setLastUsedTimestamp(oldestActiveConnection.getLastUsedTimestamp());//让⽼连接失效oldestActiveConnection.invalidate();if (log.isDebugEnabled()) {log.debug("Claimed overdue connection " + conn.getRealHashCode() + ".");}} else {// ⽆空闲连接,最早创建的连接没有失效,⽆法创建新连接,只能阻塞try {if (!countedWait) {state.hadToWaitCount++;//连接池累计等待次数加1countedWait = true;}if (log.isDebugEnabled()) {log.debug("Waiting as long as " + poolTimeToWait + " milliseconds for connection.");}long wt = System.currentTimeMillis();state.wait(poolTimeToWait);//阻塞等待指定时间state.accumulatedWaitTime += System.currentTimeMillis() - wt;//累计等待时间增加} catch (InterruptedException e) {break;}}}}if (conn != null) {//获取连接成功的,要测试连接是否有效,同时更新统计数据// ping to server and check the connection is valid or not//检测连接是否有效if (conn.isValid()) {//有效if (!conn.getRealConnection().getAutoCommit()) {conn.getRealConnection().rollback();//如果遗留历史的事务,回滚}//连接池相关统计信息更新conn.setConnectionTypeCode(assembleConnectionTypeCode(dataSource.getUrl(), username, password));conn.setCheckoutTimestamp(System.currentTimeMillis());conn.setLastUsedTimestamp(System.currentTimeMillis());state.activeConnections.add(conn);state.requestCount++;state.accumulatedRequestTime += System.currentTimeMillis() - t;} else {//如果连接⽆效if (log.isDebugEnabled()) {log.debug("A bad connection (" + conn.getRealHashCode() + ") was returned from the pool, getting another connection."); }state.badConnectionCount++;//累计的获取⽆效连接次数+1localBadConnectionCount++;//当前获取⽆效连接次数+1conn = null;//拿到⽆效连接,但如果没有超过重试的次数,允许再次尝试获取连接,否则抛出异常if (localBadConnectionCount > (poolMaximumIdleConnections + poolMaximumLocalBadConnectionTolerance)) {if (log.isDebugEnabled()) {log.debug("PooledDataSource: Could not get a good connection to the database.");}throw new SQLException("PooledDataSource: Could not get a good connection to the database.");}}}}}if (conn == null) {if (log.isDebugEnabled()) {log.debug("PooledDataSource: Unknown severe error condition. The connection pool returned a null connection.");}throw new SQLException("PooledDataSource: Unknown severe error condition. The connection pool returned a null connection."); }return conn;}回收连接资源的过程如下图:代码位置:org.apache.ibatis.datasource.pooled.PooledDataSource.pushConnection(PooledConnection)1//回收连接资源2protected void pushConnection(PooledConnection conn) throws SQLException {34synchronized (state) {//回收连接必须是同步的5 state.activeConnections.remove(conn);//从活跃连接池中删除此连接6if (conn.isValid()) {//先判断连接是否有效7//判断闲置连接池资源是否已经达到上限,并判断是由本连接池创建8if (state.idleConnections.size() < poolMaximumIdleConnections && conn.getConnectionTypeCode() == expectedConnectionTypeCode) { 9//没有达到上限,进⾏回收10 state.accumulatedCheckoutTime += conn.getCheckoutTime();//增加累计使⽤时间11if (!conn.getRealConnection().getAutoCommit()) {12 conn.getRealConnection().rollback();//如果还有事务没有提交,进⾏回滚操作13 }14//基于该连接,创建⼀个新的连接资源,并刷新连接状态15 PooledConnection newConn = new PooledConnection(conn.getRealConnection(), this);16 state.idleConnections.add(newConn);17 newConn.setCreatedTimestamp(conn.getCreatedTimestamp());18 newConn.setLastUsedTimestamp(conn.getLastUsedTimestamp());19//⽼连接失效20 conn.invalidate();21if (log.isDebugEnabled()) {22 log.debug("Returned connection " + newConn.getRealHashCode() + " to pool.");23 }24//唤醒其他被阻塞的线程25 state.notifyAll();26 } else {//如果闲置连接池已经达到上限了,将连接真实关闭27 state.accumulatedCheckoutTime += conn.getCheckoutTime();28if (!conn.getRealConnection().getAutoCommit()) {29 conn.getRealConnection().rollback();30 }31//关闭真的数据库连接32 conn.getRealConnection().close();33if (log.isDebugEnabled()) {34 log.debug("Closed connection " + conn.getRealHashCode() + ".");35 }36//将连接对象设置为⽆效37 conn.invalidate();38 }39 } else {40if (log.isDebugEnabled()) {41 log.debug("A bad connection (" + conn.getRealHashCode() + ") attempted to return to the pool, discarding connection.");42 }43 state.badConnectionCount++;44 }45 }46 }。

数据库连接池技术介绍

数据库连接池技术介绍
3 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
数据库连接池技术简单介绍 1 连接池是一个等待数据库连接的队列。
2 客户端向服务器端请求连接, 服务器端先看连接池中是否有空的连接,如果有空的连接就让该客户端连接, 如果没有空的连接 ,那就看现有连接数是否达到连接池限定的个数,如果没有达到就为该客户端创建一个连接,如果达到了那就让该客户端排队, 等其他客户端断开连接了,就让该客户端连接。

数据库连接池技术的研究与实践

数据库连接池技术的研究与实践

数据库连接池技术的研究与实践近年来,随着互联网的迅猛发展,各类网站和应用的访问量急剧增加,对数据库的性能和扩展性提出了更高的要求。

在这种情况下,数据库连接池技术应运而生。

本文将从数据库连接池的概念、原理以及实践应用三个方面来进行详细探讨。

首先,我们来了解一下数据库连接池的概念。

数据库连接池是一个数据库连接的缓冲池,在应用程序初始化时,会创建一定数量的连接放入连接池中。

当应用程序需要访问数据库时,直接从连接池中获取连接,而不需要每次都重新建立连接,避免了频繁创建和关闭连接的开销。

这种复用连接的方式大大提高了数据库的性能和响应速度。

其次,让我们深入了解一下数据库连接池的工作原理。

数据库连接池通过一定的算法管理连接的创建和销毁。

当应用程序请求从连接池中获取连接时,连接池会首先检查连接池中是否有空闲的连接。

如果有,连接池会返回一个空闲的连接给应用程序,并将该连接标记为“忙”。

如果没有空闲连接,连接池会根据预设的最大连接数判断是否可以创建新的连接。

当连接使用完毕后,应用程序将连接还给连接池,连接池将该连接标记为“空闲”。

当连接池已创建的连接数达到最大连接数,需再次请求连接时,连接池会采取一定的策略,如等待、抛弃等进行管理。

接下来,我们探讨一下数据库连接池在实践中的应用。

首先,在应用程序中,使用连接池技术可以有效地管理数据库连接,提高系统的稳定性和性能。

数据库连接的创建和销毁是一个耗时耗资源的操作,使用数据库连接池可以避免频繁创建和关闭连接,减轻了对数据库的负担,提高了数据库的处理能力和响应速度。

其次,在高并发的场景下,数据库连接池可以实现对连接的复用,避免了过多的连接竞争和线程阻塞,提高了系统的并发处理能力。

此外,数据库连接池还可以通过一些策略来管理连接,如最大连接数、最小连接数、最大空闲时间等,以适应不同的系统需求。

要使用数据库连接池技术,首先需要选择合适的连接池实现。

常见的数据库连接池实现有Apache Commons DBCP、C3P0、HikariCP等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据库连接池技术浅析
一般情况下,在使用开发基于数据库的WEB程序时,传统的模式基本是按以下步骤:
1.在主程序(如Servlet、Beans)中建立数据库连接。

2.进行SQL操作,取出数据。

3.断开数据库连接。

使用这种模式开发,存在很多问题。

首先,我们要为每一次WEB请求(例如察看某一篇文章的内容)建立一次数据库连接,对于一次或几次操作来讲,或许你觉察不到系统的开销,但是,对于WEB程序来讲,即使在某一较短的时间段内,其操作请求数也远远不是一两次,而是数十上百次(想想全世界的网友都有可能在您的网页上查找资料),在这种情况下,系统开销是相当大的。

事实上,在一个基于数据库的WEB系统中,建立数据库连接的操作将是系统中代价最大的操作之一。

很多时候,可能您的网站速度瓶颈就在于此。

其次,使用传统的模式,你必须去管理每一个连接,确保他们能被正确关闭,如果出现程序异常而导致某些连接未能关闭,将导致数据库系统中的内存泄露,最终我们将不得不重启数据库。

针对以上问题,我们首先想到可以采用一个全局的Connection对象,创建后就不关闭,以后程序一直使用它,这样就不存在每次创建、关闭连接的问题了。

但是,同一个连接使用次数过多,将会导致连接的不稳定,进而会导致WEB SERVER 的频频重启。

故而,这种方法也不可取。

实际上,我们可以使用连接池技术来解决上述问题。

首先,介绍一下连接池技术的基本原理。

顾名思义,连接池最基本的思想就是预先建立一些连接放置于内存对象中以备使用:
如图所示,当程序中需要建立数据库连接时,只须从内存中取一个来用而不用新建。

同样,使用完毕后,只需放回内存即可。

而连接的建立、断开都有连接池自身来管理。

同时,我们还可以通过设置连接池的参数来控制连接池中的连接数、每个连接的最大使用次数等等。

通过使用连接池,将大大提高程序效率,同时,我们可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。

下面我们以一个名为ConnectionPool的连接池为例来看看连接池的实现。

先看看
ConnectionPool的基本属性:
m_ConnectionPoolSize:连接池中连接数量下限
m_ConnectionPoolMax:连接池中连接数量上限
m_ConnectionUseCount:一个连接的最大使用次数
m_ConnectionTimeout:一个连接的最长空闲时间
m_MaxConnections = -1:同一时间的最大连接数
m_timer:定时器
这些属性定义了连接池与其中的每个连接的有效状态值。

连接池的自我管理,实际上就是通过定时的对每个连接的状态、连接的数量进行判断而进行相应操作。

其管理流程如下:
通过上图,我们可以定义出ConnectionPool要完成管理所需要的基本接口:public class ConnectionPool implements TimerListener{
public boolean initialize() //连接池初始化
public void destroy() //连接池的销毁
public synchronized java.sql.Connection getConnection() //取一个连接
public synchronized void close() //关闭一个连接
private synchronized void removeFromPool() //把一个连接从连接池中删除
private synchronized void fillPool() //维护连接池大小
public synchronized void TimerEvent() //定时器事件处理函数
}
通过这几个接口,已经可以完成连接池的基本管理。

在TimeEvent()函数中完成连接池的状态检验工作,fillPool()时连接池至少保持最小连接数。

因为我们要保存每一个连接的状态,所以还需要一个数据库连接对象:
class ConnectionObject{
public java.sql.Connection con; public boolean inUse; //是否被使用标志
public long lastAccess; //最近一次开始使用时间
public int useCount; //被使用次数
}
加入了ConnectionObject对象后,在ConnectionPool中操作的应该只是ConnectionObject,而其他进程需要的只是ConnectionObject的con属性,因此我们再加入一个类,作为其他进程获得与返回连接的接口: CLASS Conn{ GetConnection(); //从连接池中取出一个有效连接
CloseConnection(); //返回连接,此时并没有关闭连接,只是放回了连接池
DestroyPool(); //销毁连接池
}
最后我们的整个系统总的架构如下:
通过上面的介绍,我们可以看出,连接池技术的关键就是其自身的管理机制,以上的管理流程只是本人一点见解,关键是想向大家介绍一种思路,在此基础上,您可以进一步完善连接池技术为您所用。

相关文档
最新文档