一种简单JDBC连接池的实现(1)

合集下载

MySQL中的连接池使用与配置方法

MySQL中的连接池使用与配置方法

MySQL中的连接池使用与配置方法在开发和运维过程中,数据库是一个非常重要的组成部分。

针对高并发的场景,数据库连接的创建和关闭是一个非常耗时的操作,通常会导致性能瓶颈。

为了解决这个问题,我们可以使用连接池来缓解数据库连接的创建和关闭带来的性能问题。

连接池是一种数据库连接的管理机制,它可以预先创建一定数量的数据库连接,并将这些连接保存在一个池中。

当应用程序需要访问数据库时,可以直接从连接池中获取一个空闲的连接,使用完毕后再将连接返回给连接池。

这样可以减少每次访问数据库时创建和关闭连接的时间,提高了应用程序的响应速度和并发处理能力。

在MySQL中,连接池是通过使用连接池软件实现的。

常见的连接池软件有C3P0、Druid等。

接下来,我们将重点介绍如何使用Druid连接池,并对其进行配置。

Druid是阿里巴巴开源的一个高性能、可扩展的数据库连接池。

它具有监控、可扩展、可配置等特点,并且在高并发环境下表现出色。

下面我们将分步骤介绍如何在MySQL中使用Druid连接池。

第一步:添加Druid依赖在项目的pom.xml文件中添加Druid的依赖。

可以通过以下方式引入其最新版本:```xml<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.5</version></dependency>```第二步:配置数据源在项目的配置文件中,添加Druid的数据源配置。

可以根据实际情况进行配置,以下是一个示例配置:```yamlspring:datasource:url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTCusername: rootpassword: 123456# 配置数据源类型和驱动type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.cj.jdbc.Driver# 配置Druid连接池的相关参数druid:# 初始化连接数initial-size: 5# 最小空闲连接数min-idle: 5# 最大活跃连接数max-active: 20# 获取连接时的最大等待时间,单位毫秒max-wait: 60000# 配置测试连接的SQL语句validation-query: SELECT 1# 配置获取连接时是否验证连接的有效性test-on-borrow: true```在上述配置中,需要注意以下几点:- `url`、`username`和`password`配置的是数据库的连接信息。

从jdbc到spring-boot-starter-jdbc

从jdbc到spring-boot-starter-jdbc

从jdbc到spring-boot-starter-jdbc从jdbc到spring-boot-starter-jdbcjdbc 是什么JDBC是⼀种⽤于执⾏SQL语句的API,可以为多种关系数据库提供统⼀访问,它是由⼀组⽤Java语⾔编写的类和接⼝。

是Java访问数据库的标准规范。

JDBC是Java提供的⼀种标准规范,具体的实现由各个数据库⼚商去实现。

对开发者来说屏蔽了不同数据库之间的区别,可以使⽤相同的⽅式(Java API)去操作不同的数据库。

两个设备之间要进⾏通信需要驱动,不同数据库⼚商对JDBC的实现类就是去连接数据库的驱动。

如mysql-connector-java 连接mysql数据库的驱动。

使⽤JDBC连接数据库的步骤1. 注册驱动,这⾥的执⾏就需要驱动jar包// mysql 数据库:“com.mysql.jdbc.Driver”Class.forName(driver);2. 建⽴数据库连接 ConnectionConnection conn=DriverManager.getConnection(url,userName,password);3. 创建Statement对象⽤来执⾏SQL语句Statement statement =conn.createStatement();4. 执⾏SQL语句ResultSet rs =statement.executeQuery(sql);5. 处理结果6. 释放资源数据库连接池在使⽤JDBC进⾏数据库操作过程中,每次使⽤就要创建连接,同时使⽤完毕还必须得关闭连接,操作繁琐容易出错,并且Connection的取得和释放是代价⽐较⾼的操作。

解决这个问题的⽅法就是连接池。

连接池就是事先取得⼀定数量的Connection,程序执⾏处理的时候不是新建Connection,⽽是取得预先准备好的Connection。

DataSource提供连接池机能的技术叫做DataSource。

Java中的JDBC数据库操作技巧

Java中的JDBC数据库操作技巧

Java中的JDBC数据库操作技巧一、JDBC简介JDBC全称为Java Database Connectivity,是Java的一个标准API,用于与各种关系型数据库进行连接、查询、更新等操作。

JDBC提供了一套基于SQL的编程接口,能够让Java程序无需了解底层数据库的细节即可进行数据库操作。

二、JDBC驱动类型JDBC驱动是一个程序模块,用于实现JDBC的API并与具体的数据库进行通信。

JDBC驱动可以分为四种类型:1、JDBC-ODBC桥接式驱动:使用ODBC驱动访问数据库。

这种驱动依赖于底层操作系统的ODBC机制,因此只能在Windows系统中使用。

2、本地式驱动:这种驱动实现了JDBC的API,并且直接与数据库交互。

由于直接调用数据库的API,因此效率要比桥接式驱动高。

3、网络式驱动:这种驱动通过网络协议与数据库进行通信。

大多数商用数据库都支持这种驱动,因此可以跨平台使用。

4、纯Java式驱动:这种驱动完全由Java实现,并且直接与数据库进行通信。

由于没有依赖于底层操作系统的机制,因此可以跨平台使用。

三、JDBC连接数据库JDBC连接数据库通常分为以下步骤:1、加载JDBC驱动在使用JDBC之前,必须先加载相应的JDBC驱动类。

可以通过Class.forName()方法来加载驱动,该方法的参数是完整的类名。

2、连接数据库连接数据库需要的参数通常包括数据库的URL、用户名和密码等。

可以使用DriverManager.getConnection()方法来建立连接,该方法的参数是一个包含数据库连接信息的字符串。

3、关闭连接在使用完连接后,必须调用Connection.close()方法来关闭连接,以便释放资源。

四、JDBC执行SQL语句JDBC可以执行各种类型的SQL语句,包括查询语句、更新语句、存储过程等。

1、执行查询语句可以使用Statement或PreparedStatement对象来执行查询语句。

Proxool 0.9.1的配置与应用

Proxool 0.9.1的配置与应用

Proxool 0.9.1的配置与应用Proxool 0.9.1的配置与应用Proxool老牌的数据库连接池了,褒贬不一,性能上还行。

目前最新版本是0.9.1,相对之前版本的配置有些变动。

这里以MySQL5为例做一个简单数据库连接池配置。

环境:MySQL5.xJDK1.5Proxool 0.9.1一、配置文件proxool.xml<?xml version="1.0"encoding="UTF-8"?><something-else-entirely><proxool><alias>ds</alias><!--数据源的别名--><driver-url>jdbc:mysql://192.168.104.191:3306/testdb?useUnicode= true&characterEncoding=utf8&autoReconnect=true&zeroDateTimeBehavior=conv ertToNull</driver-url><!--url连接串--><driver-class>com.mysql.jdbc.Driver</driver-class><!--驱动类--><driver-properties><property name="user"value="vcom"/><!--用户名--><property name="password"value="vcom"/><!--密码--></driver-properties><!--是指在任一时刻,可以(同时)建立的最大连接数,也就是说,就是已经请求的、但还没可用的新连接数量--><simultaneous-build-throttle>10</simultaneous-build-throttl e><!--最大连接数(默认5个),超过了这个连接数,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定--><maximum-connection-count>100</maximum-connection-count><!--最小连接数(默认2个)--><minimum-connection-count>10</minimum-connection-count><!--proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁默认30秒--><house-keeping-sleep-time>120000</house-keeping-sleep-time><!--最少保持的空闲连接数(默认2个)--><prototype-count>10</prototype-count><!--在使用之前测试--><test-before-use>true</test-before-use><!--用于保持连接的测试语句--><house-keeping-test-sql>select 1</house-keeping-test-sql> </proxool></something-else-entirely>粗体部分是变化部分,上面有详细说明!二、测试类package lavasoft;import mons.logging.Log;import mons.logging.LogFactory;import org.logicalcobwebs.proxool.ProxoolException;import org.logicalcobwebs.proxool.configuration.JAXPConfigurator;import java.io.FileNotFoundException;import java.io.IOException;import java.sql.*;import java.util.List;import java.util.Properties;/*** 简单的JDBC工具类** @author leizhimin 2009-11-23 17:35:26*/public class MyDB {private static final Log log = LogFactory.getLog(MyDB.class);private static final boolean useDBPool = true; //是否使用数据库连接池private static String dburl = null;private static String user = null;private static String password = null;private static Properties props = new Properties();static{init();}public static void init() {if(useDBPool) {try{JAXPConfigurator.configure("proxool.xml", false);// JAXPConfigurator.configure("src/proxool.xml", false);} catch(ProxoolException e) {e.printStackTrace();}return;}try{// props.load(new FileInputStream("/jdbc.properties"));props.load(MyDB.class.getResourceAsStream("/jdbc.properties "));} catch(IOException e) {log.error("#ERROR# :系统加载sysconfig.properties配置文件异常,请检查!", e);}dburl = props.getProperty("jdbc.url");user = props.getProperty("ername").trim();password = props.getProperty("jdbc.password").trim();System.out.println(dburl);System.out.println(user);System.out.println(password);//注册驱动类try{Class.forName(props.getProperty("jdbc.driver"));} catch(ClassNotFoundException e) {log.error("#ERROR# :加载数据库驱动异常,请检查!", e);throw new RuntimeException(e);}}public static void main(String[] args) throws FileNotFoundException {for(int i = 0; i < 5; i++) {Connection conn = getConnection();System.out.println(conn == null? "没连上": "连上了");// System.out.println("--------");// closeConnection(conn);}}/*** 创建一个数据库连接** @return 一个数据库连接*/public static Connection getConnection() {Connection conn = null;//根据连接池配置创建数据库连接if(useDBPool) {try{conn = DriverManager.getConnection("proxool.ds");} catch(SQLException e) {log.error("#ERROR# :无法从数据库连接池获取到数据库连接!");throw new RuntimeException(e);}return conn;}//根据JDBC配置创建数据库连接try{conn = DriverManager.getConnection(dburl, user, password); } catch(SQLException e) {log.error("#ERROR# :创建数据库连接发生异常,请检查!", e);throw new RuntimeException(e);}return conn;}/*** 在一个数据库连接上执行一个静态SQL语句查询** @param conn 数据库连接* @param staticSql 静态SQL语句字符串* @return 返回查询结果集ResultSet对象*/public static ResultSet executeQuery(Connection conn, String staticSql) { ResultSet rs = null;try{//创建执行SQL的对象Statement stmt = conn.createStatement();//执行SQL,并获取返回结果rs = stmt.executeQuery(staticSql);} catch(SQLException e) {log.error("#ERROR# :执行SQL语句出错,请检查!\n"+ staticSql, e);throw new RuntimeException(e);}return rs;}/*** 在一个数据库连接上执行一个静态SQL语句** @param conn 数据库连接* @param staticSql 静态SQL语句字符串*/public static void executeSQL(Connection conn, String staticSql) { try{//创建执行SQL的对象Statement stmt = conn.createStatement();//执行SQL,并获取返回结果stmt.execute(staticSql);} catch(SQLException e) {log.error("#ERROR# :执行SQL语句出错,请检查!\n"+ staticSql, e);throw new RuntimeException(e);}/*** 在一个数据库连接上执行一批静态SQL语句** @param conn 数据库连接* @param sqlList 静态SQL语句字符串集合*/public static void executeBatchSQL(Connection conn, List<String> sqlList) {try{//创建执行SQL的对象Statement stmt = conn.createStatement();for(String sql : sqlList) {stmt.addBatch(sql);}//执行SQL,并获取返回结果stmt.executeBatch();} catch(SQLException e) {log.error("#ERROR# :执行批量SQL语句出错,请检查!", e);}}public static void closeConnection(Connection conn) {if(conn == null) return;try{if(!conn.isClosed()) {//关闭数据库连接conn.close();}} catch(SQLException e) {log.error("#ERROR# :关闭数据库连接发生异常,请检查!", e);throw new RuntimeException(e);}}}运行结果:[INFO] 2010-02-25 13:05:20 [org.logicalcobwebs.proxool.ProxoolFacade] Proxo ol 0.9.1 (23-Aug-2008 11:10)连上了连上了连上了连上了[INFO] 2010-02-25 13:05:22 [org.logicalcobwebs.proxool.ds] Shutting down 'd s' pool immediately [Shutdown Hook][INFO] 2010-02-25 13:05:22 [org.logicalcobwebs.proxool.ConnectionPool] Waiti ng until Thu Feb 25 13:05:22 CST 2010 for all connections to become inactive (active count is 5).[WARN] 2010-02-25 13:05:22 [org.logicalcobwebs.proxool.ConnectionPool] Shu tdown waited for0 milliseconds for all the connections to become inactive but the active count is still 5. Shutting down anyway.[INFO] 2010-02-25 13:05:22 [org.logicalcobwebs.proxool.PrototyperController] Stopping Prototyper thread[INFO] 2010-02-25 13:05:22 [org.logicalcobwebs.proxool.HouseKeeperControlle r] Stopping HouseKeeper threadProcess finished with exit code 0Proxool提供的配置方式很多,这里进选择最常用的xml方式,另外的方式也很简单,可以参看官方文档:/index.html/configure.html三、Proxool很扯蛋的问题----找不到配置文件proxool的配置文件加载做的比较差劲,通过两个类来加载配置文件:org.logicalcobwebs.proxool.configuration.PropertyConfiguratororg.logicalcobwebs.proxool.configuration.ServletConfiguratororg.logicalcobwebs.proxool.configuration.XMLConfiguratororg.logicalcobwebs.proxool.configuration.JAXPConfiguratororg.logicalcobwebs.proxool.configuration.AvalonConfigurator这几个类加载配置文件时候,常常会提示找不到配置文件,其原因是proxool在读取CLASSPATH下路径有问题,经常看到一种情况就是,在开发环境IDE环境下面测试通过,在打包后脱离IDE环境独立运行时候就提示找不到配置文件。

数据库连接池参数

数据库连接池参数

数据库连接池参数数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。

对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。

数据库连接池正是针对这个问题提出来的。

数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数制约。

无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。

连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素: 1. 最轻连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。

2. 最小连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。

3. 最轻连接数与最小连接数差距最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。

不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

连接池基本的思想就是在系统初始化的时候,将数据库相连接做为对象存储在内存中,当用户须要出访数据库时,并非创建一个代莱相连接,而是从连接池中抽出一个已创建的空闲相连接对象。

采用完后,用户也并非将相连接停用,而是将相连接摆回去连接池中,以供下一个命令出访采用。

而相连接的创建、断裂都由连接池自身去管理。

同时,还可以通过设置连接池的参数去掌控连接池中的起始连接数、相连接的上时上限数以及每个相连接的最小采用次数、最小空闲时间等等。

也可以通过其自身的管理机制去监控数据库相连接的数量、采用情况等。

Java数据库连接池介绍(7)--HikariCP介绍

Java数据库连接池介绍(7)--HikariCP介绍

Java数据库连接池介绍(7)--HikariCP介绍HikariCP 是⼀个快速、简单、可靠的 JDBC 连接池,在性能上做了很多优化,是⽬前最快的数据库连接池;本⽂主要介绍 HikariCP 的基本使⽤,⽂中使⽤到的软件版本:Java 1.8.0_191、HikariCP 4.0.3、Spring Boot 2.3.12.RELEASE。

1、配置参数HikariCP 所有时间相关的参数单位都为 ms。

1.1、基本配置参数默认值描述dataSourceClassName none驱动⾥⾯数据源的类名称;不⽀持 XA数据源,各数据源对应的数据源类名可参见 ”2、数据源类名“jdbcUrl none连接 url;该参数与 dataSourceClassName 设置⼀个即可username none⽤户名password none密码1.2、常⽤配置参数默认值描述autoCommit true连接返回连接池时,是否⾃动提交事务connectionTimeout30000从连接池获取连接的最⼤超时时间idleTimeout60000空闲连接存活的最⼤时间,当空闲连接数>minimumIdle 且连接的空闲状态时间>idleTimeout 时,将把该连接从连接池中删除;只有当 minimumIdle < maximumPoolSize 时,该设置才⽣效;0 表⽰永不超时keepaliveTime 0保持空闲连接可⽤的检测频率;0 表⽰不检测maxLifetime1800000连接存活的最⼤时间;0 表⽰没有限制connectionTestQuery none连接检测的查询语句;如果驱动⽀持 JDBC 4,强烈建议不要设置此参数minimumIdle same asmaximumPoolSize最⼩空闲连接数;为了提⾼性能,建议不要设置此参数,使连接池为固定⼤⼩maximumPoolSize10最⼤连接数metricRegistry none该参数仅通过编程配置或 IoC 容器可⽤;该参数⽤于指定池使⽤的 Codahale/DropwizardMetricRegistry实例来记录各种指标。

JDBC数据库重连机制的研究与实现

JDBC数据库重连机制的研究与实现
NhomakorabeaI
4 q 一 — ] y …一 mS I el nJ t ( —
( oeeo ow r E gne n ,u n nU i rt,u m n 5 0 1 Y n n C ia Clg f ae nier g Yn nv syK n ig6 0 9 ,u n , n ) l fSt i a ei a h
Ab t a t sr c J C i h Io a ap o r m o o n ci g a d a c s i g v r u aa a e ,i c n it o e ls e n ne fc s DB st e AP f v r ga fr c n e t n c e s a i sd tb s s t o sss fa s to ca s sa d i tra e , J n n o f
通过分析研 究 J B 2 0接 口原理 以及现有数据库连接 池在数据库重连 技术 方面的缺 陷, 出了一种 能进行 自动重新连接数据库 的 DC. 提
策略。该策略运用循环检测机制, 弥补 了现有数据库连接池的不足 。测试结果证明, 数据库重连机制 的策略能有效提 高系统 的健壮
性 和 整体 性 能、 少 系统 维 护 量 。 减 关 键 词 J B 数据 库 重 连 算 法 数 据 库 访 问 DC
0 引 言
随着信息爆炸时代 的到来 , 数据量与 日俱增 , 数据库 的应用
几乎 无 处 不 在 。Jv 作 为 面 向对 象 的语 言为 数 据 库 应 用 开 发 提 aa
连接就不能再连接到数据库 系统。为 了解决上 述问题 , 得不 不
人 为地 重 新 启 动 We 器 或 者应 用程 序 , 终 导 致 了 系统 维 护 b容 最 量 和 开销 过 大 。 关于数据库重连机制 的研究 , 国外有 A ah pce软件基金会开 发的项 目 D C …。D C BP B P是 免 费 开 源 数据 库 连 接 池 开 发 包 , 在 基 于 JE 2 E或 Jv 发 的 桌 面 大 型 项 目 中广 泛 应 用 , 是 对 于 aa开 但

详解C3P0(数据库连接池)

详解C3P0(数据库连接池)
当然,除了以上这几种常用的参数设置以外,这里还有一份有关c3p0-config.xml参数的详细清单,如有需要可自行增加。
4.c3p0-config.xml参 数 清 单
<c3p0-config> <default-config> <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> <property name="acquireIncrement">3</property> <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> <property name="acquireRetryAttempts">30</property> <!--两次连接中间隔时间,单位毫秒。Default: 1000 --> <property name="acquireRetryDelay">1000</property> <!--连接关闭时默认将所有未提交的操作回滚。Default: false -->
<!--每60秒检查所有连接池中的空闲连接。Default: 0 --> <property name="idleConnectionTestPeriod">60</property>
<!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> <property name="initialPoolSize">3</property>
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一种简单JDBC连接池的实现(一)
作者:陈立峰 发文时间:2003.12.11

1.前言
数据库应用,在许多软件系统中经常用到,是开发中大型系统不可缺少的辅助。但如
果对数据库资源没有很好地管理(如:没有及时回收数据库的游标(ResultSet)、
Statement、连接 (Connection)等资源),往往会直接导致系统的稳定。这类不稳定因
素,不单单由数据库或者系统本身一方引起,只有系统正式使用后,随着流量、用户
的增加,才会逐步显露。

在b基于Java开发的系统中,JDBC是程序员和数据库打交道的主要途径,提供了完
备的数据库操作方法接口。但考虑到规范的适用性,JDBC只提供了最直接的数据库
操作规范,对数据库资源管理,如:对物理连接的管理及缓冲,期望第三方应用服务
器(Application Server)的提供。

本文,以JDBC规范为基础,介绍相关的数据库连接池机制,并就如果以简单的方式,
实现有效地管理数据库资源介绍相关实现技术。

2.连接池技术背景
2.1JDBC
JDBC是一个规范,遵循JDBC接口规范,各个数据库厂家各自实现自己的驱动程序
(Driver),如下图所示:

应用在获取数据库连接时,需要以URL的方式指定是那种类型的Driver,在获得特
定的连接后,可按照固定的接口操作不同类型的数据库,如: 分别获取Statement、执
行SQL获得ResultSet等,如下面的例子 :
import java.sql.*;

..DriverManager.registerDriver(
new oracle.jdbc.
driver.OracleDriver());
Connection dbConn = DriverManager.getConnection
(“jdbc:oracle:thin:@127.0.0.1:1521:
oracle”,“username”, “password” );
Statement st = dbConn.createStatement();
ResultSet rs = st.executeQuery(
“select * from demo_table” );

some data source operation in herers.close();
st.close();dbConn.close();

在完成数据操作后,还一定要关闭所有涉及到的数据库资源。这虽然对应用程序的逻
辑没有任何影响,但是关键的操作。上面是个简单的例子,如果搀和众多的if-else、
exception,资源的管理也难免百密一疏。如同C中的内存泄漏问题,Java系统也同
样会面临崩溃的恶运。所以数据库资源的管理依赖于应用系统本身,是不安全、不稳
定的一种隐患。

2.2JDBC连接池
在标准JDBC对应用的接口中,并没有提供资源的管理方法。所以,缺省的资源管理
由应用自己负责。虽然在JDBC规范中,多次提及资源的关闭/回收及其他的合理运
用。但最稳妥的方式,还是为应用提供有效的管理手段。所以,JDBC为第三方应用
服务器(Application Server)提供了一个由数据库厂家实现的管理标准接口:连接缓
冲(connection pooling)。引入了连接池( Connection Pool )的概念 ,也就是以缓冲池的
机制管理数据库的资源。

JDBC最常用的资源有三类:
-Connection: 数据库连接。
-Statement: 会话声明。
-ResultSet: 结果集游标。
分别存在以下的关系 :
这是一种 ‘爷-父-子’ 的关系,对Connection的管理,就是对数据库资源的管理。举
个例子: 如果想确定某个数据库连接(Connection)是否超时,则需要确定其(所有的)
子Statement是否超时,同样,需要确定所有相关的ResultSet是否超时;在关闭
Connection前,需要关闭所有相关的Statement和ResultSet。

因此,连接池(Connection Pool)所起到的作用,不仅仅简单地管理Connection,还涉
及到 Statement和ResultSet。

2.3连接池(ConnectionPool)与资源管理
ConnectionPool以缓冲池的机制,在一定数量上限范围内,控制管理Connection,
Statement和ResultSet。任何数据库的资源是有限的,如果被耗尽,则无法获得更多
的数据服务。

在大多数情况下,资源的耗尽不是由于应用的正常负载过高,而是程序原因。
在实际工作中,数据资源往往是瓶颈资源,不同的应用都会访问同一数据源。其中某
个应用耗尽了数据库资源后,意味其他的应用也无法正常运行。因此,ConnectionPool
的第一个任务是限制:每个应用或系统可以拥有的最大资源。也就是确定连接池的大
小(PoolSize)。

ConnectionPool的第二个任务:在连接池的大小(PoolSize)范围内,最大限度地使用资
源,缩短数据库访问的使用周期。许多数据库中,连接(Connection)并不是资源的
最小单元,控制Statement资源比Connection更重要。以Oracle为例:

每申请一个连接(Connection)会在物理网络(如 TCP/IP网络)上建立一个用于通
讯的连接,在此连接上还可以申请一定数量的Statement。同一连接可提供的活跃
Statement数量可以达到几百。 在节约网络资源的同时,缩短了每次会话周期(物理
连接的建立是个费时的操作)。但在一般的应用中,多数按照2.1范例操作,这样有
10个程序调用,则会产生10次物理连接,每个Statement单独占用一个物理连接,
这是极大的资源浪费。 ConnectionPool可以解决这个问题,让几十、几百个Statement
只占用同一个物理连接, 发挥数据库原有的优点。

通过ConnectionPool对资源的有效管理,应用可以获得的Statement总数到达 :
(并发物理连接数) x (每个连接可提供的Statement数量)
例如某种数据库可同时建立的物理连接数为 200个,每个连接可同时提供250个
Statement,那么ConnectionPool最终为应用提供的并发Statement总数为: 200 x 250 =
50,000个。这是个并发数字,很少有系统会突破这个量级。所以在本节的开始,指出
资源的耗尽与应用程序直接管理有关。
对资源的优化管理,很大程度上依靠数据库自身的JDBC Driver是否具备。有些数据
库的JDBC Driver并不支持Connection与Statement之间的逻辑连接功能,如
SQLServer,我们只能等待她自身的更新版本了。

对资源的申请、释放、回收、共享和同步,这些管理是复杂精密的。所以,ConnectionPool
另一个功能就是,封装这些操作,为应用提供简单的,甚至是不改变应用风格的调用
接口。

相关文档
最新文档