IO读取properties文件实现JDBC连接池实战

参考文章

Java中的池化思想
面试官:为什么数据库连接很消耗资源,资源都消耗在哪里?

池化思想是什么?连接池是什么?

在Java中,池化思想是一种通过创建和管理可重复使用的对象池来提高性能和资源利用率的编程思想。它的核心概念是在需要时从池中获取对象,而不是每次都创建新的对象,使用完毕后将对象返回到池中,以供其他代码复用。

连接池主要指的是数据库连接池,它可以预先申请一定数量数据库连接,需要的时候从连接池中直接取,用完了放回去,供给其他线程连接数据库使用

为什么要使用连接池?(作用)

以mysql数据库为例,不使用jdbc创建mysql连接的过程和代码如下:

  1. mysql驱动类加载
  2. 创建连接对象connection
  3. 创建执行对象statement
  4. 编写sql,执行sql,获取执行结果集对象resultSet,业务处理结果集
  5. 关闭执行结果集对象resultSet,关闭执行对象statement,关闭连接对象connection(关闭顺序不能错!!!
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCTest {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// 1. mysql驱动加载
		Class.forName("com.mysql.cj.jdbc.Driver");

		// 2. 创建连接
		Connection connection = DriverManager.getConnection(
				"jdbc:mysql://127.0.0.1:3306/qcby?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false",
				"root", "980708");
		// 3. 创建执行对象
		Statement statement = connection.createStatement();
		// 4. 编写sql,执行sql,获取执行结果集,遍历结果集
		ResultSet rs = statement.executeQuery("select * from commodity");
		while (rs.next()) {
			String id = rs.getString("id");
			String name = rs.getString("name");
			String countNum = rs.getString("countNum");
			String price = rs.getString("price");
			String userId = rs.getString("user_id");
			String img = rs.getString("img");
			System.out.println("id=" + id + ",name=" + name + ",countNum=" + countNum + ",price=" + price + ",userId="
					+ userId + ",img=" + img);
		}
		// 5. 关闭资源
		rs.close();
		statement.close();
		connection.close();

	}
}

每执行一次sql语句,都要走一遍这样的流程,除去第四步,剩下的步骤任何sql执行过程都相同!

mysql连接的创建和销毁是非常耗时的,因为mysql连接大部分时候都是TCP/IP的网络请求,三次握手四次挥手一步都不能少!TCP/IP请求的关闭虽然只需要java服务器发送一次握手,但是也需要经过mysql服务器的四次挥手才能关闭成功!也就是说每完成一次连接的建立,数据在客户端和服务器之间需要至少往返7次;每完成一次连接的关闭,数据在客户端和服务器之间需要至少往返5次!

加起来就是12次往返

这是从大佬博客当中截取的mysql数据库连接耗时计算:
在这里插入图片描述

PS:这里为什么说是大部分,因为java服务和mysql服务有可能运行在同一台主机上,这样就是进程间通信;但是大部分时候,尤其是实际项目,Java服务和mysql服务在高并发的场景下的内存占用都很高,不可能部署在同一台主机,此时就需要用到TCP/IP进行远程调用建立连接

所以我们需要使用连接池。

池化思想的好处

1. 提高性能

池化可以避免频繁地创建和销毁对象、连接或线程,从而减少了系统的开销。通过重复使用已存在的资源,可以节省创建和初始化的时间,提高整体的执行效率和响应速度。

2. 提高资源利用率

池化可以更好地管理和控制资源的使用。通过限制可用的资源数量,可以避免资源的过度消耗和浪费,从而提高系统的资源利用率。

3. 提高系统可伸缩性

通过使用池化,系统可以更好地处理并发请求。由于资源已经预先创建,可以快速分配给请求,并在处理完毕后返回池中,从而减少了资源的竞争和等待时间,提高了系统的并发能力和可伸缩性。

4. 代码简化

池化使得资源的获取和释放变得简单,代码更加清晰。不需要在每个使用时都创建和销毁资源的代码逻辑,而是通过获取和释放资源来实现复用,减少了重复代码的编写。

BufferedInputStream读取.properties文件+JDBC连接池的使用实战

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();
            }
        }
    }

}

durid.properties文件

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///jdbcdemo
username=root
password=980708
initialSize=5 # 初始化连接数
maxActive=10 # 最大活跃连接数
maxWait=3000 # 最长等待时间
maxIdle=6 # 最大等待连接中的数量,设 0 为没有限制
minIdle=3 # 最小等待连接中的数量

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【图解IO与Netty系列】Netty编解码器、TCP粘包拆包问题处理、Netty心跳检测机制

Netty编解码器、TCP粘包拆包问题处理、Netty心跳检测机制 Netty编解码器编码器解码器编解码器Netty提供的现成编解码器 TCP粘包拆包问题处理Netty心跳检测机制 Netty编解码器 网络传输是以字节流的形式传输的,而我们的应用程序一般不会直接对字节流进行处理&#x…

建筑驱鸟设备 | 建筑专用超声波驱鸟器

从半夜的鸣叫到频繁的鸟粪污染,鸟类活动有时会成为城市居民不得不面对的小小困扰。通过合理的驱鸟方法,我们可以有效地减少鸟类对建筑物的侵扰,保护建筑物的完好和安全,同时维护城市居民的生活质量。 建筑专用超声波驱鸟器&#x…

理解 JTBD 框架和EJ 理念:深挖以用户为中心的设计

在与用户的交流中,我们发现对用户需求的精准洞察普遍困扰着产品经理、设计、企划人员,因为当今消费者行为已经由单品消费转向场景消费,千人千面的个性化需求出现,消费者数据维度极大丰富,这对把握用户体验造成了很大挑…

Android开发系列(五)Jetpack Compose之Icon Image

Icon是用于在界面上显示矢量图标的组件。它提供了很多内置的矢量图标,也支持自定义图标。要使用Icon组件,可以通过指定图标资源的名称或引用来创建一个Icon对象。例如,使用Icons.Default.Home来创建一个默认风格的首页图标。可以通过设置图标…

TrueNAS系统在ARM平台上的移植

随着家庭及中小型企业对存储和共享需求的日益增长,高效、可靠的文件存储系统成为支撑各类应用的关键。 在众多存储系统中,TrueNAS以其卓越的数据完整性与可靠性、简洁高效的应用程序部署和管理、灵活的虚拟化应用添加能力,以及出色的可用性&a…

【第24章】Vue实战篇之用户信息展示

文章目录 前言一、准备1. 获取用户信息2. 存储用户信息3. 加载用户信息 二、用户信息1.昵称2.头像 三、展示总结 前言 这里我们来展示用户昵称和头像。 一、准备 1. 获取用户信息 export const userInfoService ()>{return request.get(/user/info) }2. 存储用户信息 i…

【面试题】风险评估和应急响应的工作流程

风险评估和应急响应是网络安全管理中两个重要的环节。下面分别介绍它们的工作流程: 一、风险评估工作流程: 1.确定评估范围:明确需要评估的信息系统或资产的范围。 2.资产识别:识别并列出所有需要评估的资产,包括硬件…

美妆短剧撬动33亿市值后,爆款短剧有了新风向

6月1日起微短剧分级备案正式施行,所有短剧未经备案不得播出,该备案也是短剧行业的首个行业规范,让近两年来肆意增长的短剧迎来新一轮洗牌,在保障短剧质量的同时,也促进了行业的发展。 ▲ 图片来源:网络 面对…

Freertos-----任务之间的消息传递(使用消息队列信号量方法)

这次来分享任务之间的数据传递的方法,方法有很多种,我展示2种,让大家对freertos有更深刻的印象 目录 消息队列 信号量 消息队列 首先直接打开普中的例程,然后在里面加上ADC的驱动代码,先初始化外设先,我…

前端模糊搜索关键字高亮

效果 代码 <template><view class"flexStart new-box"><view class"company"><!-- 输入框样式 --><view class"spaceBetween companyName" click.stop"isCompany true"><input type"text&quo…

xargs 传参

xargs的默认命令是 echo&#xff0c;空格是默认定界符。这意味着通过管道传递给 xargs的输入将会包含换行和空白&#xff0c;不过通过 xargs 的处理&#xff0c;换行和空白将被空格取代。xargs是构建单行命令的重要组件之一。 xargs -n1 // 一次输出一个参数到一行&#xf…

qmt量化交易策略小白学习笔记第47期【qmt编程之期货仓单】

qmt编程之获取期货数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; 期货仓单 提示 1…

使用Python selenium爬虫领英数据,并进行AI岗位数据挖掘

随着OpenAI大火&#xff0c;从事AI开发的人趋之若鹜&#xff0c;这次使用Python selenium抓取了领英上几万条岗位薪资数据&#xff0c;并使用Pandas、matplotlib、seaborn等库进行可视化探索分析。 但领英设置了一些反爬措施&#xff0c;对IP进行限制封禁&#xff0c;因此会用到…

mysql 某个时间字段取值时间标识的字符串的值

SELECT STR_TO_DATE(substr(out_trade_no, 1,14), %Y-%m-%d %H:%i:%s) FROM o_order WHERE id 364457; UPDATE o_order SET created_time DATE_FORMAT(STR_TO_DATE(substr(out_trade_no, 1,14), %Y%m%d %H%i%s), %Y-%m-%d %H:%i:%s) WHERE id 364457; 举例&#xff1a; 1…

五种实用方法!手把手教你系统盘瘦身

随着电脑的使用时间变长&#xff0c;电脑硬盘会逐渐被各种类型的数据占满&#xff0c;其中系统盘的可用空间也在慢慢变小。这是因为系统在运行过程中会产生大量临时文件和缓存文件&#xff0c;同时&#xff0c;系统的每一次更新升级也都会生成相关的文件夹存放在系统盘中&#…

高阶图神经网络 (HOGNN) 的概念、分类和比较

图神经网络&#xff08;GNNs&#xff09;是一类强大的深度学习&#xff08;DL&#xff09;模型&#xff0c;用于对相互连接的图数据集进行分类和回归。它们已被用于研究人类互动、分析蛋白质结构、设计化合物、发现药物、识别入侵机器、模拟单词之间的关系、寻找有效的交通路线…

AI/ML 数据湖参考架构架构师指南

这篇文章的缩写版本于 2024 年 3 月 19 日出现在 The New Stack 上。 在企业人工智能中&#xff0c;主要有两种类型的模型&#xff1a;判别模型和生成模型。判别模型用于对数据进行分类或预测&#xff0c;而生成模型用于创建新数据。尽管生成式人工智能最近占据了新闻的主导地…

excel基本操作

excel 若要取消在数据表中进行的所有筛选 步骤操作&#xff1a; 单击“数据”选项卡。在“排序和筛选”组中&#xff0c;找到“清除”按钮。点击“清除”按钮。 图例&#xff1a; 将文本文件的数据导入到Excel工作表中进行数据处理 步骤&#xff1a; 在Excel中&#xff0c…

DevEco鸿蒙开发请求网络交互设置

首先&#xff0c;在鸿蒙项目下config.json中找到module项&#xff0c;在里面填写"reqPermissions": [{"name": "ohos.permission.INTERNET"}] 在页面对应js文件内&#xff0c;填写import fetch from system.fetch;。 GET和POST区别 GET将表单数…

下班时间如何安排?

随着互联网的飞速发展和数字化时代的来临&#xff0c;越来越多的人开始探索除了主业以外的赚钱途径&#xff0c;以增加收入来源。本文将为您介绍几种当前热门的高薪副业项目&#xff0c;包括网络任务赚钱、开设个人网店、电商导购推广、在线辅导教学、技能变现服务、视频创作分…