连接池

转自http://baike.baidu.com/view/1528732.htm

连接池的好处

  连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
  这种把连接“ 汇集” 起来的技术基于这样的一个事实:对于大多数应用程序,当它们正在处理通常需要数毫秒完成的事务时,仅需要能够访问JDBC 连接的 1 个线程。当不处理事务时,这个连接就会闲置。相反,连接池允许闲置的连接被其它需要的线程使用。
  事实上,当一个线程需要用 JDBC 对一个 GBase 或其它数据库操作时,它从池中请求一个连接。当这个线程使用完了这个连接,将它返回到连接池中,这样这就可以被其它想使用它的线程使用。
  当连接从池中“ 借出” ,它被请求它的线程专有地使用。从编程的角度来看,这和用户的线程每当需要一个 JDBC 连接的时候调用DriverManager.getConnection() 是一样的,采用连接池技术,可通过使用新的或已有的连接结束线程。
  连接池可以极大的改善用户的 Java 应用程序的性能,同时减少全部资源的使用。连接池主要的优点有:
  减少连接创建时间
  虽然与其它数据库相比 GBase 提供了较为快速连接功能,但是创建新的 JDBC 连接仍会招致网络和 JDBC 驱动的开销。如果这类连接是“ 循环” 使用的,使用该方式这些花销就可避免。
  简化的编程模式
  当使用连接池时,每一个单独的线程能够像创建了一个自己的 JDBC 连接一样操作,允许用户直接使用JDBC 编程技术。
  受控的资源使用
  如果用户不使用连接池,而是每当线程需要时创建一个新的连接,那么用户的应用程序的资源使用会产生非常大的浪费并由可能会导致高负载下的异常发生。
  注意,每个连到 GBase 的连接在客户端和服务器端都有花销(内存,CPU ,上下文切换等等)。每个连接均会对应用程序和 GBase 服务器的可用资源带来一定的限制。不管这些连接是否在做有用的工作,仍将使用这些资源中的相当一部分。
  连接池能够使性能最大化,同时还能将资源利用控制在一定的水平之下,如果超过该水平,应用程序将崩溃而不仅仅是变慢。

连接池运作原理

   在实际应用开发中,特别是在WEB 应用系统中,如果JSP 、Servlet 或EJB 使用JDBC 直接访问数据库中的数据,每一次数据访问请求都必须经历 建立数据库连接、打开数据库、存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性 能必然会急剧下降,甚至会导致系统崩溃。数据库连接池技术是解决这个问题最常用的方法,在许多应用程序服务器(例 如:Weblogic,WebSphere,JBoss )中,基本都提供了这项技术,无需自己编程,但是,深入了解这项技术是非常必要的。
  数据库连接池技术的思想非常简单,将数据库连接作为对象存储在一个Vector 对象中,一旦数据库连接建立后,不同的数据库访问请求就可以共享这些连接,这样,通过复用这些已经建立的数据库连接,可以克服上述缺点,极大地节省系统资源和时间。
  数据库连接池的主要操作如下:
  (1 )建立数据库连接池对象(服务器启动)。
  (2 )按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。
  (3 )对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。
  (4 )存取数据库。
  (5 )关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。
  (6 )释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。

连接池的实现

  1 、连接池模型
  本文讨论的连接池包括一个连接池类(DBConnectionPool )和一个连接池管理类 (DBConnetionPoolManager )。连接池类是对某一数据库所有连接的“ 缓冲池” ,主要实现以下功能:① 从连接池获取或创建可用连接;② 使用完毕之后,把连接返还给连接池;③ 在系统关闭前,断开所有连接并释放连接占用的系统资源;④ 还能够处理无效连接(原来登记为可用的连接,由于某种原因 不再可用,如超时,通讯问题),并能够限制连接池中的连接总数不低于某个预定值和不超过某个预定值。
  连接池管理类是连接池类的外覆类(wrapper ), 符合单例模式,即系统中只能有一个连接池 管理类的实例。其主要用于对多个连接池对象的管理,具有以下功能:① 装载并注册特定数据库的JDBC 驱动程序;② 根据属性文件给定的信息,创建连接池对 象;③ 为方便管理多个连接池对象,为每一个连接池对象取一个名字,实现连接池名字与其实例之间的映射;④ 跟踪客户使用连接情况,以便需要是关闭连接释放资 源。连接池管理类的引入主要是为了方便对多个连接池的使用和管理,如系统需要连接不同的数据库,或连接相同的数据库但由于安全性问题,需要不同的用户使用 不同的名称和密码。
  2 、连接池实现
  下面给出连接池类和连接池管理类的主要属性及所要实现的基本接口:
  public class DBConnectionPool implements TimerListener{
  private int checkedOut;// 已被分配出去的连接数
  private ArrayList freeConnections = new ArrayList();// 容器,空闲池,根据// 创建时间顺序存放已创建但尚未分配出去的连接
  private int minConn;// 连接池里连接的最小数量
  private int maxConn;// 连接池里允许存在的最大连接数
  private String name;// 为这个连接池取个名字,方便管理
  private String password;// 连接数据库时需要的密码
  private String url;// 所要创建连接的数据库的地址
  private String user;// 连接数据库时需要的用户名
  public Timer timer;// 定时器
  public DBConnectionPool(String name, String URL, String user, String
  password, int maxConn)// 公开的构造函数
  public synchronized void freeConnection(Connection con) // 使用完毕之后,// 把连接返还给空闲池
  public synchronized Connection getConnection(long timeout)// 得到一个连接,//timeout 是等待时间
  public synchronized void release()// 断开所有连接,释放占用的系统资源
  private Connection newConnection()// 新建一个数据库连接
  public synchronized void TimerEvent() // 定时器事件处理函数
  }
  public class DBConnectionManager {
  static private DBConnectionManager instance;// 连接池管理类的唯一实例
  static private int clients;// 客户数量
  private ArrayList drivers = new ArrayList();// 容器,存放数据库驱动程序
  private HashMap pools = new HashMap ();// 以name/value 的形式存取连接池// 对象的名字及连接池对象
  static synchronized public DBConnectionManager getInstance()// 如果唯一的// 实例instance 已经创建,直接返回这个实例; 否则,调用私有构造函数,创// 建连接池管理类的唯一实例
  private DBConnectionManager()// 私有构造函数, 在其中调用初始化函数init()
  public void freeConnection(String name, Connection con)// 释放一个连接,//name 是一个连接池对象的名字
  public Connection getConnection(String name)// 从名字为name 的连接池对象// 中得到一个连接
  public Connection getConnection(String name, long time)// 从名字为name
  // 的连接池对象中取得一个连接,time 是等待时间
  public synchronized void release()// 释放所有资源
  private void createPools(Properties props)// 根据属性文件提供的信息,创建// 一个或多个连接池
  private void init()// 初始化连接池管理类的唯一实例,由私有构造函数调用
  private void loadDrivers(Properties props)// 装载数据库驱动程序
  }
  3 、连接池使用
  上面所实现的连接池在程序开发时如何应用到系统中呢?下面以Servlet 为例说明连接池的使用。
  Servlet 的生命周期是:在开始建立servlet 时,调用其初始化(init )方法。之 后每个用户请求都导致一个调用前面建立的实例的service 方法的线程。最后,当服务器决定卸载一个servlet 时,它首先调用该servlet 的 destroy 方法。
  根据servlet 的特点,我们可以在初始化函数中生成连接池管理类的唯一实例(其中包括创建一个或多个连接池)。如:
  public void init() throws ServletException
  {
  connMgr = DBConnectionManager.getInstance();
  }
  然后就可以在service 方法中通过连接池名称使用连接池,执行数据库操作。最后在destroy 方法中释放占用的系统资源,如:
  public void destroy() {
  connMgr.release(); super.destroy();

  }

结束语

   在使用JDBC 进行与数据库有关的应用开发中,数据库连接的管理是一个难点。很多时候,连接的混乱管理所造成的系统资源开销过大成为制约大型企业级应用 效率的瓶颈。对于众多用户访问的Web 应用,采用数据库连接技术的系统在效率和稳定性上比采用传统的其他方式的系统要好很多。本文阐述了使用JDBC 访问 数据库的技术? 讨论了基于连接池技术的数据库连接管理的关键问题并给出了一个实现模型。文章所给出的是连接池管理程序的一种基本模式,为提高系统的整体性 能,在此基础上还可以进行很多有意义的扩展。
  http://www.webdevelopersjournal.com/columns/connection_pool.html
  http://www.webdevelopersjournal.com/columns/DBConnectionManager.java

 

十二、连接池线程池配置——HttpClient连接池 3.x、4.x 和 5.x API 是完全不兼容的,使用起来比较麻烦。在 HttpClient 的执行过程中,连接复用是一个关键的性能优化点。通过合理配置连接池参数、正确处理连接的使用和释放,以及关注连接池的生命周期和性能监控,可以有效提高。下面是对连接池源码的重要步骤分析,包括连接的复用和非复用情况的处理,以及连接池内部的数据结构。此异常通常表示连接池中的连接用尽,导致无法获取到可用连接。这种状态表示线程在等待连接池中的连接。时,到每个主机的并发最多只有 200,但总的并发连接数为 300。 阅读详情

相关推荐

十二、连接池线程池配置——数据库连接池

在应用系统开发中,池化技术(如对象池、连接池、线程池)被广泛使用,通过复用来减少资源消耗和提升性能。连接池(如数据库连接池、Redis连接池、HTTP连接池)主要通过复用TCP连接来提高效率。本文主要介绍数据库连接池(DBCP)、HTTP连接池(HttpClient)和线程池的配置。 数据库连接池是用来管理数据库连接的技术,可以显著提高应用程序的性能和响应速度。常见的数据库连接池实现有C3P0、DBCP、Druid等。下面以为例进行详细讲解。 使用yaml配置实例如下,万卷不离其宗: 配置说明数据库连接配置

流楚丶格念的博客 1345

连接池的作用及讲解

连接池的作用就是为了提高性能。        连接池的作用:连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问。这样省略了创建连接和销毁连接的过程。这样性能上得到了提高。 基本原理是这样的: (1)建立数据库连接池对象(服务器启动)。 (2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。 (3)对于一个数据库访问请求,直接从连接池...

cbmljs的博客 2万+

SQLAlchemy 连接池

调整这些参数可以帮助你更好地管理数据库连接,并减少因连接超时或服务器断开连接而导致的问题。记得根据你的应用程序的需求和数据库服务器的配置来合理设置这些参数。在 SQLAlchemy 中,确实可以通过配置连接池的参数来管理连接的超时和回收,从而确保连接在需要时能够被重新建立。SQLAlchemy 使用的是。作为其默认的连接池实现。为了配置这些参数,你可以在创建引擎时将它们传递给。

youhebuke225的博客 1441

JDBC连接池

连接池是创建和管理数据库连接的缓冲池技术,它预先建立一定数量的数据库连接,当应用程序需要时从池中获取连接,使用完毕后归还给池而不是直接关闭。

echo_123qq的博客 2083

保姆级教程 | MS构建三层石墨后转成LAMMPS的data文件

喜欢的话记得一键三连~

baguette的博客 2951

手把手教你用若依WMS搭建企业级仓库管理系统(Vue+Spring Boot实战)

本文提供了一份基于若依框架(RuoYi)快速搭建企业级仓库管理系统(WMS)的实战指南。详细介绍了从环境准备、项目初始化到核心功能模块(如入库流程、库存管理看板)深度定制的全过程,并涵盖Lodop打印集成、移动端PWA适配及生产环境Docker部署等高级主题,帮助开发者高效构建稳定可用的WMS系统。

weixin_29015899的博客 564

JavaJDBC:连接池

本篇内容包括:数据库连接池概述、JDBC 连接池原理、JDBC 连接池 Demo(addBatch demo、获取主键 demo、查看数据库的元数据 demo等)以及其他类型数据库连接池的介绍(比如 Druid)。

栗筝i的博客 8148

zynq+LWIP 裸机双网口实现(MIO+EMIO)+程序下载

芯片型号: ZYNQ: XC7Z010clg400开发软件:Vivado2022 + Xilinx Vitis 2022网卡芯片:RTL8211FDI(需要根据网口芯片型号修改对应的硬件配置代码。

thinking in 小宇宙 3408

MySQL连接池

数据库连接池(Connection pooling):在启动时建立足够的数据库连接,组成一个连接池,后续程序可以对池中的连接进行申请、使用、释放。

weixin_45717971的博客 2107

避坑指南:STM32移植CanFestival时那些没人告诉你的细节(含TJA1050硬件适配)

本文深入解析STM32移植CanFestival协议栈时的关键细节与TJA1050硬件适配技巧,涵盖AVR残留代码清理、定时器中断优化及CAN通信稳定性提升方案。特别针对TJA1050在特定波特率下的信号畸变问题提供实战解决方案,帮助开发者规避移植过程中的隐形陷阱,实现工业级稳定通信。

work3的博客 761

CentOS8静默安装Oracle11.2.0.1

背景 新安装oracle,用静默安装方式就不需要安装图形界面了,省时省力。 前期准备工作与图形化安装一样,如创建用户|用户组、环境变量、内核参数、创建目录等. 可参考图形化安装,链接:https://blog.youkuaiyun.com/heroicpoem/article/details/104229369 环境 平台 版本 操作系统 centOS 8 Oracle 11gR2 1.响应文件 响应文件的内容就是图形化安装时手工设置的选项内容。 解压后,database/response/db

heroicpoem的专栏 4518

DBCP连接池与C3P0连接池

DBCP连接池与C3P0连接池的比较 如果一个项目中如果需要多个连接,如果一直获取连接,断开连接,这样比较浪费资源,如果创建一个池,用池来管理Connection,这样就可以重复使用Connection。有了池我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会

没有所谓的命运,只有不同的选择! 2万+

手把手教你用RoboTwin训练RDT模型:从环境配置到实战微调(避坑指南)

本文提供了一份详尽的避坑指南,手把手教你如何在RoboTwin开源仿真环境中,从零开始配置环境、采集数据并完成RDT视觉语言动作模型的实战微调。文章涵盖了环境搭建、数据流水线构建、模型配置与训练等关键步骤,旨在帮助研究者和开发者高效利用仿真数据,低成本探索具身智能应用。

weixin_29094979的博客 132

连接池以及常用连接池

连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。 常用连接池:DBCP连接池,C3p0连接池,Druid连接池

@王某人 3112

17、神经网络训练算法与高阶模糊Cohen - Grossberg神经网络稳定性分析

本文介绍了一种新的数据驱动算法用于神经网络训练,该算法继承三次样条权重函数的优点,具有简单架构和良好泛化性能,并通过并行机制显著提升训练速度。同时,研究了高阶模糊Cohen-Grossberg神经网络(HOFCGNN)在可变及无界延迟下的稳定性,利用M矩阵理论和向量Lyapunov函数方法,证明了系统平衡点的存在性、唯一性和全局指数稳定性。研究成果为神经网络的高效训练与稳定应用提供了理论支持和技术路径。

b9c0d的博客 148

【ACP】2025-最新-疑难题解析-1

即用户手动释放时,因实例释放保护开启,不会释放该 ECS 实例(不同云厂商具体实现有差异,但题目场景下选 C )。结合题目中标记,答案为。综上,答案选 B。综上,答案选 C。综上,答案选 D。综上,答案选 A。综上,答案选 A。综上,答案选 C。综上,答案选 D。综上,答案选 A。

jundao1997的专栏 365

Day56 数据库连接池,Druid连接池

自己写的连接池类 FastConnectionPool//存储connection连接对象的资源容器(removeFirst)//get,set方法(没有list的get、set方法)//初始化listtry {//创建连接对象,并添加到连接池容器中i++) {init();if(!//回收connection对象,使用完了不用close()方法关闭,而是回收到list中继续使用,提高复用率测试类//创建数据库连接池//设置参数。

weixin_69595694的博客 1741

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

连接池原理解读,各个连接池对比

1.JDBC规范的实现 JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个规范而不是一个实现,能够执行SQL语句。它由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现。本文以Mysql实现为例。 1.1.JDBC编程模型 1.装载相应数据库的JDBC驱动并进行初始化; 2.建立JDBC和数据库之间的Connection连接; 3.创建Statement或者PreparedStatement接口; 4.执行SQL语句; 5.处理和显

歪桃的博客 8108

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

关于连接池

关于连接池:是什么 为什么 有哪些

qq_49665089的博客 1081

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

mysql连接池

mysql 连接池

weixin_51332735的博客 1374

httpclient添加连接池

httpclient连接池相关配置

Yuantao1998的博客 3130

连接池以及连接池的使用

连接池以及连接池的使用

weixin_45190566的博客 2620

Druid之连接池

需要注意的是,我们下面提供的几种实现方式都是基于简单的原型,目的是带你了解连接池实现的一些基本原理。真实的数据库连接池技术需要考虑更多复杂的细节。 所以下面这些代码都是不能在生产上直接使用的。 实现的时候会用到java.sql.Connection,由于这个只是一个接口无法创建实例,为了演示方便,我继承这个接口写了一个简单的测试类,只是在commit方法里加了延时模拟提交。 实现方式1: 很容易马上想到的一种方案,我们用一个map存放连接对象,需要的时候从map里拿来用就可以了。

louie_zhao的博客 5699

数据库连接池原理及常用连接池介绍

一、背景介绍 1.1 什么是连接池 数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。 1.2 为什么要使用连接池 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。 一个数据库连接对象均对应一个物理数据库连接,每次操作都打开一个物理连接,使用完都关闭连接,这样造成系统的 性能低下。 数据库连接池的解...

zhaohong_bo的专栏 2021

MySQL 连接池

在Web应用发展的早期阶段,数据库连接管理经历了从简单到复杂的演化过程:最初的Web应用采用最简单粗暴的方式处理数据库连接: 这种方式在用户量较少时还能勉强应付,但问题很快显现:想象一下,如果每个用户访问都要重新"拨号"连接数据库,就像每次打电话都要重新申请电话线一样低效。为了解决频繁连接的问题,开发者开始使用长连接: 长连接解决了连接开销问题,但引入了新的挑战:这就像整个公司只有一部电话,所有人都要排队使用,效率反而更低。**连接池(Connection Pool)**技术的出现彻底改变了数据库连接管理的

m0_73821826的博客 1070

mysql连接池和redis连接池

定义:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成 一个连接池,由程序动态地对池中的连接进行申请,使用,释放。大白话:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的 时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度, 还更加安全可靠。这里讲的数据库,不单只是指Mysql,也同样适用于Redis。

jianfeng123123的博客 996
上一篇: Java工厂模式 factory
下一篇: IoC是什么
xiaoxinphp
博客等级 码龄18年 1粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值