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

news2024/7/6 18:41:23

参考文章

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.coloradmin.cn/o/1837123.html

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

相关文章

GitHub星标破千Star!Python游戏编程的初学者指南

Python 是一种高级程序设计语言,因其简洁、易读及可扩展性日渐成为程序设计领域备受推崇的语言。 目前的编程书籍大多分为两种类型。第一种,与其说是教编程的书,倒不如说是在教“游戏制作软件”,或教授使用一种呆板的语言&#x…

深入解析纹理贴图——纹理压缩技术

by STANCH 标签:#纹理压缩 #纹理贴图 1.纹理压缩概述 3D计算机图形学离不开各种类型的纹理。纹理贴图可以极大地提高3D物体的视觉质量和细节水平,而不增加几何复杂度。简单的纹理是二维图像,该图像的单个像素称为纹素(texel)。事实上,纹理不仅可以存储…

CMDB是什么实践案例分享

CMDB是什么&实践案例分享 腾讯蓝鲸CMDB通过集中化管理、自动化发现、灵活的模型定义和开放的API,帮助企业高效管理IT资产和配置项,提升运维效率和服务质量,同时支持与其他系统的无缝集成,适用于金融、制造、互联网等多个行业…

Airflow Dag中,某个多分支汇合的task不执行

之前才接触airflow的时候遇到这个问题,但是解决了没有记录,今天又遇到了想起来就记录下 就拿这个图举例,这是个典型的分支路最后汇合执行的task,用代码演示就是这种情况,有两条路可以执行,最后又回归同一个…

工业边缘计算网关在机械制造企业中的应用-天拓四方

随着信息技术的不断发展,工业领域对数据处理和分析的需求日益增长。工业边缘计算网关作为一种新型技术,正逐渐成为工业数字化转型的关键驱动力。本文将通过一个具体案例阐述工业边缘计算网关在工业中的应用,以及其为工业生产带来的显著效益。…

集体爆雷!突发中科院2区(Top) 被标记!新增10本期刊被“On Hold“

本周投稿推荐 SSCI • 中科院2区,6.0-7.0(录用友好) EI • 各领域沾边均可(2天录用) CNKI • 7天录用-检索(急录友好) SCI&EI • 4区生物医学类,0.5-1.0(录用…

如何在宝塔中使用命令行执行命令

一、 进入宝塔,找到网站然后点击根目录 二、进入项目中,然后点击 终端 三、如果这里会弹出输入密码的框,那就是需要你输入一下你服务器的 账号密码,然后就登录进去了,可以在这里直接执行命令即可,比如我这…

Notes客户机开启事务日志

大家好,才是真的好。 了解过事务日志的人都知道——等等,你还不知道事务日志? 那我们先介绍一下,简单来说,Domino事务日志是捕获数据库更改并将其写入的记录,然后等服务器不繁忙或按计划更新到磁盘上的No…

【前端:HTML+CSS+JavaScript】HTML基础(下)

一、表格标签 1.1 表格的主要作用 表格主要用于显示、展示数据。因为她可以让数据显示的非常频繁&#xff0c;可读性非常好。特别是后台展示数据的时候&#xff0c;能够熟练运用表格就线程显得很重要。表格不是用来布局页面的。而是用来展示数据的。 1.2 表格的基本语法 <…

了解Nest.js

一直做前端开发&#xff0c;都会有成为全栈工程师的想法&#xff0c;而 Nest 就是一个很好的途径&#xff0c;它是 Node 最流行的企业级开发框架&#xff0c;提供了 IOC、AOP、微服务等架构特性。接下来就让我们一起来学习Nest.js Nest.js官网地址 一&#xff0c;了解Nest Cli …

Python安装失败,报0x80070643-安装时发生严重错误。

背景 之前安装了3.12.4&#xff0c;因为没用到&#xff0c;就用Revo Uninstaller Pro卸载了&#xff0c;连注册表都清理了。后面看到别人写的一个工具不符合预期&#xff0c;想对源码修改下&#xff0c;用到了Python,于是重新安装&#xff0c;出现上面报错。 解决方法尝试 因…

JS 实现树形结构的各种操作(2)

一 数据源 以下所有操作&#xff0c;都使用本数据做测试。 const oraData [{id: "1",name: "动物",children: [{id: "1-1",name: "哺乳类",children: [{id: "1-1-1",name: "小猫",children: []},{id: "1-1…

c++参考std::string自己设计类hstring

目录 一、前言 二、设计需求 三、设计思想 1.功能一 1.功能二 四、设计过程 1.类hstring搭建 2. 实现有参构造函数 3. 实现副本构造函数 4.完整代码 五、结束语 一、前言 在c中有很多的库&#xff0c;但是在有些时候呢&#xff0c;我们一定要学会自己去设计库&#…

游戏服务器研究一:bigworld 开源代码的编译与运行

1. 前言 bigworld 已经开源了它的代码&#xff0c;而我对于大世界的 scale 很感兴趣&#xff0c;所以就尝试把代码跑起来研究。但是&#xff0c;整个过程比我原先预想的复杂得多。 虽然能找到一些官方的帮助文档&#xff0c;但这些文档要么过旧&#xff0c;要么过于详尽&…

SpringBoot + Maven 项目的创建

文章目录 1、Maven2、SpringBoot3、二者之间的联系4、项目的创建 在创建项目之前&#xff0c;肯定要知道他们之间的区别 1、Maven maven是一个跨平台的项目管理工具。它是Apache的一个开源项目&#xff0c;主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。 比如说…

贪吃蛇游戏代码(C语言项目)

本篇仅提供C语言代码&#xff0c;详细讲解在这篇博客&#xff1a;C语言&#xff1a;贪吃蛇游戏&#xff08;从0开始完整版&#xff09;-CSDN博客 1、运行演示 QQ2024618-155655 2、代码构成&#xff08;vs编译器&#xff09; 3、C语言代码 3.1 头文件Snake.h #pragma once #i…

存储文件夹下所有.cpp和.h的代码到对应的txt文件里

最近大半年刷了160多天的题&#xff0c;每次刷的时候都要新建一个VS文件&#xff0c;所以文件内存太大了&#xff0c;又舍不得删&#xff0c;就用ai整了一个脚本&#xff0c;可将当前路径下的所有文件里的.cpp和.h文件储存到相应名字的txt文件里&#xff0c;若文件夹下还有文件…

概率论拾遗

条件期望的性质 1.看成f(Y)即可 条件期望仅限于形式化公式&#xff0c;用于解决多个随机变量存在时的期望问题求解&#xff0c;即 E(?)E(E(?|Y))#直接应用此公式条件住一个随机变量&#xff0c;进行接下来的计算即可 定义随机变量之间的距离为&#xff0c;即均方距离 随机…

k8s集群新增计算节点使用华为iscsi存储创建的pvc存储挂载报错:FailedMount

背景&#xff1a; 因公司业务需求的增长&#xff0c;导致kubernetes集群测试环境的计算节点资源不够使用了&#xff0c;这时候就申请了几台服务器加入到kubernetes集群中&#xff0c;因为维护的kubernetes集群的对接华为了iscsi存储&#xff0c;通过storageclass组件来创建pvc存…

LangChain入门学习笔记(四)—— Model I/O之LLMs

Prompts输入大模型应用后&#xff0c;下一个重要的处理组件就是LLM或者Chat Model&#xff0c;在这里大模型根据提示语产生相应内容&#xff0c;本章主要介绍LLM。 LangChain不定义自己的LLMs&#xff0c;但是它提供标准接口。由其他的LLM提供商&#xff08;比如OpenAI、Coher…