当前位置: 首页 > news >正文

Spring Boot 3 + MyBatis-Plus + SelectDB整合方案

生产级Spring Boot 3 + MyBatis-Plus + SelectDB整合方案,满足高并发、高可用、高性能要求的完整实现:

pom.xml<?xml version="1.0" encoding="UTF-8"?>
<project><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.5</version></parent><dependencies><!-- SelectDB核心依赖 --><dependency><groupId>com.selectdb</groupId><artifactId>selectdb-jdbc-driver</artifactId><version>2.0.12</version></dependency><!-- Spring Boot基础组件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- MyBatis-Plus增强组件 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.2</version></dependency><!-- 连接池与监控 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.18</version></dependency><!-- 其他生产级组件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.2</version></dependency></dependencies>
</project>application.ymlspring:datasource:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://selectdb-cluster:9030/prod_db?useSSL=false&useServerPrepStmts=trueusername: ${SELECTDB_USER}password: ${SELECTDB_PWD}driver-class-name: com.mysql.jdbc.Driverdruid:initial-size: 5max-active: 50min-idle: 5max-wait: 60000validation-query: SELECT 1test-while-idle: truetime-between-eviction-runs-millis: 60000mybatis-plus:configuration:cache-enabled: truedefault-executor-type: REUSEglobal-config:db-config:logic-delete-field: deletedlogic-not-delete-value: 0logic-delete-value: 1management:endpoints:web:exposure:include: health,metrics,prometheus@Configuration
@EnableCaching
public class SelectDBConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}@Beanpublic RedissonClient redissonClient() {Config config = new Config();config.useSingleServer().setAddress("redis://redis-cluster:6379").setConnectionMinimumIdleSize(10).setConnectionPoolSize(64);return Redisson.create(config);}@Beanpublic CacheManager cacheManager(RedissonClient redissonClient) {return new RedissonSpringCacheManager(redissonClient);}
}public interface BaseMapperExt<T> extends BaseMapper<T> {@Select("${sql}")List<Map<String, Object>> selectByDynamicSQL(@Param("sql") String sql);@Update("${sql}")int executeUpdate(@Param("sql") String sql);@Options(useGeneratedKeys = true, keyProperty = "id")@Insert("${sql}")int executeInsert(@Param("sql") String sql);
}@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Autowiredprivate RedissonClient redissonClient;@Cacheable(value = "userCache", key = "#id")@Overridepublic User getByIdWithCache(Long id) {return getById(id);}@Override@Transactional(rollbackFor = Exception.class)public boolean batchInsertWithPipe(List<User> users) {RLock lock = redissonClient.getLock("batch_insert_lock");try {lock.lock(10, TimeUnit.SECONDS);// 使用SelectDB Pipe特性批量写入String pipeSQL = "INSERT INTO user VALUES " + users.stream().map(u -> String.format("(%d,'%s')", u.getId(), u.getName())).collect(Collectors.joining(","));return baseMapper.executeUpdate(pipeSQL) > 0;} finally {lock.unlock();}}
}@Component
public class SelectDBHealthIndicator implements HealthIndicator {@Autowiredprivate DataSource dataSource;@Overridepublic Health health() {try (Connection conn = dataSource.getConnection()) {boolean valid = conn.isValid(5);return valid ? Health.up().build() : Health.down().withDetail("error", "Connection test failed").build();} catch (Exception e) {return Health.down(e).build();}}
}

代码说明:

  1. 架构设计:采用分层架构,集成MyBatis-Plus增强CRUD能力,通过Druid连接池管理SelectDB连接
  2. 性能优化:配置连接池参数/二级缓存/批量管道写入,Redisson实现分布式锁
  3. 高可用保障:健康检查机制/连接有效性验证/事务管理
  4. 扩展能力:动态SQL支持/自定义Mapper扩展/缓存集成
  5. 生产级特性:指标监控暴露/Prometheus集成/连接泄漏防护

关键实现要点:

  1. 使用Druid连接池配置合理的连接数(建议max-active=50~100)
  2. 通过@Cacheable实现查询结果缓存,减轻SelectDB压力
  3. 批量操作采用SelectDB Pipe特性提升写入性能
  4. 通过Redisson实现分布式锁保证数据一致性
  5. 暴露/actuator端点用于监控系统健康状态

CacheManager开启的是Spring框架管理的应用级缓存,其核心原理如下:

  1. 缓存主体:
  • 管理的是Spring应用声明式缓存(@Cacheable等注解标注的方法返回值)
  • 通过AOP代理实现,默认使用Spring的Cache Abstraction层
  1. 工作原理:
  • 代理拦截:对@Cacheable注解方法生成代理
  • 缓存键生成:根据方法参数生成唯一缓存key
  • 缓存解析:通过CacheResolver确定具体缓存实现
  • 存储策略:委托给具体缓存实现(如Redis、Caffeine等)
  1. 典型实现:
  • 本地缓存:CaffeineCacheManager/EhCacheCacheManager
  • 分布式缓存:RedisCacheManager/HazelcastCacheManager
  • 混合缓存:支持多级缓存策略
  1. 关键特性:
  • 缓存一致性:通过@CacheEvict维护
  • 条件缓存:支持unless/condition参数
  • 自动过期:依赖底层缓存实现
  • 线程安全:由具体缓存库保证

方案中,配置的RedissonSpringCacheManager就是将缓存存储在Redis集群中,实现分布式缓存能力。

SelectDBHealthIndicator是一个自定义的健康检查组件,用于监控SelectDB数据库连接状态。它的主要功能是:

  1. 作用:
  • 集成Spring Boot Actuator的健康检查端点
  • 定期验证SelectDB数据库连接可用性
  • 在/actuator/health端点中暴露数据库健康状态
  • 当连接异常时标记服务为DOWN状态
  1. 依赖的jar包:
  • 必须依赖:spring-boot-starter-actuator(提供健康检查框架)
  • 间接依赖:spring-boot-starter-jdbc(数据源支持)
  • 可选依赖:micrometer-core(如需对接监控系统)
  1. 典型应用场景:
  • 生产环境数据库监控
  • Kubernetes就绪探针(Readiness Probe)
  • 负载均衡健康检查
  • 运维监控大盘数据采集

该组件通常作为生产级应用的基础设施层组件,与Druid连接池配合使用效果更佳。

生产上actuator + prometheus案例新开文章些!!

http://www.dtcms.com/a/394254.html

相关文章:

  • xtuoj 0x05-B Colombian Number
  • elasticsearch8.1.0 中聚合功能的执行链路
  • WindowTop:提升工作效率的窗口管理工具
  • 每天新增1000万条订单,如何选择合适的数据库?
  • LLaVA模型学习-周报十四
  • LwIP 1.4.0 移植到 uCOSII 参考
  • 【LeetCode 每日一题】3541. 找到频率最高的元音和辅音
  • Arithmetics Competition(贪心+排序+前缀和)
  • 运维安全07 ,JumpServer(堡垒机)介绍以及使用
  • 数据结构算法学习:LeetCode热题100-双指针篇(移动零、盛水最多的容器、三数之和、接雨水)
  • 2025年ESWA SCI1区TOP,复杂威胁环境下带偏差采样的多无人机路径规划、候选物评估与路径重构问题,深度解析+性能实测
  • SeaTunnel 迁移 MySQL 数据到 Easysearch 之批量导入(Batch)
  • JavaWeb 课堂笔记 —— 19 SpringBootWeb案例 文件上传
  • 《时空回响--时之鳞》的现代意义与2025年的现实映射
  • Qwen3Next注意力机制详解与实现
  • .net 8自包含应用发布在Linux怎么运行
  • 第十七周 学习周报
  • 手眼标定问题总结
  • 第一章 假设二:走势是时间信息序列
  • MLP全连接网络
  • 任天堂GBA游戏ROM分类精选合集 GBA工具、GBA模拟器分享 GBA金手指全集+GBA转换器
  • STM32光强传感器实验详解
  • 基于单片机的数字电压表设计
  • 搜索百科(3):Elasticsearch — 搜索界的“流量明星”
  • 【嵌入式】CAN协议学习笔记
  • NeurIPS 2025 spotlight |FSDrive 自动驾驶迈向视觉推理
  • Linux系统编程--进程信号
  • 数据结构代码整理
  • 软件开发测试的W模型:构建高质量产品的坚实蓝图
  • 【OpenGL】LearnOpenGL学习笔记26 - 视差贴图 Parallax Map