Spring Boot 中 JdbcTemplate 处理枚举类型转换 和 减少数据库连接的方法 的详细说明,包含代码示例和关键要点

以下是 Spring Boot 中 JdbcTemplate 处理枚举类型转换减少数据库连接的方法 的详细说明,包含代码示例和关键要点:


一、JdbcTemplate 处理枚举类型转换

1. 场景说明

假设数据库存储的是枚举的 Stringint 值,但 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:确保 ResultSetConnection 及时关闭:
    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 和索引
缓存策略频繁查询且数据不频繁变化减少数据库访问次数需管理缓存失效,可能引入一致性问题
异步查询高并发场景,需释放线程资源提升吞吐量增加复杂度,需处理异步结果

四、注意事项

  1. 枚举转换

    • 确保数据库字段值与枚举常量名称完全一致(或通过转换器处理差异)。
    • 避免在 RowMapper 中抛出未处理的异常,需捕获 SQLException
  2. 连接池配置

    • 根据服务器资源和 QPS 合理设置 maximum-pool-size,避免过大导致数据库负载过高。
    • 监控 activeidle 连接数,及时发现泄漏。
  3. 缓存

    • 对于频繁更新的数据,需设置合理的过期时间或失效策略。
    • 使用分布式缓存(如 Redis)避免单点故障。

五、总结

通过 自定义 RowMapperConversionService 可以优雅地处理枚举类型转换,而 优化连接池配置、SQL 查询和引入缓存 是减少数据库连接的核心策略。根据具体场景选择合适的方法,平衡性能与资源消耗。

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

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

相关文章

API 安全之认证鉴权

作者&#xff1a;半天 前言 API 作为企业的重要数字资源&#xff0c;在给企业带来巨大便利的同时也带来了新的安全问题&#xff0c;一旦被攻击可能导致数据泄漏重大安全问题&#xff0c;从而给企业的业务发展带来极大的安全风险。正是在这样的背景下&#xff0c;OpenAPI 规范…

MATLAB绘图配色包说明

本栏目将分享MATLAB数据分析图表&#xff0c;该贴讲述配色包的使用 将配色包colormap_nclCM文件夹添加到路径close all&#xff08;尽量不要删&#xff09;&#xff0c;使用map colormap(nclCM(309))时会多出来一张空白图片。配色资源来自slandarer&#xff1b;找不到合适颜色…

Oracle 数据库系统全面详解

Oracle 数据库是全球领先的关系型数据库管理系统(RDBMS)&#xff0c;由 Oracle 公司开发。它为企业级应用提供了高性能、高可用性、安全性和可扩展性的数据管理解决方案。 目录 一、Oracle 数据库体系结构 1. 物理存储结构 主要组件&#xff1a; 存储层次&#xff1a; 2. …

Flink介绍——发展历史

引入 我们整个大数据处理里面的计算模式主要可以分为以下四种&#xff1a; 批量计算&#xff08;batch computing&#xff09; MapReduce Hive Spark Flink pig流式计算&#xff08;stream computing&#xff09; Storm SparkStreaming/StructuredStreaming Flink Samza交互计…

在MFC中使用Qt(四):使用属性表(Property Sheet)实现自动化Qt编译流程

前言 首先回顾下前面文章介绍的&#xff1a; 在MFC中使用Qt&#xff08;一&#xff09;&#xff1a;玩腻了MFC&#xff0c;试试在MFC中使用Qt&#xff01;&#xff08;手动配置编译Qt&#xff09; 在MFC中使用Qt&#xff08;二&#xff09;&#xff1a;实现Qt文件的自动编译流…

Go红队开发— 收官工具

文章目录 免责声明个人武器开发美观输出Whois查询反查ip目录扫描子域名爆破被动扫描主动扫描(字典爆破)CDN检测 免责声明 &#x1f4a1; 本博客绝不涉及任何非法用途。 &#x1f4a1; 使用者风险自担&#xff0c;违规后果自负。 &#x1f4a1; 守法为先&#xff0c;技术向善。 …

论文阅读《P​roximal Curriculum for Reinforcement Learning Agents》——提升智能体学习速度的

老规矩&#xff0c;今天是使用Gemini2.5pro来生成的模板 这篇论文研究了如何为处理多个相关任务的强化学习智能体自动设计学习课程&#xff08;即任务顺序&#xff09;&#xff0c;以加速训练过程&#xff0c;并解决现有方法需要大量调参或缺乏理论依据的问题。为此&#xff0…

【面试题】在 CSS 中,实现一个 div 中的子 div 水平垂直居中

1. 使用 Flexbox 特点&#xff1a;简单、直观&#xff0c;现代浏览器支持良好。 代码&#xff1a; css .parent {display: flex;justify-content: center; /* 水平居中 */align-items: center; /* 垂直居中 */height: 200px; /* 父容器需有高度 */ } .child {…

基于SpringBoot的失物招领平台(源码+数据库)

476基于SpringBoot的失物招领平台&#xff0c;有用户和管理员两个角色&#xff0c;主要功能如下 失物招领系统功能介绍如下&#xff1a; 1. 用户功能&#xff1a; - 发布失物公告&#xff1a;用户可以发布自己的失物信息 - 失物分类&#xff1a;用户可以根据失物的类型进行分类…

PyQt6实例_批量下载pdf工具_批量pdf网址获取

目录 前置&#xff1a; 步骤&#xff1a; step one 安装包 step two 获取股票代码 step three 敲代码&#xff0c;实现 step four 网址转pdf网址 视频 前置&#xff1a; 1 本系列将以 “PyQt6实例_批量下载pdf工具”开头&#xff0c;放在 【PyQt6实例】 专栏 2 本节讲…

量子退火与机器学习(2):少量实验即可找到新材料,黑盒优化➕量子退火

使用量子退火和因子分解机设计新材料 这篇文章是东京大学的一位博士生的毕业论文中的主要贡献。 结合了黑盒优化和量子退火&#xff0c;是融合的非常好的一篇文章&#xff0c;在此分享给大家。 https://journals.aps.org/prresearch/abstract/10.1103/PhysRevResearch.2.0133…

从零开始:Makefile 与 CMake 的基础入门与实践

本文适合基础学者 零基础 makefile 定义&#xff1a;Makefile 是一种传统的构建工具&#xff0c;用于定义如何编译和链接源代码。它通过一系列规则来描述如何生成目标文件&#xff08;如可执行文件或库&#xff09;。 功能&#xff1a;定义编译规则&#xff08;如如何从源文件…

android开启Sys V IPC,并使用共享内存编程

参考&#xff1a;安卓开启Sys V IPC&#xff0c;并使用共享内存编程 | 久奈浜的CS部 删除config中-# CONFIG_SYSVIPC is not set 在rk3576.config中增加CONFIG_SYSVIPCy CONFIG_SYSVIPCy CONFIG_SYSVIPC_SYSCTLy CONFIG_SYSVIPC_COMPATy CONFIG_IPC_NSy system/sepolicy/pre…

docker pull lss233/one-api:latest 在哪里运行,作用是什么

docker pull lss233/one-api:latest 在哪里运行,作用是什么 1. 在哪里运行? docker pull lss233/one-api:latest 是一个Docker命令,需在已安装Docker的环境中执行。 适用环境:本地开发机、服务器、云主机等。前提条件:需先安装Docker并配置好环境。2. 作用是什么? 该命令…

轮胎厂相关笔记

一、术语 图解&#xff1a;https://news.yiche.com/hao/wenzhang/38498703/ 1、胚胎 在轮胎制造行业中&#xff0c;“胎胚”&#xff08;也称“生胎”或“未硫化轮胎”&#xff09;是指轮胎在硫化&#xff08;高温高压固化&#xff09;之前的半成品形态。它是轮胎成型的中间…

开发者视角:应用程序中HTTP代理的集成指南

目录 一、为何需要HTTP代理&#xff1f; 二、集成方式分阶解析 三、关键配置管理策略 四、安全与性能平衡 五、调试与问题排查 六、最佳实践总结 结语 在开发需要与外部网络交互的应用程序时&#xff0c;HTTP代理是绕不开的实用工具。它既能解决网络限制问题&#xff0c…

从纸质到 AI 时代:我的笔记工具探索之旅

今天清晨&#xff0c;在得到上闲逛时&#xff0c;偶然间发现了一本名为《笔记的方法》的书&#xff0c;这本由Flomo的作者出版的图书&#xff0c;深入探讨了记笔记的艺术。 说起记笔记&#xff0c;这些年来&#xff0c;我尝试了各种各样的工具&#xff0c;今天就来梳理一下我的…

Ubuntu22云服务器添加2G Swap分区

Ubuntu22云服务器添加2G Swap分区 步骤 1&#xff1a;检查当前 Swap 和内存步骤 2&#xff1a;创建 2GB 的 Swap 文件步骤 3&#xff1a;设置权限并格式化步骤 4&#xff1a;启用 Swap 文件步骤 5&#xff1a;永久保留 Swap 配置可选优化&#xff1a;调整 Swappiness验证结果注…

网络空间安全(43)Linux实战篇

一、系统配置安全 BIOS安全设置 设置BIOS密码&#xff1a;防止未授权用户修改BIOS设置。修改引导次序&#xff1a;禁止从软盘启动系统&#xff0c;减少潜在的启动攻击风险。 文件系统权限管理 最小化SUID权限程序&#xff1a;SUID&#xff08;Set User ID&#xff09;程序以ro…

软件的常用设计模式。可参考一个一个学习

以下是软件设计中常见的 **23种经典设计模式**&#xff08;基于《设计模式&#xff1a;可复用面向对象软件的基础》GoF 的经典分类&#xff09;&#xff0c;并结合 **Python 语言特性**的简要说明和典型应用场景。我将它们分为 **创建型、结构型、行为型** 三大类&#xff0c;供…