JDBC 数据库连接池

news2024/11/25 12:37:46

目录

  • 一、什么是数据库连接池
  • 二、为什么需要数据库连接池?
  • 三、JDBC 数据库连接池的实现
  • 四、C3P0的使用
    • 1、加入c3p0 jar包
    • 2、配置xml文件
    • 3、c3p0-config.xml模板
    • 4、C3P0的使用
  • 五、Druid的使用
    • 1、加入Druid jar包
    • 2、定义配置文件:
    • 3、Druid连接池的使用
  • 六、HikariCP的使用
    • 1、加入HikariCP jar包
    • 2、配置文件
    • 3、HikariCP的使用
  • 七、DBCP的使用
    • 1、加入DBCP jar包
    • 2、配置文件
    • 3、DBCP使用

在这里插入图片描述

一、什么是数据库连接池

概念:存放数据库连接的一个容器(集合)Connection
当系统运行起来之后,这个连接池就被创建,在这个连接池当中,会申请一些对象,当有用户来访问数据库的时候,就从这个连接池当中获取连接对象,用户访问结束之后,连接池对象会归还给容器

二、为什么需要数据库连接池?

数据库连接的创建和销毁是一项资源密集型操作,它涉及到网络通信和权限验证等操作,因此开销较大。在高并发的应用中,频繁地创建和销毁连接会导致系统性能下降,甚至引发连接泄漏等问题。数据库连接池的引入可以解决这些问题,具体好处包括:

  • 资源重用:连接池可以重复使用现有的连接,避免了频繁创建和销毁连接的开销。
  • 减少连接等待时间:连接池通常会预先创建一些连接,当应用程序需要连接时,可以立即获取可用连接,降低了连接等待时间。
  • 连接管理:连接池负责连接的管理,包括连接的创建、销毁、超时检测等,减轻了开发人员的工作负担。
  • 性能提升:通过连接池可以控制并发连接数,避免了数据库服务器被大量连接请求压垮。

三、JDBC 数据库连接池的实现

JDBC 数据库连接池通常由以下几个关键组件构成:

  • 连接池管理器:用于管理连接的创建、分配、释放等操作。
  • 连接池:实际存放数据库连接的容器。
  • 连接对象:表示一个数据库连接的对象,包括连接信息、状态等。
  • 连接池配置:包括最大连接数、最小连接数、连接超时时间等参数。

四、C3P0的使用

1、加入c3p0 jar包

在这里插入图片描述

2、配置xml文件

在这里插入图片描述

3、c3p0-config.xml模板

<c3p0-config>
    <!--使用默认的配置读取数据库连接池对象 -->
    <default-config>
        <!--  连接参数 -->
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/ScienceDB?serverTimezone=UTC</property>
        <property name="user">root</property>
        <property name="password"></property>

        <!-- 连接池参数 -->
        <!--初始化申请的连接数量-->
        <property name="initialPoolSize">5</property>
        <!--最大的连接数量-->
        <property name="maxPoolSize">20</property>
        <!--超时时间-->
        <property name="checkoutTimeout">3000</property>
    </default-config>
</c3p0-config>

4、C3P0的使用

public void sumSelect(String a) throws SQLException {
        ComboPooledDataSource dataSource=new ComboPooledDataSource();
        Connection conn=dataSource.getConnection();
        ResultSet rs=conn.prepareStatement("select s.*,c.c_name,sc.s_score from Student s,Score sc ,Course c\n" +
                "where s.s_id=sc.s_id and sc.c_id=c.c_id and s.s_id='"+a+"'").executeQuery();
        while (rs.next()){
            String s_id=rs.getString(1);
            String s_name=rs.getString(2);
            String s_birth=rs.getString(3);
            String s_sex=rs.getString(4);
            String c_name=rs.getString(5);
            int zf=rs.getInt(6);
            System.out.println(s_id+"\t"+s_name+"\t"+s_birth+"\t"+s_sex +"\t"+c_name+"\t"+zf);

        }
        conn.close();//释放连接----》将当前的工作连接,释放为空闲连接
    }

五、Druid的使用

1、加入Druid jar包

在这里插入图片描述

2、定义配置文件:

是properties形式的
在这里插入图片描述

driverClassName =com.mysql.cj.jdbc.Driver;
url=jdbc:mysql://localhost:3306/20231202DB?useServerPrepStmts=true;
username=root;
password=root;
#初始化连接数
initialSize=10;
#最大等待时间
maxwait=5000
#最大连接数
maxActive=50;
minIdle=5;

3、Druid连接池的使用

 public void druidTest() throws Exception {
        Properties properties=new Properties();
        HashMap map=new HashMap();
        map.put("driverClassName","com.mysql.cj.jdbc.Driver");
        map.put("url","jdbc:mysql://localhost:3306/20231202DB?serverTimezone=UTC");
        map.put("username","root");
        map.put("password","");
        map.put("initialSize","10");
        map.put("maxActive","30");
        map.put("maxWait","1000");
        properties.load(new FileInputStream("src\\jdbc.properties"));
        DataSource dataSource= DruidDataSourceFactory.createDataSource(map);
        Connection conn=dataSource.getConnection();
        ResultSet rs=conn.prepareStatement("select count(*) s from film_information").executeQuery();
        while (rs.next()){
            int tps=rs.getInt("s");
            System.out.println(tps);
        }
        conn.close();//释放连接----》将当前的工作连接,释放为空闲连接
    }

六、HikariCP的使用

1、加入HikariCP jar包

在这里插入图片描述

2、配置文件

在代码中配置 HikariCP 连接池。以下是一个示例配置:

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class DatabaseConnectionManager {
    private static HikariConfig config = new HikariConfig();
    private static HikariDataSource dataSource;

    static {
        config.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");
        config.setUsername("root");
        config.setPassword("password");
        config.setMaximumPoolSize(10); // 最大连接数
        config.setMinimumIdle(5); // 最小空闲连接数
        config.setConnectionTimeout(30000); // 连接超时时间,单位毫秒
        config.setIdleTimeout(600000); // 空闲连接超时时间,单位毫秒
        config.setMaxLifetime(1800000); // 最大生命周期时间,单位毫秒

        dataSource = new HikariDataSource(config);
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

3、HikariCP的使用

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Main {
    public static void main(String[] args) {
        try (Connection connection = DatabaseConnectionManager.getConnection()) {
            String sql = "SELECT * FROM users";
            try (PreparedStatement preparedStatement = connection.prepareStatement(sql);
                 ResultSet resultSet = preparedStatement.executeQuery()) {
                while (resultSet.next()) {
                    int userId = resultSet.getInt("id");
                    String username = resultSet.getString("username");
                    String email = resultSet.getString("email");
                    System.out.println("User ID: " + userId + ", Username: " + username + ", Email: " + email);
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

七、DBCP的使用

1、加入DBCP jar包

在这里插入图片描述

2、配置文件

#数据库连接地址 
#url=jdbc:mysql://localhost:3306/数据库名(?配置参数)
url=jdbc:mysql://localhost:3306/express_manage?useUnicode=true&characterEncoding=utf-8
#数据库驱动类的全名
driverClassName=com.mysql.jdbc.Driver
#数据库帐号
username=root
#数据库密码 等于号后面直接填密码,不需要引号,密码为空时可以不填或 ""
password=
#初始化连接池时,创建的连接数量
initialSize=5
#连接池的最大连接容量,连接使用完后不释放会很容易达到最大值,导致之后的连接被卡住
maxActive=20
#空闲时允许保留的最大连接数量
maxIdle=5
#空闲时允许保留的最小连接数量
minIdle=5
#排队等候的超时时间(毫秒)
maxWait=3000

3、DBCP使用

新增

public class DBCPTest {
    //全局变量
    private static DataSource ds = null;
    static {
        Properties ppt = new Properties();
        InputStream is = DBCPTest.class.getClassLoader().getResourceAsStream("dbcp.properties");
        try {
            ppt.load(is);
            ds = BasicDataSourceFactory.createDataSource(ppt);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public static void main(String[] args) throws Exception {
        //文件的输入流
        InputStream is = DBCPTest.class.getClassLoader().getResourceAsStream("dbcp.properties");
        //将配置文件, 转换为Properties对象
        Properties ppt = new Properties();
        ppt.load(is);
        //通过连接池的工厂类(DruidDataSourceFactory)的创建连接池的方法(createDataSource())
        DataSource ds = BasicDataSourceFactory.createDataSource(ppt);

       //从连接池中 获取连接对象
       Connection conn = ds.getConnection();
        //通过连接对象,创建SQL对象
        Statement state = conn.createStatement();
        //通过SQL对象,执行SQL语句,以
        state.execute("insert into user value ('huang','123')");
        //释放资源
        conn.close();
        state.close();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1321283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【最新】2023年30米分辨率土地利用遥感监测数据

改革开放以来&#xff0c;中国经济的快速发展对土地利用模式产生了深刻的影响。同时&#xff0c;中国又具有复杂的自然环境背景和广阔的陆地面积&#xff0c;其土地利用变化不仅对国家发展&#xff0c;也对全球环境变化产生了深刻的影响。为了恢复和重建我国土地利用变化的现代…

硬件基础-二极管

3.二极管 正偏时是多数载流子载流导电&#xff0c;反偏时是少数载流子载流导电。所以&#xff0c;正偏电流大&#xff0c;反偏电流小&#xff0c;PN 结显示出单向电性。多数载流子正向通过 PN 结时就需要克服内电场的作用&#xff0c;需要约 0.7 伏的外加电压&#xff0c;这是…

windows10录屏快捷键,让你效率翻倍!

“大家知道&#xff0c;windows 10系统有录屏快捷键吗&#xff1f;每次都要通过搜索才能打开&#xff0c;感觉花费的时间太多了&#xff0c;要是可以快速打开就方便多了&#xff0c;所以有人知道windows10系统的录屏快捷键是什么吗&#xff1f;” 在windows 10系统中&#xff…

OpenCV-8RGB和BGR颜色空间

一. RGB和BGR 最常见的色彩空间就是RGB&#xff0c;人眼也是基于RGB的色彩空间去分辨颜色。 OpenCV默认使用的是BGR. BGR和RGB色彩空间的区别在于图片在色彩通道上的排列顺序不同。 二.HSV, HSL和YUV 1.HSV(HSB) OpenCV用的最多的色彩空间是HSV. Hue&#xff1a;色相&…

【玩转 TableAgent 数据智能分析】股票交易数据分析+预测

文章目录 一、什么是TableAgent二、TableAgent 的特点三、实践前言四、实践准备4.1 打开官网4.2 注册账号4.3 界面介绍4.4 数据准备 五、确认分析需求六、TableAgent体验七、分析结果解读八、总结&展望 一、什么是TableAgent TableAgent是一款面向企业用户的智能数据分析工…

Pytorch深度强化学习案例:基于Q-Learning的机器人走迷宫

目录 0 专栏介绍1 Q-Learning算法原理2 强化学习基本框架3 机器人走迷宫算法3.1 迷宫环境3.2 状态、动作和奖励3.3 Q-Learning算法实现3.4 完成训练 4 算法分析4.1 Q-Table4.2 奖励曲线 0 专栏介绍 本专栏重点介绍强化学习技术的数学原理&#xff0c;并且采用Pytorch框架对常见…

AntDB-T提升查询性能的关键之查询优化解析

查询优化器是提升查询效率非常重要的手段&#xff0c;本文将主要介绍AntDB-T数据库查询优化的相关设计。AntDB-T数据库是一款企业级通用分布式关系型数据库&#xff0c;而查询是AntDB-T数据库管理系统中最关键、最吸引人的功能之一。每个生产数据库系统每天都需要处理大量的查询…

python【matplotlib】鼠标拖动滚动缩放坐标范围和拖动图例共存

背景 根据前面的博文&#xff1a; python【matplotlib】画图鼠标缩放拖动动态改变坐标轴范围 和Python【Matplotlib】图例可拖动改变位置 两个博文&#xff0c;博主考虑了一下&#xff0c;如何将两者的功能结合起来&#xff0c;让二者共存。 只需根据Python【Matplotlib】鼠标…

【音视频 | AAC】AAC音频编码详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【GD32307E-START】06 ST7735 SPI-LCD显示模块移植

软硬件平台 GD32F307E-START Board开发板GCC Makefile1.8寸TFTLCD 分辨率128*160 驱动IC ST7735S 接口定义 序号引脚标号说明1GND接地2VCC5V/3.3V电源输入3SCKSPI总线时钟信号4SDASPI总线写数据信号5RESET液晶屏复位信号&#xff0c;低电平复位6DC液晶屏寄存器/数据选择信…

LinuxCNC系统安装

首先我们需要准备一个U盘来安装系统&#xff0c;然后进入Debian官网。操作系统处&#xff0c;点击“下载Debian”。 如果需要下载其他比较全版本&#xff0c;可以点击“其他下载链接”&#xff0c;选择DVD的安装&#xff0c;因为是国外的网站&#xff0c;最好不要选择网络安装。…

【每日OJ—有效的括号(栈)】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 1、有效的括号题目&#xff1a; 1.1方法讲解&#xff1a; 1.2代码实现&#xff1a; 总结 前言 世上有两种耀眼的光芒&#xff0c;一种是正在升起的太阳&#…

机器学习:增强式学习Reinforcement learning

收集有标签数据比较困难的时候同时也不知道什么答案是比较好的时候可以考虑使用强化学习通过互动&#xff0c;机器可以自己知道什么结果是好的&#xff0c;什么结果是坏的 Outline 什么是RL Action就是一个functionEnvironment就是告诉这个Action是好的还是坏的 例子 Space i…

2023年度IT168技术卓越奖名单:亚信安慧AntDB数据库

信创卓越贡献奖&#xff1a;湖南亚信安慧科技有限公司 一句话点评&#xff1a;亚信安慧的核心交易数据库AntDB具有应用时间久&#xff08;15年&#xff09;、运行节点多&#xff08;2000&#xff09;、数据规模大&#xff08;PB级&#xff09;、产品稳定可靠&#xff08;500项目…

L1-050:倒数第N个字符串

题目描述 给定一个完全由小写英文字母组成的字符串等差递增序列&#xff0c;该序列中的每个字符串的长度固定为 L&#xff0c;从 L 个 a 开始&#xff0c;以 1 为步长递增。例如当 L 为 3 时&#xff0c;序列为 { aaa, aab, aac, ..., aaz, aba, abb, ..., abz, ..., zzz }。这…

Spring Cloud + Vue前后端分离-第6章 通用代码生成器开发

Spring Cloud Vue前后端分离-第6章 通用代码生成器开发 6-1 代码生成器原理介绍 1.增加generator模块&#xff0c;用于代码生成 2.集成freemarker 通用代码生成器开发 FreeMarker 是一款模版引擎&#xff0c;通过模板生成文件&#xff0c;包括html页面&#xff0c;excel …

【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 分发饼干 class Solutio…

万兆网络之线路测速

网络测速有很多种方式&#xff0c;建议使用开源的iperf搭建测试 官方&#xff1a;iperf3&#xff08;技术网站一般不被和谐&#xff0c;有部分可能被污染&#xff09; Windows下载后解压即可运行 小技巧&#xff1a;如果你用的笔记本只有一个C盘&#xff0c;最好将免安装的软…

Zotero插件安装、问题、bug大全(随时更新)

Zotero插件安装、问题、bug大全&#xff08;随时更新&#xff09; 1. 插件安装2. 茉莉花&#xff08;Jasminum&#xff09;插件使用tips及可能遇到的问题2.1 更新2.2 未找到PDFtk Server的可执行文件 问题解决方法 3. Zotero Sci-hub插件相关问题3.1 Zotero Sci-hub插件有时抓取…

iOS问题记录 - iOS 17通过NSUserDefaults设置UserAgent无效

文章目录 前言开发环境问题描述问题分析解决方案最后 前言 最近维护一个老项目时遇到的问题。说起这老项目我就有点头疼&#xff0c;一个快十年前的项目&#xff0c;这么说你可能不觉得有什么&#xff0c;但是你想想Swift也才发布不到十年&#xff08;2014年6月发布&#xff0…