Spring Boot 中 JdbcTemplate 处理枚举类型转换 和 减少数据库连接的方法 的详细说明,包含代码示例和关键要点
以下是 Spring Boot 中 JdbcTemplate 处理枚举类型转换 和 减少数据库连接的方法 的详细说明,包含代码示例和关键要点:
一、JdbcTemplate 处理枚举类型转换
1. 场景说明
假设数据库存储的是枚举的 String 或 int 值,但 Java 实体类使用 enum 类型。例如:
public enum Status {ACTIVE, INACTIVE, PENDING
}public class User {private Long id;private Status status; // 数据库字段存储为 "ACTIVE" 或 "INACTIVE"
}
2. 方法 1:自定义 RowMapper
手动将数据库字段值转换为枚举:
public class UserRowMapper implements RowMapper<User> {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {Status status = Status.valueOf(rs.getString("status")); // 字符串转枚举return new User(rs.getLong("id"), status);}
}
3. 方法 2:使用 BeanPropertyRowMapper + 自定义转换器
通过 ConversionService 自动转换:
// 配置 ConversionService
@Configuration
public class AppConfig implements WebMvcConfigurer {@Overridepublic void addFormatters(FormatterRegistry registry) {registry.addConverter(String.class, Status.class, source -> Status.valueOf(source));}
}// 使用 BeanPropertyRowMapper
List<User> users = jdbcTemplate.query("SELECT * FROM users",BeanPropertyRowMapper.newInstance(User.class)
);
4. 方法 3:使用 @Enumerated 注解(需结合 ORM)
若使用 JPA/Hibernate,可通过 @Enumerated 注解自动转换,但需注意 JdbcTemplate 不直接支持此注解。需配合自定义转换逻辑。
二、减少数据库连接的方法
1. 优化连接池配置
Spring Boot 默认使用 HikariCP 连接池,通过调整参数控制连接数:
# application.properties
# 降低最大连接数(根据实际需求调整)
spring.datasource.hikari.maximum-pool-size=10
# 设置空闲连接超时(单位:毫秒)
spring.datasource.hikari.idle-timeout=30000
# 缩短连接获取超时时间
spring.datasource.hikari.connection-timeout=2000
2. 使用连接池监控
通过 HikariPoolMXBean 监控连接池状态:
@Bean
public HikariPoolMXBean hikariPoolMXBean(DataSource dataSource) {return ((HikariDataSource) dataSource).getHikariPoolMXBean();
}// 示例:获取当前活跃连接数
public void checkConnections() {HikariPoolMXBean pool = ...; // 通过注入获取System.out.println("Active Connections: " + pool.getActiveConnections());
}
3. 优化 SQL 查询
- 避免 N+1 查询:使用
JOIN或批量查询减少数据库调用。 - 索引优化:确保查询字段有索引,减少查询时间。
- 分页查询:限制
SELECT的返回行数(如LIMIT 100)。
4. 缓存策略
- 一级缓存:JDBC 驱动自带的查询缓存(如 MySQL 的
query_cache,但需注意并发问题)。 - 二级缓存:使用 Redis 或 Caffeine 缓存频繁查询的数据:
@Service public class UserService {@Autowiredprivate JdbcTemplate jdbcTemplate;@Autowiredprivate CacheManager cacheManager;public User getUserById(Long id) {String key = "user:" + id;return (User) cacheManager.getCache("users").get(key, () -> {// 查询数据库并缓存结果return jdbcTemplate.queryForObject("SELECT * FROM users WHERE id = ?",new Object[]{id},new UserRowMapper());});} }
5. 连接复用与资源管理
- 使用 try-with-resources:确保
ResultSet和Connection及时关闭:try (Connection conn = dataSource.getConnection()) {// 执行查询 } catch (SQLException e) {throw new RuntimeException(e); }
6. 异步查询
通过 CompletableFuture 异步执行查询,释放线程资源:
public CompletableFuture<User> findUserAsync(Long id) {return CompletableFuture.supplyAsync(() -> jdbcTemplate.queryForObject("SELECT * FROM users WHERE id = ?",new Object[]{id},new UserRowMapper()),Executors.newFixedThreadPool(5));
}
三、关键对比表格
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 自定义 RowMapper | 需要手动控制枚举转换 | 灵活,完全可控 | 代码冗余,需为每个字段编写转换逻辑 |
| BeanPropertyRowMapper | 列名与属性名一致,使用转换器 | 简单,减少代码量 | 需配置 ConversionService |
| HikariCP 配置优化 | 控制连接池大小和超时 | 直接减少连接数,降低资源占用 | 需根据负载调整参数,可能影响性能 |
| 连接池监控 | 动态调整连接池配置 | 实时监控连接状态,快速发现瓶颈 | 需额外开发监控逻辑 |
| SQL 优化 | 减少查询次数或执行时间 | 显著降低数据库负载 | 需深入分析 SQL 和索引 |
| 缓存策略 | 频繁查询且数据不频繁变化 | 减少数据库访问次数 | 需管理缓存失效,可能引入一致性问题 |
| 异步查询 | 高并发场景,需释放线程资源 | 提升吞吐量 | 增加复杂度,需处理异步结果 |
四、注意事项
-
枚举转换:
- 确保数据库字段值与枚举常量名称完全一致(或通过转换器处理差异)。
- 避免在
RowMapper中抛出未处理的异常,需捕获SQLException。
-
连接池配置:
- 根据服务器资源和 QPS 合理设置
maximum-pool-size,避免过大导致数据库负载过高。 - 监控
active和idle连接数,及时发现泄漏。
- 根据服务器资源和 QPS 合理设置
-
缓存:
- 对于频繁更新的数据,需设置合理的过期时间或失效策略。
- 使用分布式缓存(如 Redis)避免单点故障。
五、总结
通过 自定义 RowMapper 或 ConversionService 可以优雅地处理枚举类型转换,而 优化连接池配置、SQL 查询和引入缓存 是减少数据库连接的核心策略。根据具体场景选择合适的方法,平衡性能与资源消耗。
相关文章:
Spring Boot 中 JdbcTemplate 处理枚举类型转换 和 减少数据库连接的方法 的详细说明,包含代码示例和关键要点
以下是 Spring Boot 中 JdbcTemplate 处理枚举类型转换 和 减少数据库连接的方法 的详细说明,包含代码示例和关键要点: 一、JdbcTemplate 处理枚举类型转换 1. 场景说明 假设数据库存储的是枚举的 String 或 int 值,但 Java 实体类使用 enu…...
DataGear 5.3.0 制作支持导出表格数据的数据可视化看板
DataGear 内置表格图表底层采用的是DataTable表格组件,默认并未引入导出数据的JS支持库,如果有导出表格数据需求,则可以在看板中引入导出相关JS支持库,制作具有导出CSV、Excel、PDF功能的表格数据看板。 在新发布的5.3.0版本中&a…...
Web网页内嵌 Adobe Pdf Reader 谷歌Chrome在线预览编辑PDF文档
随着数字化办公的普及,PDF文档已成为信息处理的核心载体,虽然桌面端有很多软件可以实现预览编辑PDF文档,而在线在线预览编辑PDF也日益成为一个难题。 作为网页内嵌本地程序的佼佼者——猿大师中间件,之前发布的猿大师办公助手&am…...
歌词json
绽放(4:17) {"lyrics": [{time: 00:00, text: 作词:郑润泽},{time: 00:01, text: 作曲:郑润泽},{time: 00:02, text: 编曲:赵建飞},{time: 00:03, text: 制作人:李淘/赵建飞},{time: 00:09, tex…...
CNG汽车加气站操作工备考真题及答案解析【判断题】
1、燃气经营许可证按照燃气经营规模和类别实行分级审批。(√) 解析:不同规模和类别的燃气经营,其许可证审批级别不同,以确保经营活动的规范和安全。 2、依照《安全生产法》的规定,安全生产监督检查人员对检…...
Sentinel[超详细讲解]-1
定义一系列 规则 👺,对资源进行 保护 👺, 如果违反的了规则,则抛出异常,看是否有fallback兜底处理,如果没有则直接返回异常信息😎 1. 快速入门 1.1 引入 Sentinel 依赖 <depend…...
CUDA专题8—CUDA L2缓存完全指南:从持久化策略到性能优化实战
1. 设备内存L2缓存访问管理 当CUDA内核反复访问全局内存中的某个数据区域时,此类数据访问可视为持久化(persisting)访问。反之,若数据仅被访问一次,则可视为流式(streaming)访问。 从CUDA 11.0开始,计算能力8.0及以上的设备能够调控L2缓存中数据的持久性,从而可能实现更…...
如何让 SQL2API 进化为 Text2API:自然语言生成 API 的深度解析?
在过去的十年里,技术的进步日新月异,尤其是在自动化、人工智能与自然语言处理(NLP)方面。 随着“低代码”平台的崛起,开发者和非技术人员能够更轻松地构建强大而复杂的应用程序。然而,尽管技术门槛降低了&…...
OCCT(2)Windows平台编译OCCT
文章目录 一、Windows平台编译OCCT1、准备环境2、下载源码3、下载第三方库4、使用 CMake 配置5、编译OCCT源码6、运行示例 一、Windows平台编译OCCT 1、准备环境 安装工具: Visual Studio(推荐 VS2019/2022,选择 C 桌面开发 组件࿰…...
【蓝桥杯—单片机】通信总线专项 | 真题整理、解析与拓展 (更新ing...)
通信总线专项 前言SPI第十五届省赛题 UART/RS485/RS232UARTRS485RS232第十三届省赛题小结和拓展:传输方式的分类第十三届省赛 其他相关考点网络传输速率第十五届省赛题第十二届省赛题 前言 在本文中我会把 蓝桥杯单片机赛道 历年真题 中涉及到通信总线的题目整理出…...
【Golang】泛型与类型约束
文章目录 一、环境二、没有泛型的Go三、泛型的优点四、理解泛型(一)定义(二)调用(三)类型约束(Type Constraint)1)接口与约束2)结构体类型约束3)类…...
Uni-app页面信息与元素影响解析
获取窗口信息uni.getWindowInfo {pixelRatio: 3safeArea:{bottom: 778height: 731left: 0right: 375top: 47width: 375}safeAreaInsets: {top: 47, left: 0, right: 0, bottom: 34},screenHeight: 812,screenTop: 0,screenWidth: 375,statusBarHeight: 47,windowBottom: 0,win…...
CentOS(最小化)安装之后,快速搭建Docker环境
本文以VMware虚拟机中安装最小化centos完成后开始。 1. 检查网络 打开网卡/启用网卡 执行命令ip a查看当前的网络连接是否正常: 如果得到的结果和我一样,有ens网卡但是没有ip地址,说明网卡未打开 手动启用: nmcli device sta…...
【身份证证件OCR识别】批量OCR识别身份证照片复印件图片里的文字信息保存表格或改名字,基于QT和腾讯云api_ocr的实现方式
项目背景 在许多业务场景中,需要处理大量身份证照片复印件,手动输入其中的文字信息效率低下且容易出错。利用 OCR(光学字符识别)技术可以自动识别身份证图片中的文字信息,结合 QT 构建图形用户界面,方便用户操作,同时使用腾讯 OCR API 能够保证较高的识别准确率。 界面…...
IP属地和发作品的地址不一样吗
在当今这个数字化时代,互联网已经成为人们日常生活不可或缺的一部分。随着各大社交平台功能的不断完善,一个新功能——IP属地显示,逐渐走进大众视野。这一功能在微博、抖音、快手等各大平台上得到广泛应用,旨在帮助公众识别虚假信…...
Redis - 概述
目录 编辑 一、什么是redis 二、redis能做什么(有什么特点)? 三、redis有什么优势 四、Redis与其他key-value存储有什么不同 五、Redis命令 六、Redis数据结构 1、基础数据结构 2、高级数据结构 一、什么是redis 1、redis&#x…...
vue3 根据城市名称计算城市之间的距离
<template><div class"distance-calculator"><h1>城市距离计算器</h1><!-- 城市输入框 --><div class"input-group"><inputv-model"city1"placeholder"请输入第一个城市"keyup.enter"cal…...
html 列表循环滚动,动态初始化字段数据
html <div class"layui-row"><div class"layui-col-md4"><div class"boxall"><div class"alltitle">超时菜品排行</div><div class"marquee-container"><div class"scroll-…...
QT基础:安装与简介
QT初级 1、简介1.1 安装1.2 设置1.3 在VS中配置Qt1.3 帮助文档 2、Qt项目2.1 创建项目2.1 项目文件2.2 Qt中的窗口类窗口显示 2.3 坐标体系2.4 内存回收 1、简介 QT是一个跨平台的C应用程序开发框架。几乎支持所有的平台, 可用于桌面程序开发以及嵌入式开发。 Qt是标准 C 的扩…...
41、当你在 index.html 中引用了一个公共文件(比如 common.js),修改这个文件后,用户访问页面时仍然看到旧内容,因为浏览器缓存了旧版本
由于浏览器缓存导致公共文件无法更新。当用户修改了公共文件(如 JavaScript 或 CSS),但 index.html 中引用的文件名没有变化,浏览器会认为文件没有更新,继续使用缓存的旧版本。因此,需要通过某种方式让浏览…...
WEB安全-HTTPS
1 需求 结合Wireshark抓包实战,图文详解TCP三次握手及四次挥手原理(附下载) 结合Wireshark抓包分析,沉浸式体验HTTP请求的一次完整交互过程 https://mp.weixin.qq.com/s/f3LmUEtjIuLjkyjxJj7ebA 一文彻底了解DNS协议工作原理&…...
【宇宙回响】从Canvas到MySQL:飞机大战的全栈交响曲【附演示视频与源码】
🌟 这是星际大战系列的第三篇,感谢一路以来支持和关注这个项目的每一位朋友! 💡 文章力求严谨,但难免有疏漏之处,欢迎各位朋友指出,让我们一起在交流中进步。 🎁 项目代码、文档和相关资源都可以免费获取,希望能帮助到更多对游戏开发感兴趣的朋友。 💌 如果您有任…...
Linux内核内存管理 ARM32页表映射流程和案例分享
ARM32架构使用两级页表结构将虚拟地址转换为物理地址,以下为详细流程及案例分析: ARM32页表映射流程 1.获取页目录基地址 MMU通过TTBR(Translation Table Base Register)寄存器获取当前进程的一级页表(L1页表&#x…...
git push origin masterremote: [session-bd46a49f] The token username invalid
参考:如何把项目上传到Gitee(保姆级教程)_gitee上传项目-CSDN博客 1 新建仓库 username可以是登录账号的邮箱地址也可以是用户名 password可以是登录账号的密码也可以是私人令牌 2 创建分支 3 初始化 dev是你新建的分支 创建并切换分支 git init g…...
基于MCU实现的电机转速精确控制方案:软件设计与实现
本文将详细介绍一篇基于微控制器(MCU)的电机转速精确控制的软件方案。通过采样PWM信号控制和ADC采样技术,结合PID闭环控制算法,实现了电机转速的高效、稳定调节。以下是软件方案流程图,下文将对其进行展开讲解。 原图太…...
suse15 sp1使用华为云软件源yum源zypper源
登录suse15终端, cd /etc/zypp/repos.d/进入目录后执行以下命令: zypper ar -fcg https://mirrors.huaweicloud.com/opensuse/distribution/leap/15.1/repo/oss HuaWeiCloud:15.1:OSS zypper ar -fcg https://mirrors.huaweicloud.com/opensuse/distribu…...
amd64 架构机器如何拉取arm64的镜像
在 AMD 架构(通常是 x86_64 架构)的机器上拉取 ARM 架构的镜像 拉取指定架构的镜像 例如,要拉取 ARM64 架构的 nginx 镜像,可以使用以下命令: docker pull --platform linux/arm64 nginx...
【模拟CMOS集成电路笔记】轨到轨运放(Rail to Rail)基础(附带实例:基于1:3电流镜的轨到轨输入运放)
【模拟CMOS集成电路笔记】轨到轨运放(Rail to Rail)基础 0前言1 简介1.1轨到轨输入级(1)互补差分对:(2)输入范围切换: 1.2轨到轨输出级(1)推挽输出:(1)输出级偏置: 2轨到轨输入运放2.1基于电流倍增实现恒定…...
【零基础入门unity游戏开发——通用篇】图片相关设置
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...
解决关于原生gmssl无法直接输出sm2私钥明文的问题
解决关于原生gmssl无法直接输出sm2私钥明文的问题 问题描述解决方法解决方法一解决方法二 问题描述 通过gmssl生成sm2公私钥对时,输出的是加密的sm2私钥,无法获取到SM2私钥明文。 解决方法 解决方法一 手动解密: 解决方法二 修改源码&…...
