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

一次实时数据链路丢数排查:从 MQTT 队列积压到 SQL 统计开销 本文通过一次实时数据链路压测,排查了从MQTT到ClickHouse的端到端数据丢失问题。核心方法是为每条消息添加序号,建立独立观察点(MQTT订阅端、Kafka消费者),结合转发服务阶段统计与线程栈分析,定位到下游处理速度不足源于Druid SQL合并统计的高开销。优化措施包括关闭SQL合并、扩容代理队列、增强生产侧失败处理,并验证15分钟内实现全链路对账一致,显著缓解积压与丢包。关键收获:数据可对账、明确各阶段“成功”定义、关注客户端队列状态。 阅读详情

生产级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.yml


spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://selectdb-cluster:9030/prod_db?useSSL=false&useServerPrepStmts=true
    username: ${SELECTDB_USER}
    password: ${SELECTDB_PWD}
    driver-class-name: com.mysql.jdbc.Driver
    druid:
      initial-size: 5
      max-active: 50
      min-idle: 5
      max-wait: 60000
      validation-query: SELECT 1
      test-while-idle: true
      time-between-eviction-runs-millis: 60000

mybatis-plus:
  configuration:
    cache-enabled: true
    default-executor-type: REUSE
  global-config:
    db-config:
      logic-delete-field: deleted
      logic-not-delete-value: 0
      logic-delete-value: 1

management:
  endpoints:
    web:
      exposure:
        include: health,metrics,prometheus



@Configuration
@EnableCaching
public class SelectDBConfig {
    
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

    @Bean
    public RedissonClient redissonClient() {
        Config config = new Config();
        config.useSingleServer()
              .setAddress("redis://redis-cluster:6379")
              .setConnectionMinimumIdleSize(10)
              .setConnectionPoolSize(64);
        return Redisson.create(config);
    }

    @Bean
    public 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 {
    
    @Autowired
    private RedissonClient redissonClient;
    
    @Cacheable(value = "userCache", key = "#id")
    @Override
    public 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 {
    
    @Autowired
    private DataSource dataSource;

    @Override
    public 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案例新开文章些!!

Mac电脑本地安装Stable Diffusion小白教程避开所有坑教程 如果出现黄字部分警告,如WARNING: The scripts pip, pip3 and pip3.9 are installed inz‘/usr/local/opt/python@3.9/Frameworks/Python.framework/Versions/3.9/bin’ which is not on PATH)需要将其添加到path。下载pip,输入:curl https://bootstrap.pypa.io/pip/get-pip.py -o get-pip.py。 阅读详情

相关推荐

告别重复劳动:用Python+pywinauto打造你的微信个人助理(自动回复/收款/定时发消息)

本文介绍如何利用Python和pywinauto库构建微信个人助手,实现自动回复、定时消息、智能收款等功能,告别重复劳动。通过详细的代码示例和配置指南,帮助开发者快速掌握微信自动化技术,提升工作效率。

weixin_42568801的博客 328

Spring Boot Mybatis 整合

本项目使用的环境: 开发工具:Intellij IDEA 2017.1.3jdk:1.7.0_793.maven:3.3.9 额外功能 PageHelper 分页插件mybatis generator 自动生成代码插件 步骤: 1.创建一个springboot项目: 2.创建项目的文件结构以及jdk的版本 3.选择项目所需要的

往事随风@的博客 645

400G光模块测试全攻略:从PCS层到CMIS合规的避坑指南

本文为网络设备测试工程师和光通信研发人员提供了一份详尽的400G光模块测试实战指南。文章深入剖析了从PCS层信号完整性、FEC容限到CMIS管理接口合规性测试的全流程,并分享了ANLT协议分析、SerDes眼图调试以及系统级流量压力测试中的核心技巧与常见避坑点,旨在帮助读者构建一套高效、精准的测试体系,确保高速光模块的可靠性与性能。

weixin_29300931的博客 210

50倍性能飞跃!Spring Boot+Doris Stream Load海量数据实时更新方案

本文介绍了一个基于Spring Boot的Doris数据库流式加载方案。系统采用分层架构设计,包含配置管理、核心加载、实体映射和业务服务等模块。通过@DorisField注解实现自动化字段映射,支持字段重命名、排序和忽略等特性。核心类DorisStreamLoader提供并行处理、分批加载、GZIP压缩和指数退避重试机制,显著提升数据加载性能。方案采用LinkedHashMap保持字段顺序,内置智能缓存优化反射性能,并通过详细的响应监控确保数据可靠性。性能测试表明,相比传统JDBC方式可提升20-50倍吞吐

shitou的博客 1639

如何用YOLOv5改进无人机小目标检测?MFFSODNet实战教程(附代码)

本文详细介绍了如何利用YOLOv5框架结合MFFSODNet网络结构优化无人机航拍图像中的小目标检测。通过引入微小目标预测头、多尺度特征提取模块(MSFEM)和双向密集特征金字塔网络(BDFPN)等核心技术,显著提升了小目标检测精度。文章提供了完整的代码实现方案,并展示了在农业监测、电力巡检等实际场景中的应用效果。

sre5engineer的博客 738

正交试验minitab

1.创建正交试验 2.根据自己的实验选择水平数和因子数,并选定一个正交表 3.得到正交表 4.填写实验结果 5.进行正交分析 点击结果,点击分析 6.得到分析结果 7.方差分析 选择响应变量与因子,点击确定 得到方差分析的结果 ...

a999999123的博客 1万+

MybatisPlus

是基于Mybatis框架基础上开发的增强型工具,旨在简化开发、提高效率。

qq_61338849的博客 632

AUTOSAR-SOMEIP配置总结

导入arxml之后someip信号一般以“pduSomeIp”开头或者“SomeIp”开头。以某个pdu为例,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。在导入arxml之后someip信号中有三个特殊的信号,形如“SdInstance”开头的信号,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。“EcuC”模块主要关注“EcucPduCollection”中的“Pdus”下面的配置。

xiandang8023的博客 4652

MyBatis基础入门《二》Select查询

MyBatis基础入门《二》Select查询   使用MySQL数据库,创建表: 1 SET NAMES utf8mb4; 2 SET FOREIGN_KEY_CHECKS = 0; 3 4 -- ---------------------------- 5 -- Table structure for tbl_client_copy1 6 -- ----...

a281412785的博客 128

数据挖掘实战-基于LSTM时间序列模型的香烟销售预测分析

本文介绍了基于LSTM时间序列模型的香烟销售预测分析实验。实验背景为烟草市场竞争激烈,企业需提高销售预测准确性以优化生产、库存和营销策略。LSTM模型因其处理长序列数据的能力被选为预测工具。实验步骤包括数据准备、特征工程、模型构建、训练与评估及结果分析。数据集来自某市门店的销售数据,技术工具为Python 3.9和Jupyter Notebook。实验过程涵盖数据导入、预处理、产品销售与区域销售分析、销售预测(包括销售额、销量、利润及海通店销售额预测)。

m0_64336780的博客 8951

特殊通信领域场景应用:基于Simulink的数字预失真(DPD)算法仿真建模示例

增益压缩:高功率输入时输出信号的增益下降。相位失真:输入信号的相位随功率变化而改变。带外干扰:非线性失真会引入额外的频谱分量,影响邻道信号。多项式模型:用多项式拟合功率放大器的非线性特性。查找表(LUT):通过离线训练生成预失真映射表。自适应算法:实时调整预失真参数以动态补偿失真。发送端:生成随机比特流并调制为射频信号。预失真模块:对输入信号进行预失真处理。功率放大器模块:模拟非线性失真。接收端:解调信号并评估误码率(BER)。

xiaoheshang_123的博客 272

Flink 学习日志 03:自定义一个SourceFunction,完成对Redis中数据的读取

本文介绍了在Flink中自定义SourceFunction读取Redis数据的完整流程:通过Jedis客户端连接WSL2中的Redis服务,编写RedisSource实现循环读取所有Key-value并逐条输出,结合Thread.sleep()实现每秒一条的流式效果。关键步骤包括环境准备、添加Jedis依赖、配置IDEA运行时加载provided依赖,并注意生产环境中应避免使用阻塞的keys *,改用scan命令。最终实现动态读取、实时打印,验证了Flink与Redis的数据集成能力。

木木的学习笔记 412

IT:银行类金融科技岗笔试习题集合—四个模块包括【综合知识+EPI+英语+个性测评】持续更新,建议收藏

IT:银行类金融科技岗笔试习题集合—四个模块包括【综合知识+EPI+英语+个性测评】 导读:行测、综合知识、英语和性格测试。综合知识,包括货币学、金融、会计、计算机等内容。  行政能力测试,内容大家可以参考公务员考试,包括逻辑推理、数字推理、图形推理、文字推理。英语测试,包括语法和词汇30题、完型填空20题、10篇阅读理解50题,阅读理解文章特别长,生词特别多。 (1)、英语可以Ctrl+F...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 2万+

Day3 - Flink 窗口与时间语义:从滚动窗口到迟到数据处理

水位线是一个特殊的时间戳,代表"小于这个时间戳的数据都已经到齐了比如水位线推进到 10:00:05,就告诉 Flink:10:00:05 之前的数据应该都到了,如果还有晚于这个时间到达但时间戳小于 10:00:05 的数据,就是"迟到数据"。窗口大小固定,窗口之间不重叠,数据只属于一个窗口。时间线: 0 10 20 30 40 50 60窗口1: [--------)窗口2: [--------)窗口3: [--------)窗口4: [--------)

YEEMOLY的博客 244

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

智能问诊的流程

本文介绍基于FastAPI构建的医疗多Agent系统MediAgent,通过症状分析、诊断推理与治疗建议等模块协同,实现从问诊到报告生成的完整工作流。系统采用前后端分离架构,结合MySQL、RabbitMQ与Docker实现工程化部署,支持异步化验结果接入。虽当前状态暂存于内存,但已具备可扩展性,未来可通过Redis持久化、消息队列联动及医疗安全机制完善,应用于慢病管理、辅助决策等场景,推动AI在医疗流程中的落地应用。

Joey 的工作空间~ 535

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

行业研究报告采购避坑指南:从需求拆解到机构选型的实操逻辑

先说结论:买行业研究报告这件事,坑不在“哪家便宜”,而在“你拿到的数据能不能回答你的问题”。作为一个经常帮企业做采购决策的顾问,我见过太多花了几万块买回一堆PDF却用不上的案例。这篇文章把采购流程拆成五步,每一步告诉你该看什么、该避什么,尽量帮你少交学费。

2601_96585642的博客 221

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深入浅出聊聊 Linux 的 PageCache 与系统极致性能

本文深入浅出解析了 Linux PageCache 的核心机制,揭示其如何通过“延迟写、预读读”提升系统性能。以监控告警为切入点,阐明 free -h 中 buff/cache 并非真正占用,真正可用内存由 available 决定。结合 Kafka、Elasticsearch、MySQL 等实战场景,说明中间件如何依赖 PageCache 实现极致性能。强调不可手动清理缓存,并建议合理调优脏页参数,避免卡顿。最终指出:内存满≠危机,而是系统高效运行的体现。

小小默:进无止境 334

代购系统改造:服务无状态化、分级隔离

代购系统因链路长、流量脉冲、写放大等特点,高可用设计需聚焦“消灭单点”。通过服务无状态化、分级隔离、数据库与消息队列容灾、监控告警与混沌工程验证,实现MTTR降至3分钟内,支付成功率超99.9%。核心经验:缓存雪崩防于过期策略,跨地域用短TTL GeoDNS,支付降级必须幂等。高可用本质是持续检验“无单点”假设的闭环体系。

2601_95706522的博客 161

ubuntu安装hadoop系统

本文详细介绍了基于VMware克隆虚拟机搭建三节点Hadoop分布式集群的全过程:使用同一Ubuntu镜像克隆出master、worker1、worker2三台虚拟机,依次配置主机名、固定IP(如192.168.82.10/11/12)、SSH服务及免密登录,确保节点间网络互通。随后安装Java,下载配置Hadoop并分发至各节点,最终初始化启动集群,验证其存储与计算功能,实现高效的大数据环境部署。

qq_43592674的博客 326

Elasticsearch:稠密向量字段类型

dense_vector字段用于存储稠密向量,支持k近邻搜索(kNN),默认启用索引并使用余弦相似度。可接受浮点数数组或Base64编码字符串输入,支持自动量化(如int8、int4、bbq)以降低内存占用。通过index_options配置索引类型(如hnsw、bbq_disk),并可启用过采样与重新评分提升精度。向量默认不存储于_source中以节省空间,可通过fields或_source.exclude_vectors显式返回。支持bit向量及GPU加速索引,适用于高维向量场景。

Elastic 中国社区官方博客 260

【消息队列】ACK确认了什么:消息队列可靠投递的完整链路

本文剖析消息系统中ACK机制在生产者、Broker、消费者三段链路中的作用,指出即使三段确认均正确配置,系统仍只能提供“至少一次”可靠性。原因在于重试、崩溃、重平衡等场景会导致重复投递,而“恰好一次”需依赖业务侧幂等性保障。关键结论:ACK仅保证不丢,不重复需靠唯一键、去重表或状态机等业务设计实现。

2503_94545876的博客 691

Day2 - Flink DataStream API 与转换算子:从 Source 到 Sink

实现或@Override// 发射数据@Override// 使用用自定义逻辑聚合,比 sum/min/max 更灵活。// 求每个用户的总消费金额reduce 的输入和输出类型必须相同。Flink 会把满足条件的相邻算子合并成一个 Task,在同一个线程里执行,减少线程切换和网络开销。合并条件上下游并行度相同;分区策略是 Forward;没有被用户手动断开。

YEEMOLY的博客 143

kafka指定分区消费

【代码】kafka指定分区消费。

hy_208的博客 53

数据科学与大数据技术专业有哪些比较好考的证书?

如果目前还没有明确方向,建议先完成Python与SQL基础学习,再选择一张与目标岗位最接近的证书。不要为了增加简历条目,在同一阶段同时准备多个不同技术方向。以数据分析方向为例,可以参考2025版CDA证书大纲安排基础学习:先掌握业务数据结构、数据库应用和统计分析,再进入指标体系、看板和用户分析。具备一定项目经验后,再学习二级涉及的统计检验、模型评估及数据治理。2025版教材介绍强调了思维、技术和实践的结合,适合用于组织学习;2027年的具体考试范围、报名条件和安排,则应依据届时发布的信息制定计划。

YangYang9YangYan的博客 308

如何在用户认证系统中使用 ElasticSearch 提升

本文介绍了如何在一个典型的企业级应用——用户认证与权限管理系统内引入并运用 ElasticSearch 技术来提高查找效率并降低数据库负载压力。读者可以通过了解其基础架构原理、正确配置方式以及典型应用场景从而掌握该工具的基本用法。如果你正在寻找一种更灵活高效的检索方案用于自己的项目当中,请考虑从以下几个方面入手实践: 1. 确认是否有必要引入新的全文搜索引擎;2. 设计好适用于该项目的数据模型以及索引规则;3. 持续优化你的 DSL 查询语句并监控运行状态;

wuchangjian的专栏 172

Flink SQL 窗口表值函数实战:滚动、滑动、累计与会话窗口

在 Flink SQL 中,流数据是无限的,要统计“最近一段时间”的数据,就必须把无界流切分成一个个有界窗口。Flink 1.13 之后引入了窗口表值函数(Window TVF),把窗口本身当作一张表来使用,通过TABLE(...)语法把原表转换成带窗口信息的表,再配合GROUP BY完成聚合。相比早期的语义统一:窗口是一张表,可以像普通表一样查询、过滤、关联。结果可读:窗口表会自动带上window_end三个字段,方便直接输出。性能更好:底层基于窗口聚合算子优化,支持切片共享等机制。

2401_83857914的博客 324
上一篇: SpringBoot整合Smart Doc
下一篇: 用例图讲解
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值