java:数据库连接池
概念
举个例子来说吧,假设我们开了一家餐馆,客人来了,我们就请一个服务员,使用完后再把他开除了,下个客人再来了,我们再请一个,使用完再开除。
这是不是我们现在使用 JDBC 连接数据库的场景:每一次都要获取链接,使用完再释放掉。
但是这样显然是不合适的,因为每次申请连接都是向服务器底层申请内存等等处理,这是很麻烦很耗时的,那么还是回到餐馆的例子,正常情况下我们是会一次性招好几个服务员来服务的。类比到线程池就是:
有一个池子存放数据库连接的容器(集合)。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给池子。

好处:
1. 节约资源
2. 用户访问高效
实现
连接池是 java 定义好的一些规则,在 javax.sql 下有一个接口 DataSource(数据源/连接池),这个接口由驱动程序的供应商实现。
DataSource 接口提供两个方法:
- 获取连接:getConnection()
- 归还连接:Connection.close()。如果连接对象Connection是从连接池中获取的,那么调用Connection.close()方法,则不会再关闭连接了,而是归还连接。
以上方法一般我们不去实现它,有数据库厂商来实现
- C3P0:数据库连接池技术
- Druid:数据库连接池实现技术,由阿里巴巴提供的
C3P0
- 步骤:
-
导入jar包 (两个) c3p0-0.9.5.2.jar mchange-commons-java-0.2.12.jar ,
- 不要忘记导入数据库驱动jar包
-
定义配置文件:
- 名称: c3p0.properties 或者 c3p0-config.xml
- 路径:直接将文件放在src目录下即可。
-
创建核心对象 数据库连接池对象 ComboPooledDataSource
-
获取连接: getConnection
-
- 代码:
//1.创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
//2. 获取连接对象
Connection conn = ds.getConnection();
举例:
c3p0-config.xml
<c3p0-config><!-- 使用默认的配置读取连接池对象 --><default-config><!-- 连接参数 --><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/db4</property><property name="user">root</property><property name="password">root</property><!-- 连接池参数 --><!--初始化申请的连接数量--><property name="initialPoolSize">5</property><!--最大的连接数量--><property name="maxPoolSize">10</property><!--超时时间--><property name="checkoutTimeout">3000</property></default-config><named-config name="otherc3p0"> <!-- 连接参数 --><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/db3</property><property name="user">root</property><property name="password">root</property><!-- 连接池参数 --><property name="initialPoolSize">5</property><property name="maxPoolSize">8</property><property name="checkoutTimeout">1000</property></named-config>
</c3p0-config>
package cn.xxx.datasource.c3p0;import com.mchange.v2.c3p0.ComboPooledDataSource;import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;/*** c3p0演示*/
public class C3P0Demo2 {public static void main(String[] args) throws SQLException {/* //1. 获取DataSource,使用默认配置DataSource ds = new ComboPooledDataSource();//2.获取连接for (int i = 1; i <= 11 ; i++) {Connection conn = ds.getConnection();System.out.println(i+":"+conn);if(i == 5){conn.close();//归还连接到连接池中}}*///testNamedConfig();}public static void testNamedConfig() throws SQLException {// 1.1 获取DataSource,使用指定名称配置DataSource ds = new ComboPooledDataSource("otherc3p0");//2.获取连接for (int i = 1; i <= 10 ; i++) {Connection conn = ds.getConnection();System.out.println(i+":"+conn);}}}
Druid
步骤:
- 导入jar包 druid-1.0.9.jar
- 定义配置文件:
- 是properties形式的
- 可以叫任意名称,可以放在任意目录下
- 加载配置文件。Properties
- 获取数据库连接池对象:通过工厂来来获取 DruidDataSourceFactory
- 获取连接:getConnection
druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///db3
username=root
password=root
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
package cn.xxx.datasource.druid;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;/*** Druid演示*/
public class DruidDemo {public static void main(String[] args) throws Exception {//1.导入jar包//2.定义配置文件//3.加载配置文件Properties pro = new Properties();InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");pro.load(is);//4.获取连接池对象DataSource ds = DruidDataSourceFactory.createDataSource(pro);//5.获取连接Connection conn = ds.getConnection();System.out.println(conn);}
}
实例
使用 JDBC utils 来封装连接池 Druid 进行连接
定义工具类
- 定义一个类 JDBCUtils
- 提供静态代码块加载配置文件,初始化连接池对象
- 提供方法
- 获取连接方法:通过数据库连接池获取连接
- 释放资源
- 获取连接池的方法
package cn.xxx.utils;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;/*** Druid连接池的工具类*/
public class JDBCUtils {//1.定义成员变量 DataSourceprivate static DataSource ds ;static{try {//1.加载配置文件Properties pro = new Properties();pro.load(JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"));//2.获取DataSourceds = DruidDataSourceFactory.createDataSource(pro);} catch (IOException e) {e.printStackTrace();} catch (Exception e) {e.printStackTrace();}}/*** 获取连接*/public static Connection getConnection() throws SQLException {return ds.getConnection();}/*** 释放资源*/public static void close(Statement stmt,Connection conn){/* if(stmt != null){try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if(conn != null){try {conn.close();//归还连接} catch (SQLException e) {e.printStackTrace();}}*/close(null,stmt,conn);}public static void close(ResultSet rs , Statement stmt, Connection conn){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();}}}/*** 获取连接池方法*/public static DataSource getDataSource(){return ds;}}
package cn.xxx.datasource.druid;import cn.itcast.utils.JDBCUtils;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;/*** 使用新的工具类*/
public class DruidDemo2 {public static void main(String[] args) {/** 完成添加操作:给account表添加一条记录*/Connection conn = null;PreparedStatement pstmt = null;try {//1.获取连接conn = JDBCUtils.getConnection();//2.定义sqlString sql = "insert into account values(null,?,?)";//3.获取pstmt对象pstmt = conn.prepareStatement(sql);//4.给?赋值pstmt.setString(1,"王五");pstmt.setDouble(2,3000);//5.执行sqlint count = pstmt.executeUpdate();System.out.println(count);} catch (SQLException e) {e.printStackTrace();}finally {//6. 释放资源JDBCUtils.close(pstmt,conn);}}}相关文章:
java:数据库连接池
概念 举个例子来说吧,假设我们开了一家餐馆,客人来了,我们就请一个服务员,使用完后再把他开除了,下个客人再来了,我们再请一个,使用完再开除。 这是不是我们现在使用 JDBC 连接数据库的场景&a…...
可视化绘图技巧100篇基础篇(三)-条形图(一)
目录 前言 适用场景 图例 条形图分类 多系列条形图 单系列条形图...
如何使用Redis实现附近商家查询
导读 在日常生活中,我们经常能看见查询附近商家的功能。 常见的场景有,比如你在点外卖的时候,就可能需要按照距离查询附近几百米或者几公里的商家。 本文将介绍如何使用Redis实现按照距离查询附近商户的功能,并以SpringBoot项目…...
于vue3+vite+element pro + pnpm开源项目
河码桌面是一个基于vue3viteelement pro pnpm 创建的monorepo项目,项目采用的是类操作系统的web界面,操作起来简单又方便,符合用户习惯,又没有操作系统的复杂! 有两个两个分支,一个是web版本,…...
18-组件化开发 根组件
组件化开发 & 根组件: 1. 组件化:一个页面可以拆分成一个个组件,每个组件有着自己独立的结构、样式、行为. 好处:便于维护,利于复用->提升开发效率 组件分类: 普通组件 , 根组件 2. 根组件:整个应用最上层的组件,包裹所有普通小组件…...
springboot集成ES
1.引入pom依赖2.application 配置3.JavaBean配置以及ES相关注解 3.1 Student实体类3.2 Teacher实体类3.3 Headmaster 实体类4. 启动类配置5.elasticsearchRestTemplate 新增 5.1 createIndex && putMapping 创建索引及映射 5.1.1 Controller层5.1.2 service层5.1.3 ser…...
Maven 生成编译时间和版本Java类
本文使用Maven插件来自动生成一个 Version.java 类,可以在Java代码中使用里面对应的常量,获取当前版本号和构建时间。 Maven编译后自动生成的 Version.java 文件内容如下所示: package com.shanhy.demo;public final class Version {public…...
关于uniapp微信小程序scroll-view组件使用show-scrollbar隐藏不了滚动条
这里关于使用 scroll-view组件 时候有滚动条 想要隐藏滚动条但是使用show-scrollbar没有效果 这时候又使用类名隐藏滚动条 使用id隐藏滚动条都不行 解决方法:在使用 scroll-view组件 的页面或者app 页面加上以下代码就可以了 ::-webkit-scrollbar {displa…...
CSS:filter滤镜 详解(用法 + 代码 + 例子 + 效果)
文章目录 filter 滤镜blur() 模糊度例子 渐变光晕 brightness() 元素亮度contrast() 对比度grayscale() 元素灰度hue-rorate() 色相opacity() 透明度invert() 反转颜色saturate() 饱和度 backdrop-filter 蒙版,滤镜例子 卷轴展开 filter 滤镜 动图为效果添加前后对…...
【Unity每日一记】Physics.Raycast 相关_Unity中的“X光射线”
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:uni…...
软件报错msvcr90.dll丢失的解决方法,亲测可以修复
我曾经遇到过一个令人头疼的问题:msvcr90.dll丢失。这个问题导致了我的程序无法正常运行,让我感到非常苦恼。然而,在经过一番努力后,我终于成功地修复了这个问题,这让我感到非常欣慰和满足。 msvcr90.dll丢失的原因可能…...
第一百一十八回 如何获取蓝牙连接状态
文章目录 知识回顾实现方法示例代码我们在上一章回中介绍了如何连接蓝牙设备相关的内容,本章回中将介绍如何获取蓝牙连接状态.闲话休提,让我们一起Talk Flutter吧。 知识回顾 我们在上一章回中介绍如何连接蓝牙设备,但是如何知道蓝牙设备是否连接成功呢?这就需要我们去获取…...
C++11并发与多线程笔记(12) windows临界区、其他各种mutex互斥量
C11并发与多线程笔记(12) windows临界区、其他各种mutex互斥量 1、windows临界区2、自动析构技术3、递归独占互斥量 std::recursive_mutex4、带超时的互斥量 std::timed_mutex 和 std::recursive_timed_mutex4.1 std::timed_mutex:是带超时的…...
[MAUI]在.NET MAUI中实现可拖拽排序列表
文章目录 创建可拖放控件创建绑定服务类拖拽(Drag)拖拽悬停,经过(DragOver)释放(Drop) 创建页面元素最终效果项目地址 .NET MAUI 中提供了拖放(drag-drop)手势识别器,允许用户通过拖…...
Linux 内核内存管理 pfn_to_online_page宏
文章目录 一、Memory Hotplug1.1 简介1.2 热插拔事件通知机制 二、pfn_to_online_page2.1 pfn_to_online_page2.2 pfn_to_section_nr2.3 online_section_nr 参考资料 一、Memory Hotplug 1.1 简介 Linux 内存热插拔(Memory Hotplug)是指在运行时动态增…...
『C语言初阶』第八章 -结构体
前言 今天小羊又来给铁汁们分享关于C语言的结构体,在C语言中,结构体类型属于一种构造类型(其他的构造类型还有:数组类型,联合类型),今天我们主要简单了解一下结构体。 一、结构体是什么&#x…...
chatgpt汇编,两个关于chatgpt的问题
1.用C写一个高级的可自主学习的AI语言模型 编写一个高级的可自主学习的AI语言模型是一个复杂且庞大的工程,需要深入的专业知识和大量的时间精力。下面是一个简化的示例,演示如何使用C实现一个基本的可自主学习的AI语言模型。 首先,你需要定…...
ps丢失d3dcompiler_47.dll怎么办,启动无反应,分享三个解决方法
d3dcompiler_47.dll64位是windows系统中重要的dll文件,缺少了它可能会引起部分软件或者游戏不能运行。 如果系统出现“找不到d3dcompiler_47.dll”或“d3dcompiler_47.dll丢失”等错误信息,那么我们就该着手修复它。 先带了解一下d3dcompiler_47.dll是什…...
第三章nginx详解
nginx:高性能,轻量级的web服务软件。 特点: 1,稳定性高。(没有apache稳定) 2,系统资源消耗地较低。(处理http请求的并发能力非常高,单台物理服务器可以处理30000-5000…...
【二叉树前沿篇】树
【二叉树前沿篇】树 1 树的概念2. 树的相关概念3. 树的表示4. 树在实际中的运用(表示文件系统的目录树结构) 1 树的概念 树是一种非线性的数据结构,它是由n(n>0)个有限结点组成一个具有层次关系的集合。把它叫做树是…...
别再只跑Demo了!用Mask R-CNN和Balloon数据集实战,手把手教你从训练到可视化调参
从Demo到实战:用Mask R-CNN深入掌握目标分割全流程 当你第一次运行Mask R-CNN的官方示例时,那种"成功运行"的喜悦往往伴随着隐约的不安——代码虽然跑通了,但你真的理解模型是如何训练的吗?Balloon数据集作为经典的入门…...
当Cox回归的比例风险假定被违背时,除了时依协变量还能怎么办?
当Cox回归的比例风险假定被违背时的五维解决方案 在生存分析领域,Cox比例风险模型因其半参数特性和对基准风险函数形式不做假设的优势,成为医学研究、工程可靠性分析等领域的标配工具。但当这个金标准遇到比例风险假定(PH假定)被违背的情况时,…...
用操作系统类比彻底搞懂 AI Agent:进程、系统调用与上下文窗口
用操作系统类比彻底搞懂 AI Agent:进程、系统调用与上下文窗口 引言 很多人第一次接触 AI Agent,会立刻被一堆新词包围:Tool Use、Function Calling、RAG、Memory、Orchestrator、Multi-Agent、Context Compression。 这些词看起来很新&#…...
Taotoken 用量看板如何帮助团队清晰追踪与优化 API 调用成本
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken 用量看板如何帮助团队清晰追踪与优化 API 调用成本 对于依赖大模型 API 进行开发的团队而言,成本控制与资源分…...
Steam创意工坊模组下载终极指南:轻松获取1000+游戏模组的完整解决方案
Steam创意工坊模组下载终极指南:轻松获取1000游戏模组的完整解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 还在为无法下载Steam创意工坊模组而烦恼吗&…...
从零到一:基于STM32CubeMX与USB3300的USB HS虚拟串口实战指南
1. 硬件准备与原理图设计 第一次接触STM32F4和USB3300芯片时,我完全被那些密密麻麻的引脚搞懵了。后来才发现,只要跟着CubeMX生成的配置走,硬件设计其实没那么可怕。我的开发板用的是STM32F407VET6,搭配USB3300作为PHY芯片。这里有…...
Git GitLab介绍
Git 是工具,GitLab 是使用这个工具的“工厂”或“协作平台”。它们是完全不同层面的东西,但紧密相关。下面是详细的对比:1. Git - 版本控制系统(核心工具)本质:一个开源的分布式版本控制软件,由…...
labelCloud架构解析:3D点云标注的模块化解决方案深度指南
labelCloud架构解析:3D点云标注的模块化解决方案深度指南 【免费下载链接】labelCloud A lightweight tool for labeling 3D bounding boxes in point clouds. 项目地址: https://gitcode.com/gh_mirrors/la/labelCloud 在3D计算机视觉和自动驾驶领域&#x…...
CCSv3.3安装配置避坑全记录:从补丁失败到硬件连接,手把手搞定DSP开发环境
CCSv3.3安装配置避坑全记录:从补丁失败到硬件连接,手把手搞定DSP开发环境 第一次接触DSP开发的朋友,十有八九会在CCSv3.3的安装配置环节栽跟头。这个2007年发布的经典版本至今仍被许多高校和实验室沿用,但它的安装过程堪称"雷…...
电商网站滑块验证码破解:OpenCV图像识别+轨迹模拟方案
一、前言当前主流电商、会员登录、抢购下单、接口风控场景中,滑块拼图验证码已是最常见的人机校验方式。传统简单爬虫直接请求接口极易被拦截,而滑块验证码核心防护逻辑分为两点:一是缺口位置图像匹配校验,二是人为滑动轨迹行为风…...
