mysql(54) : dbcp多实例使用

mysql版本:  8.0.11

java版本: 8

maven版本: 3.6.3

 

mave依赖

        <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.18</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId><version>2.6.0</version></dependency>

java代码


import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
import org.springframework.core.io.ClassPathResource;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.*;@AllArgsConstructor
@NoArgsConstructor
@Data
@Slf4j
public class DbcpDataSourceService {private BasicDataSource dataSource;private String propertiesFile;private Properties properties;private String describe;public DbcpDataSourceService(String propertiesFile) {this.propertiesFile = propertiesFile;initDataSource();}public void initDataSource() {try {long currentTimeMillis = System.currentTimeMillis();//获取配置文件,转换成流InputStream in = null;try {// 开发环境URL url = DbcpDataSourceService.class.getClassLoader().getResource(propertiesFile);File file = new File(url.getFile());in = new FileInputStream(file);} catch (Exception e) {}if (in == null) {// 达成jar包部署之后ClassPathResource classPathResource = new ClassPathResource(propertiesFile);in = classPathResource.getInputStream();}//创建properties对象properties = new Properties();//加载流properties.load(new InputStreamReader(in, StandardCharsets.UTF_8));//创建dataSource对象dataSource = BasicDataSourceFactory.createDataSource(properties);describe = new String(this.properties.getProperty("describe").getBytes(), StandardCharsets.UTF_8);log.info("【{}】数据库连接池 初始化成功, 耗时:【{}】毫秒", describe, System.currentTimeMillis() - currentTimeMillis);} catch (Exception e) {e.printStackTrace();}}public void execute(String sql) {if (dataSource == null) {log.warn("数据库连接池实例为空");return;}try (Connection conn = dataSource.getConnection();Statement statement = conn.createStatement();) {long startTime = System.currentTimeMillis();Class.forName(this.properties.getProperty("driverClassName"));statement.execute(sql);log.info("执行sql成功,sql:【{}】, 运行时长:【{}】毫秒", sql, System.currentTimeMillis() - startTime);} catch (Exception e) {log.error("sql执行失败:【{}】", sql, e);}}public List<List<String>> query(String sql) {return query(sql, Boolean.FALSE);}public List<List<String>> query(String sql, Boolean returnColumnName) {if (dataSource == null) {log.warn("数据库连接池实例为空");return null;}long startTime = System.currentTimeMillis();try (Connection conn = dataSource.getConnection();Statement stmt = conn.createStatement();) {ResultSet rs = stmt.executeQuery(sql);ResultSetMetaData resultSetMetaData = rs.getMetaData();int column = resultSetMetaData.getColumnCount();List<List<String>> result = new LinkedList<>();if (returnColumnName) {List<String> title = new ArrayList<>();for (int i = 1; i <= column; i++) {title.add(resultSetMetaData.getColumnName(i));}result.add(title);}while (rs.next()) {List<String> list = new LinkedList<>();for (int i = 1; i <= column; i++) {list.add(rs.getString(i));}result.add(list);}log.info("查询sql:【{}】, 运行时长:【{}】毫秒", sql, System.currentTimeMillis() - startTime);return result;} catch (Exception e) {log.error("sql查询失败:【{}】", sql, e);return null;}}public void print(String sql) {print(query(sql, Boolean.TRUE));}public void print(List<List<String>> res) {Map<Integer, Integer> columnMaxLength = new HashMap<>();for (int i = 0; i < res.size(); i++) {List<String> strings = res.get(i);for (int k = 0; k < strings.size(); k++) {if (!columnMaxLength.containsKey(k)) {columnMaxLength.put(k, 0);}if (strings.get(k) == null) {continue;}int length = strings.get(k).getBytes().length;if (length > columnMaxLength.get(k)) {columnMaxLength.put(k, length);}}}for (int i = 0; i < res.size(); i++) {List<String> strings = res.get(i);for (int k = 0; k < strings.size(); k++) {System.out.format("%-" + (columnMaxLength.get(k) + 5) + "s", strings.get(k));}System.out.println();}}@Overrideprotected void finalize() throws Throwable {close();super.finalize();}public void close() {try {dataSource.close();log.info("【{}】连接池执行关闭", describe);} catch (Exception e) {}}
}

使用

DbcpDataSourceService ddss = new DbcpDataSourceService("test.properties");
ddss.print("show databases");
ddss.print("show tables");
ddss.close();

test.properties


driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://127.0.0.1:3360/test?useUnicode=true&useSSL=false&characterEncoding=utf-8&serverTimezone=GMT%2b8&allowMultiQueries=true&allowPublicKeyRetrieval=trueusername=rootpassword=123456initialSize=1maxTotal=3maxIdle=2minIdle=1maxWaitMillis=1000testOnBorrow=truevalidationQuery=select 1describe=测试

说明

initialSize  初始化连接,连接池启动时创建的初始化连接数量(默认值为0)maxActive  最大活动连接,连接池中可同时连接的最大的连接数(默认值为8)minIdle 最小空闲连接,连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为0,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;但是不能太大,因为在机器很空闲的时候,也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置)maxIdle   最大空闲连接,连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置)maxWait 从池中取连接的最大等待时间,单位ms.当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限)validationQuery 验证使用的SQL语句testWhileIdle    指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.testOnBorrow    借出连接时不要测试,否则很影响性能。一定要配置,因为它的默认值是true。false表示每次从连接池中取出连接时,不需要执行validationQuery = "SELECT 1" 中的SQL进行测试。若配置为true,对性能有非常大的影响,性能会下降7-10倍。timeBetweenEvictionRunsMillis每30秒运行一次空闲连接回收器,配置timeBetweenEvictionRunsMillis = "30000"后,每30秒运行一次空闲连接回收器(独立线程)。并每次检查3个连接,如果连接空闲时间超过30分钟就销毁。销毁连接后,连接数量就少了,如果小于minIdle数量,就新建连接,维护数量不少于minIdle,过行了新老更替。minEvictableIdleTimeMillis池中的连接空闲30分钟后被回收numTestsPerEvictionRun在每次空闲连接回收器线程(如果有)运行时检查的连接数量removeAbandoned连接泄漏回收参数,当可用连接数少于3个时才执行removeAbandonedTimeout连接泄漏回收参数,180秒,泄露的连接可以被删除的超时值

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

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

相关文章

使用C#反射中的MAKEGENERICTYPE函数,来为泛型方法和泛型类指定(泛型的)类型

MakeGenericType 是一个在 C# 中用于创建开放类型的实例的方法。开放类型是一种未绑定类型参数的泛型类型。当你有一个泛型类型定义&#xff0c;并且想要用特定的类型实例化它时&#xff0c;你可以使用 MakeGenericType 方法。 public Type MakeGenericType (params Type[] ty…

Windows API 开发桌面应用程序,在窗口按下鼠标左键不放可以拖图,并且拖图期间鼠标图标变成手掌

在Windows API中&#xff0c;要实现鼠标左键按下并拖动以移动窗口中的某个图形&#xff0c;并且同时改变鼠标图标为“手掌”形状&#xff08;这通常指的是“拖动”或“移动”的图标&#xff09;&#xff0c;你需要执行几个步骤。 以下是一个基本的步骤指南&#xff0c;用于在W…

java---程序逻辑控制(详解)

目录 一、概述二、顺序结构三、分支结构3.1 if语句3.1.1 语法格式13.1.2 语法格式23.1.3 语法格式3 3.2 练习3.2.1 判断一个数字是奇数还是偶数3.2.2 判断一个数字是正数&#xff0c;负数&#xff0c;还是零3.2.3 判断一个年份是否为闰年 3.3.switch语句 四、循环结构4.1 while…

部署Jar包教程

文章目录 引言I 编写脚本1.1 启动1.2 关闭1.3 SSH上传jar包II 打包2.1 build中的plugins中标签的含义2.2 jar中没有主清单属性引言 I 编写脚本 1.1 启动 chmod a+x start.sh #!/bin/bash nohup java -Xms1024m -Xmx1024m -Xmn256m -XX:MaxDirectMemorySize=5G -jar SOAP-0.…

在Linux平台下使用 .NET Core技术的UI方案

在Linux平台下使用 .NET Core 实现精美的界面&#xff0c;你可以考虑以下几种方案&#xff1a; 1. 使用 Avalonia Avalonia 是一个跨平台的 .NET UI 框架&#xff0c;支持 Windows、macOS 和 Linux。它类似于 WPF&#xff0c;但能够在多个平台上运行。 安装 Avalonia 你可以…

Flutter vscode环境如何进行真机测试

目录 1. 准备工作 1.1 安装Flutter和VS Code 1.2 安装必要的VS Code扩展 1.3 手机设置 2. 配置VS Code调试环境 3. 手机如何退出开发者模式 1. 准备工作 1.1 安装Flutter和VS Code 确保你已经在电脑上安装了Flutter SDK和VS Code。如果还没有&#xff0c;可以参考以下指…

项目文章 | Nature Commun蓝藻转录因子PhoB对磷/铁的营养元素限制的调控机制

近日&#xff0c;华中师范大学邱保胜教授团队在《Nature Communications》发表题为“Phosphorus deficiency alleviates iron limitation in Synechocystis cyanobacteria through direct PhoB-mediated gene regulation”文章&#xff0c;其重点研究了Synechocystis蓝藻转录因…

硬件产品经理

边端协调管理平台 主页模型管理配置管理设备管理设备检测组态数据服务传输通道服务 定义与范围&#xff1a; 边测&#xff1a;通常指的是边缘计算的测试&#xff0c;这里的“边缘”可以理解为离用户更近的计算节点或设备&#xff0c;如小 型数据中心、具有计算能力的小基站等。…

深度学习课程设计:构建未来的教育蓝图

深度学习课程设计&#xff1a;构建未来的教育蓝图 在近年来&#xff0c;深度学习已经从一项前沿的技术发展成为计算机科学领域不可或缺的一部分。随着其在多个行业中的应用日益增多&#xff0c;对深度学习教育的需求也在急剧上升。对于计划将深度学习纳入学术课程的教育者而言…

【WRF理论第二期】运行模型的基础知识

WRF理论第二期&#xff1a;运行模型的基础知识 1 Basics for Running the Model2 Geogrid程序2.1 Geogrid2.2 Terrestrial Input Data 3 Ungrid程序3.1 Ungrid3.2 Intermediate Files3.3 Required Fields 4 Metgrid程序参考 官方介绍-Basics for Running the Model 本博客主要…

耐用好用充电宝有哪些?畅销排行榜前四款充电宝推荐

在日常生活中&#xff0c;一款耐用且好用的充电宝是我们出行必备的利器&#xff0c;它可以为我们的手机、平板等设备提供持续的电力支持。然而&#xff0c;在市面上琳琅满目的充电宝品牌中&#xff0c;究竟哪些才是真正耐用又好用的选择&#xff1f;为了帮助大家更好地了解市场…

BubbleML: A Multiphase Multiphysics Dataset and Benchmarks for Machine Learning

我们使用以下六个分类标准: 研究方法: 这个标准根据如何收集和分析数据来区分研究方法。 实验研究,如参考文献[64]中的研究,涉及在受控环境中研究人员操纵变量并观察结果的物理实验。这种方法对于收集真实世界的数据很有价值,但可能成本高且耗时。模拟研究利用计算模型来模…

Qt5学习笔记(一):Qt Widgets Application项目初探

笔者长期使用MFC开发Windows GUI软件。随着软件向Linux平台迁移的趋势越发明朗&#xff0c;GUI程序的跨平台需求也越来越多。因此笔者计划重新抓一下Qt来实现跨平台GUI程序的实现。 0x01. 看看Qt Widgets Application项目结构 打开Qt5&#xff0c;点击“ New”按钮新建项目。…

2024.05.25 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、夏令营 | 2024年中物院暑期招生夏令营活动报名启动 夏令营 | 2024年中物院暑期招生夏令营活动报名启动 2、实习 | 新华三集团2025届实习体验生招聘全面启动&#xff01; 实习 | 新华三…

基于Kubernetes和DeepSpeed进行分布式训练的实战教程

目录 ​编辑 一、前期准备 二、部署和配置训练任务 三、编写和运行训练代码 四、监控和调优 五、代码实现 5.1. Dockerfile 5. 2. DeepSpeed 配置文件 (ds_config.json) 5.3. Kubernetes 部署文件 (deployment.yaml) 5.4. PyTorch 训练脚本 (train.py) 注意事项&am…

windows任意窗口置顶/前台显示/不被最小化或遮挡

问题&#xff1a;在办公时&#xff0c;当同时需要打开好几个重要的窗口&#xff0c;比如需要对若干个文件夹里的文件进行操作&#xff0c;几个窗口都需要一直在桌面前台显示&#xff0c;但这样的话容易在打开其他页面或是切其他窗口的时候被遮挡&#xff0c;因此考虑如何让几个…

我们如何用npm发布自己的插件包?详细的教程来了

一、什么是npm插件&#xff1f; npm&#xff08;“Node 包管理器”&#xff09;是 JavaScript 运行时 Node.js 的默认程序包管理器。npm插件是指通过npm安装的第三方包&#xff0c;可以在Node.js项目中直接使用。这些插件涵盖了各种领域&#xff0c;包括Web开发、数据测试、构建…

如何把linux安装到单片机中

1.如何把linux安装到单片机中 将Linux安装到单片机中通常不是一个直接的过程&#xff0c;因为单片机&#xff08;如51系列、STC系列等&#xff09;的硬件资源和处理能力有限&#xff0c;而Linux是一个为更强大硬件平台&#xff08;如个人电脑、服务器&#xff09;设计的操作系…

用于精准治疗和预防细菌感染的生物功能脂质纳米颗粒

引用信息 文 章&#xff1a;Biofunctional lipid nanoparticles for precision treatment and prophylaxis of bacterial infections. 期 刊&#xff1a;Science Advances&#xff08;影响因子&#xff1a;13.6&#xff09; 发表时间&#xff1a;2024年4月5日 作 者&a…

[笔记] rknn Toolkit1.6=>2.0 API变动注释

RKNNToolkit2 API Difference With Toolkit1.6 原始文档出处参见上面的标题。下面会对重要的变动内容做标记。 rknn.config Toolkit1: config(batch_size100, # abandonedcaffe_mean_fileNone, # abandoneddt…