Apache Tomcat 7系列的版本中使用了JDBC Connection Pool替代传统的commons-dbcp作为新的数据库连接池。其中很重要的一个原因是,commons-dbcp是单线程的,为了保证线程安全它必须将整个线程池上锁,并且它在对高并发的支持方面表现很差。JDBC Connection Pool一个很重要的新特性就是它对高并发环境和多核/多处理器系统的支持。下面将通过对JDBC Connection Pool的源码分析,深入理解其连接池设计的思想以及对高并发的解决方法。
连接池的存储设计
连接池使用两个阻塞队列BlockingQueue分别存储已分配的active和空闲的idle连接对象。如果BlockingQueue是空的,从BlockingQueue中取元素会被阻断进入等待状态,直到BlockingQueue进入元素后才被唤醒;同样,如果BlockingQueue是满的,任何试图往队列里存元素也会被阻断进入等待状态,直到BlockingQueue中有空间时才会被唤醒继续操作。
Tomcat 7 JDBC Connection Pool中的FairBlockingQueue实现了BlockingQueue接口。FairBlockingQueue采用先进先出(FIFO)原理,从而保证最先进入idle队列的连接最先被分配。FairBlockingQueue的offer和poll操作时均使用ReentrantLock锁定该连接,操作成功后解锁。ReentrantLock锁是一个可重入的互斥锁,它由最近成功获得锁定,并且还没有释放该锁的线程拥有。所以FairBlockingQueue在offer和poll一个连接对象时,能够确保该连接不会被其它并发的请求干扰,导致死锁。(后面小节中提到的锁均是指ReentrantLock)。
并发请求与连接对象的映射
当同时有多个用户请求连接对象时,若有足够的连接对象,则每个用户根据请求的时间依次从idle队列中获取一个连接对象。若idle队列中没有足够的队列,则需要按请求时间依次将这些用户请求添加到一个先进先出FIFO的受阻塞的请求队列,每次添加都是在队列尾部插入,从而保证一旦有空闲连接产生时,先来的请求最先获得连接。一旦请求获得连接对象后,它将从受阻塞的请求队列中移除。在向受阻塞的请求队列中添加和移除请求时,都需要对队列上锁,防止同时有多个请求被添加、或同时有多个请求被移除、或同时既有请求被添加又有请求被移除等情况发生,导致请求队列的乱序,直到操作完成后解锁。
连接池为每一个没有分配到连接的请求设置一个同步倒数计数器CountDownLatch,每个计数器传入的初始值分别为请求到来的顺序。例如,最早来到的且未被分配连接的请求的同步计数器初值设为1,后面来到的请求初值依次加1。计数器大于0,该线程就会被阻塞,直到计数器为0,该线程才能继续执行。每次当有空闲连接产生,并且成功分配给受阻塞的请求队列最前面的请求后,所有被阻塞的请求的计数器减1,因此刚获取连接对象的请求线程的计数器值变为0,从而可以继续执行,其它请求线程则继续处于阻塞状态。
在Tomcat 7 JDBC Connection Pool中,自定义了ExchangeCountDownLatch类,该类继承CountDownLatch,并且添加了一个成员变量,表示该请求线程最终被分配到的连接对象。
下面通过一个例子说明以上过程:如下图1中Time=1时,受阻塞请求队列中有n个请求线程受阻塞,各自的同步计数器值分别从1到n,此时空闲连接队列为空,工作连接队列中队尾的连接为Cm;假设Time=1结束后,工作连接队列中的C1被释放,则在Time=2时,受阻塞请求队列的队首R1(count=1)线程获得刚被释放的C1连接,因此它被移除受阻塞请求队列,队首请求变为R2,并且所有的受阻塞的请求线程计数器都减1,此时R1的count=0可以继续执行,R2的count=1,继续被阻塞。C1连接因为被R1所占用,因此又被添加到工作队列的队尾。
获取连接对象的流程
当用户请求连接对象时,若连接池中有空闲连接则立即返回该连接,若没有空闲连接但是连接总数没有达到设定的最大值,则创建一个新的连接对象并返回。否则循环等待并检查是否有空闲连接,若有空闲连接产生则返回该连接,若超过等待时间仍无空闲连接产生,则抛出异常。下图2详细说明了请求连接对象的流程。
在检查到idle队列中存在空闲连接后还需要对连接作有效性的检查,以确定该连接对象与数据库是处于连接状态,若连接断开需重新连接,以保证该连接对象的有效性。为了确保多个请求线程不会竞争同一个连接对象,首先获得该连接的线程需要对该连接上锁,直到检查完毕确保该连接有效并被添加到active队列后才为其解锁。
相关推荐
"自定义高并发jdbc连接池"是一个专为处理大量并发请求而设计的解决方案,它允许应用程序高效地管理和复用数据库连接,从而减少数据库连接创建与释放的开销,提高系统的整体性能。 JDBC(Java Database Connectivity...
在IT行业中,数据库连接管理是应用系统性能优化的关键环节之一,而JDBC连接池就是解决这一问题的有效工具。本文将详细讲解JDBC连接池的工作原理、配置方法以及如何通过优化来提升连接速度。 JDBC(Java Database ...
JDBC(Java Database Connectivity)是Java平台中用于与数据库交互的一组接口和类,而JDBC连接池就是在这个基础上实现的一种优化策略。本文将详细介绍JDBC连接池驱动的相关知识,主要涉及`mysql-connector-java-...
Java JDBC 数据库连接池总结 Java 语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁。在 Web 应用开发的早期,主要使用的技术是 CGIASPPHP 等。之后,Sun 公司推出了基于 Java 语言的 ...
Java JDBC连接池是一种高效管理数据库连接的技术,它允许应用程序重复使用已经建立的数据库连接,从而减少频繁创建和关闭连接带来的开销。在大型系统中,尤其是高并发环境下,使用连接池能够显著提升性能并降低资源...
而JDBC连接池是一种管理资源的技术,它能有效地管理和复用数据库连接,提高系统性能并减少系统资源的消耗。在Java应用中,常见的连接池实现有DBCP、C3P0、HikariCP、Druid等。 标题"完美的java jdbc连接池实例.zip...
**JDBC连接池BoneCP_Demo详解** 在Java开发中,数据库操作是不可或缺的一部分,而JDBC(Java Database Connectivity)是Java与数据库交互的标准接口。然而,直接使用JDBC进行数据库连接管理可能会导致资源浪费,...
HikariCP是一款高效、高性能的Java JDBC连接池,它被设计为替代传统连接池如C3P0和DBCP,以提供更快、更稳定的数据访问性能。在HikariCP v3.4.5这个版本中,我们可以深入探讨其在数据库连接管理、性能优化以及配置...
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0的主要特点包括: 1. **连接测试**:C3P0提供了多种测试策略,确保获取到的连接是可用的。 2. **连接池初始化和最大...
3. HikariCP:这是目前被认为是性能最好的JDBC连接池,它的设计目标是速度、低内存消耗以及JDBC兼容性。HikariCP以其快速的连接创建和销毁,以及优秀的并发性能而受到赞誉。 4. Druid:阿里巴巴开源的数据库连接池...
4. **Tomcat JDBC Connection Pool**:Tomcat自带的JDBC连接池,它的设计目标是轻量级、快速且易于使用。它提供了自动防泄漏、连接健康检查等功能。 使用JDBC连接池的步骤通常包括以下几步: 1. **引入依赖**:在...
2. C3P0:这是一个开源的JDBC连接池,提供了比DBCP更高级的功能,如连接测试、空闲连接检测、自动扩展等。C3P0通过组合多个数据源来实现连接池,可以更好地控制并发和资源管理。 这些jar包的收集意味着开发者可以...
在深入探讨“jdbc连接池资源声明”的核心概念之前,我们首先需要理解JDBC(Java Database Connectivity)的基本原理及其在企业级应用中的重要性。JDBC是一种用于执行SQL语句的标准Java API,它允许Java应用程序与...
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0的主要特点包括: 1. **自动管理数据库连接**:C3P0会自动创建、配置和管理数据库连接,避免了频繁创建和销毁连接...
JDBC连接池的基本原理是预先创建一组数据库连接,存储在一个池中,当应用需要访问数据库时,从池中获取一个已存在的连接,而不是每次都创建新的连接。这大大提高了系统性能,特别是在高并发的环境下。在使用完毕后,...
线程安全的JDBC连接池就是为此目的设计的一种优化手段。在这个简单的实现中,我们利用了`ConcurrentLinkedQueue`数据结构来确保多线程环境下的安全性和效率。 首先,让我们了解什么是JDBC连接池。JDBC连接池(Java ...
Java JDBC 数据库连接池总结 Java JDBC 数据库连接池是 Java 应用程序访问数据库的基本原理之一。Java 语言通过 JDBC 技术访问数据库,JDBC 是一种“开放”的方案,为数据库应用开发人员和数据库前台工具开发人员...
- HikariCP:目前被认为是最快的Java JDBC连接池,它设计的主要目标是速度、简单性和低资源占用。 - Druid:阿里巴巴开源的数据库连接池,具有监控、扩展性好的特点。 - Tomcat JDBC Connection Pool:Tomcat...
JDBC连接池是一种资源管理机制,它允许应用程序重复使用已建立的数据库连接,而不是每次需要时都创建新的连接。这显著提高了性能,减少了系统资源的消耗,并有助于避免由于过多的数据库连接导致的问题。在Tomcat早期...
jdbc 连接池技术 jdbc 连接池技术是 Java 语言中最常用的数据库连接池技术之一。它能够提供一个健壮、易用的连接池,方便开发者使用数据库资源。jdbc 连接池技术有多种实现,今天我们将要讨论的是 Proxool、C3P0 和...