数据库连接池与池化思想
目录
1. 数据库连接池概述
1.1 什么是数据库连接池?
1.2 为什么需要连接池?
2. 池化思想
2.1 池化思想的优点
2.2 池化思想的典型应用
3. 常见的开源数据库连接池
3.1 DBCP
3.2 C3P0
3.3 Druid
4. Druid连接池的使用
4.1 Druid的特点
4.2 Druid的使用步骤
5. 总结
在现代应用程序开发中,数据库连接池是一个非常重要的概念。它通过池化思想,有效地管理和复用数据库连接,从而提升应用程序的性能和资源利用率。本文将详细介绍数据库连接池的概念、工作原理、常见的开源连接池实现,以及如何使用它们。
1. 数据库连接池概述
1.1 什么是数据库连接池?
数据库连接池是一种用于管理数据库连接的技术。它通过在应用程序启动时预先创建一定数量的数据库连接,并将这些连接保存在一个“池”中。当应用程序需要与数据库交互时,直接从连接池中获取一个可用的连接,使用完毕后将连接归还到池中,而不是每次都创建和销毁连接。
1.2 为什么需要连接池?
在没有连接池的情况下,每次数据库操作都需要创建新的连接,操作完成后又需要关闭连接。这种频繁的创建和销毁连接的过程会消耗大量的系统资源和时间,尤其是在高并发的场景下,性能问题会更加明显。
使用连接池的好处包括:
-
减少创建和销毁连接的开销:连接池中的连接是预先创建好的,使用时直接从池中获取,避免了频繁创建和销毁连接的开销。
-
提升性能:连接的复用减少了系统资源的消耗,提升了数据库操作的响应速度。
-
控制连接数量:连接池可以限制最大连接数,防止数据库因连接过多而崩溃。
2. 池化思想
池化思想(Pooling)是一种资源管理策略,广泛应用于计算机科学中。它的核心思想是预先创建一定数量的资源,并将这些资源保存在一个池中,使用时从池中获取,使用完毕后归还到池中。池化思想不仅可以应用于数据库连接,还可以应用于线程、内存、对象等资源的管理。
2.1 池化思想的优点
-
资源复用:避免了频繁创建和销毁资源的开销。
-
资源控制:可以限制资源的最大使用量,防止资源耗尽。
-
性能提升:通过复用资源,减少了系统开销,提升了整体性能。
2.2 池化思想的典型应用
-
数据库连接池:如DBCP、C3P0、Druid等。
-
线程池:如Java中的
ExecutorService。 -
对象池:如Apache Commons Pool。
3. 常见的开源数据库连接池
3.1 DBCP
DBCP(Database Connection Pool)是Apache开源组织提供的一个数据库连接池实现。它简单易用,适合小型项目。
3.2 C3P0
C3P0是一个开源的JDBC连接池,支持自动回收空闲连接、自动重连等功能,适合中型项目。
3.3 Druid
Druid是阿里巴巴开源的一个高性能数据库连接池。它不仅提供了连接池的基本功能,还支持SQL监控、防火墙、加密等高级功能,适合大型项目。
4. Druid连接池的使用
4.1 Druid的特点
-
高性能:Druid在性能上优于其他连接池。
-
监控功能:内置了强大的SQL监控功能,可以实时查看SQL执行情况。
-
扩展性强:支持自定义插件,方便扩展。
4.2 Druid的使用步骤
-
导入依赖
在项目中引入Druid的依赖,例如Maven项目中可以添加以下依赖:<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version> </dependency>
-
配置连接池
可以通过代码或配置文件来配置Druid连接池。以下是一个通过代码配置的示例:DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/test"); dataSource.setUsername("root"); dataSource.setPassword("root"); dataSource.setInitialSize(5); // 初始连接数 maxIdle 6//连接池中允许保持空闲状态的最大连接数 dataSource.setMaxActive(10); // 最大连接数 dataSource.setMaxWait(2000); // 最大等待时间 -
从连接池中获取连接
使用getConnection()方法从连接池中获取连接:Connection conn = dataSource.getConnection();
-
归还连接
使用完毕后,调用close()方法将连接归还到连接池:conn.close();
-
使用配置文件
可以通过配置文件来配置Druid连接池,例如druid.properties:driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test username=root password=root initialSize=5 maxActive=10 maxWait=3000 maxIdle=6 minIdle=3
-
工具类封装
可以封装一个工具类来简化连接池的使用:package cn.qcby.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource; import java.io.InputStream; import java.sql.*; import java.util.Properties;/*** JDBC的工具类 1.0版本* JDBC的工具类 2.0版本(智能一些),编写properties属性文件,程序就可以读取属性文件* JDBC的工具类 3.0版本,加入连接池对象*/ public class JdbcUtils2 {// 连接池对象private static DataSource DATA_SOURCE;static{// 加载属性文件Properties pro = new Properties();InputStream inputStream = JdbcUtils2.class.getResourceAsStream("/druid.properties");try {// 加载属性文件pro.load(inputStream);// 创建连接池对象DATA_SOURCE = DruidDataSourceFactory.createDataSource(pro);} catch (Exception e) {e.printStackTrace();}}/*** 从连接池中获取连接,返回。* @return*/public static Connection getConnection(){Connection conn = null;try {conn = DATA_SOURCE.getConnection();} catch (SQLException e) {e.printStackTrace();}return conn;}/*** 关闭资源* @param conn* @param stmt* @param rs*/public static void close(Connection conn, Statement stmt, ResultSet rs){if(rs != null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 关闭资源* @param conn* @param stmt*/public static void close(Connection conn, Statement stmt){if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}这里的关闭资源不是真的关闭资源了,而是对close方法的重写,实际上是返回给了数据库连接池中。另外加载驱动的步骤也省略了,Druid 连接池在初始化时(即
DruidDataSourceFactory.createDataSource(pro))会自动加载并注册指定的驱动类。
-
5. 总结
数据库连接池通过池化思想,有效地管理和复用数据库连接,提升了应用程序的性能和资源利用率。常见的开源连接池如DBCP、C3P0和Druid都提供了丰富的功能和配置选项,开发者可以根据项目需求选择合适的连接池。
在实际开发中,建议使用Druid连接池,它不仅性能优越,还提供了强大的监控和扩展功能,非常适合大型项目。通过合理配置连接池参数,可以进一步提升系统的稳定性和性能。
相关文章:
数据库连接池与池化思想
目录 1. 数据库连接池概述 1.1 什么是数据库连接池? 1.2 为什么需要连接池? 2. 池化思想 2.1 池化思想的优点 2.2 池化思想的典型应用 3. 常见的开源数据库连接池 3.1 DBCP 3.2 C3P0 3.3 Druid 4. Druid连接池的使用 4.1 Druid的特点 4.2 D…...
深度学习和机器学习的本质区别(白话版)
深度学习与机器学习的本质区别 在人工智能的世界里,机器学习和深度学习是两个常被提及的概念,但它们在本质上有着重要区别。简单来说,机器学习依赖于人为设定的数据模式,而深度学习则更依赖于数据本身自动发现模式。 机器学习&a…...
halcon激光三角测量(十七)calibrate_sheet_of_light_3d_calib_object
目录 一、calibrate_sheet_of_light_3d_calib_object例程代码二、标定过程三、校准后的3D模型和原3D模型对齐过程四、获得模型标定结果,并生成3D模型五、set_paint 和 dev_set_paint函数 一、calibrate_sheet_of_light_3d_calib_object例程代码 1、第一部分&#x…...
【笔记】LLM|Ubuntu22服务器极简本地部署DeepSeek+联网使用方式
2025/02/18说明:2月18日~2月20日是2024年度博客之星投票时间,走过路过可以帮忙点点投票吗?我想要前一百的实体证书,经过我严密的计算只要再拿到60票就稳了。一人可能会有多票,Thanks♪(・ω・)&am…...
win11 labelme 汉化菜单
替换 app.py,再重启 #labelme 汉化菜单# -*- coding: utf-8 -*-import functools import os import os.path as osp import re import webbrowserimport imgviz from qtpy import QtCore from qtpy.QtCore import Qt from qtpy import QtGui from qtpy import QtWidgetsfrom l…...
Linux的基础指令和环境部署,项目部署实战(下)
目录 上一篇:Linxu的基础指令和环境部署,项目部署实战(上)-CSDN博客 1. 搭建Java部署环境 1.1 apt apt常用命令 列出所有的软件包 更新软件包数据库 安装软件包 移除软件包 1.2 JDK 1.2.1. 更新 1.2.2. 安装openjdk&am…...
利用Java爬虫精准获取商品SKU详细信息:实战案例指南
在电商领域,SKU(Stock Keeping Unit,库存单位)详细信息是电商运营的核心数据之一。它不仅包含了商品的规格、价格、库存等关键信息,还直接影响到库存管理、价格策略和市场分析等多个方面。本文将详细介绍如何利用Java爬…...
数值积分:通过复合梯形法计算
在物理学和工程学中,很多问题都可以通过数值积分来求解,特别是当我们无法得到解析解时。数值积分是通过计算积分区间内离散点的函数值来近似积分的结果。在这篇博客中,我将讨论如何使用 复合梯形法 来进行数值积分,并以一个简单的…...
【Java计算机毕业设计】基于SSM+VUE保险公司管理系统数据库源代码+LW文档+开题报告+答辩稿+部署教程+代码讲解
源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储:…...
C#之上位机开发---------C#通信库及WPF的简单实践
〇、上位机,分层架构 界面层 要实现的功能: 展示数据 获取数据 发送数据 数据层 要实现的功能: 转换数据 打包数据 存取数据 通信层 要实现的功能: 打开连接 关闭连接 读取数据 写入数据 实体类 作用: 封装数据…...
Pytorch论文实现之GAN-C约束鉴别器训练自己的数据集
简介 简介:这次介绍复现的论文主要是约束判别器的函数空间,作者认为原来的损失函数在优化判别器关于真样本和假样本的相对输出缺乏显式约束,因为在实践中,在优化生成器时,鉴别器对生成样本的输出会增加,但对真实数据保持不变,而优化鉴别器会导致其对真实数据的输出增加…...
vue3.x 的shallowReactive 与 shallowRef 详细解读
在 Vue 3.x 中,shallowReactive 和 shallowRef 是两个用于创建浅层响应式数据的 API。它们与 reactive 和 ref 类似,但在处理嵌套对象时的行为有所不同。以下是它们的详细解读和示例。 1. shallowReactive 作用 shallowReactive 创建一个浅层响应式对…...
MongoDB 常用命令速查表
以下是一份 MongoDB 常用命令速查表,涵盖数据库、集合、文档的增删改查、索引管理、聚合操作等场景: 1. 数据库操作 命令说明show dbs查看所有数据库use <db-name>切换/创建数据库(需插入数据后才会显示)db.dropDatabase()…...
DeepSeek崛起的本质分析:AI变局中的中国机会
DeepSeek崛起的本质分析:AI变局中的中国机会 1. 中国AI发展的大背景 近年来,全球AI技术竞争日趋白热化,而中国作为全球第二大经济体,在AI领域的投入和政策支持力度不断加大。大模型是AI产业的制高点,而美国对中国的高…...
Autojs: 使用 SQLite
例子 let db new SQLiteUtil("/sdcard/A_My_DB/sqlite.db");db.fastCreateTable("user_table",{name: "",online: false,},["name"] // 设置 name 为唯一, 重复项 不会添加成功 );// 新增数据的 ID let row_id db.insert("use…...
读书笔记 - 修改代码的艺术
读书笔记 - 修改代码的艺术 第 1 章 修改软件第 2 章 带着反馈工作系统变更方式反馈方式遗留代码修改方法 第 3 章 感知和分离伪协作程序模拟对象 第 4 章 接缝模型接缝 第 5 章 工具自动化重构工具单元测试用具 第 6 章 时间紧迫,但必须修改新生方法(Sp…...
element-plus树形数据与懒加载的实现
环境 vue版本: 2.6.14 需求 树形表格,默认返回当前登录人拥有权限的一个层级的数据,通过点击load懒加载获取下一层的数据,要求有新增、编辑、删除操作。 树类型的懒加载: 当row中包含children字段时,被…...
仿 Sora 之形,借物理模拟之技绘视频之彩
来自麻省理工学院、斯坦福大学、哥伦比亚大学以及康奈尔大学的研究人员携手开源了一款创新的3D交互视频模型——PhysDreamer(以下简称“PD”)。PD与OpenAI旗下的Sora相似,能够借助物理模拟技术来生成视频,这意味着PD所生成的视频蕴…...
【算法】快排
题目 快排 思路 如果输入为0或1直接返回;否则取一个基准值,可以取中间位置,如果输入是有序的可以避免时间过长,然后移动指针,先让i指针右移,如果小于基准值就继续右移,j指针左移同理。如果指…...
RedisTemplate存储含有特殊字符解决
ERROR信息: 案发时间: 2025-02-18 01:01 案发现场: UserServiceImpl.java 嫌疑人: stringRedisTemplate.opsForValue().set(SystemConstants.LOGIN_CODE_PREFIX phone, code, Duration.ofMinutes(3L)); // 3分钟过期作案动机: stringRedisTemplate继承了Redistemplate 使用的…...
Django REST Framework (DRF) 中用于构建 API 视图类解析
Django REST Framework (DRF) 提供了丰富的视图类,用于构建 API 视图。这些视图类可以分为以下几类: 1. 基础视图类 这些是 DRF 中最基础的视图类,通常用于实现自定义逻辑。 常用类 APIView: 最基本的视图类,所有其…...
Zotero PDF Translate插件配置百度翻译api
Zotero PDF Translate插件可以使用几种翻译api,虽然谷歌最好用,但是由于众所周知的原因,不稳定。而cnki有字数限制,有道有时也不行。其他的翻译需要申请密钥。本文以百度为例,进行申请 官方有申请教程: Zot…...
Redis离线安装
Linux系统Centos安装部署Redis缓存插件 参考:Redis中文网: https://www.redis.net.cn/ 参考:RPM软件包下载地址: https://rpmfind.net/linux/RPM/index.html http://rpm.pbone.net/ https://mirrors.aliyun.com/centos/7/os…...
五、k8s:容忍 存储卷
容忍: 即使节点上有污点,依然可以部署pod。 tolerations: operator: "Exists" 不指定key,表示容忍所有的污点 cordon和drain cordon: 直接标记节点为不可用,pod不能部署到该节点。新建的pod不会再部署到该节点&#…...
零售顶流三只松鼠如何重塑品牌营销新生态,寻找新的增长点?
在零售行业的变革浪潮中,三只松鼠作为休闲零食领域的代表品牌,面临着前所未有的机遇与挑战。在竞争激烈的零售市场中,三只松鼠以其突出的表现成为行业焦点。2024 年前三季度,营收 71.69 亿元,同比增长 56.46%ÿ…...
USC 安防平台之移动侦测
随着第四次科技革命的开启,AI技术获取了突飞猛进的发展,视频监控对应的视频分析技术也获取了巨大的发展。 还记得15年前采用人工提取特征做前景背景分离和提取,大部分依赖CPU,最多使用一下TI的DM642 DSP加速,开发难度…...
MySQL智障离谱问题,删了库确还存在、也不能再创建同名库
1、问题 今天跟后端朋友接毕设单子的时候,后端穿过来的【weather.sql】这个文件没弄好,导致这个【weather】数据库的数据是错的,因此我用datagrip的GUI界面直接右键删除,结果就是tmd删不掉,ok,我只能在那新…...
IIS asp.net权限不足
检查应用程序池的权限 IIS 应用程序池默认使用一个低权限账户(如 IIS_IUSRS),这可能导致无法删除某些文件或目录。可以通过以下方式提升权限: 方法 1:修改应用程序池的标识 打开 IIS 管理器。 在左侧导航树中&#x…...
pptx文档提取信息
目录 一、前言二、python-pptx提取核心代码三、LibreOffice 转换pdf再提取的核心代码一、前言 pptx文档提取解析常用的库。 如果只需要解析 .pptx 的文本、表格、图片,推荐使用 python-pptx(开源,轻量级)。 如果需要高性能、支持 .ppt、动画、格式转换,推荐 Aspose.Slid…...
深入理解Python字典(Dictionary):从基础操作到高级应用
深入理解Python字典(Dictionary):从基础操作到高级应用 flyfish 一、Python 字典(Dictionary)基本概念 1. 定义 Python 字典是一种可变、无序的数据结构,用于存储键值对(key - value pairs&…...
