在使用Druid时候遇到的坑

本文深入解析使用Druid连接池时常见的配置错误,包括@ConfigurationProperties与@ConfigurationProperty的区别,以及application.yml中datasource配置项的正确书写方式,避免因注释错误导致的数据统计功能失效。

在使用Druid时候遇到的坑

注释错误

错误示范

//将配置再application.yml文件中的datasource起来并且注入到容器中
    @ConfigurationProperty(prefix = "spring.datasource")
    @Bean()
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }

正确示范

//将配置再application.yml文件中的datasource起来并且注入到容器中
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean()
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }

分析:
注释错了,一个是ConfigurationProperty,另一个是ConfigurationProperties,两者是完全不同的,当时我是靠代码的补全去选择,然后我花了好久的时间才发现这里,我事后去找这个注释竟然找不到了,巨坑!!!

application配置文件的坑

错误示范:

spring:
  datasource:
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/spring_boot?serverTimezone=UTC
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      filters: stat,wall

正确示范

spring:
  datasource:
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/spring_boot?serverTimezone=UTC
    type: com.alibaba.druid.pool.DruidDataSource
    filters: stat,wall

分析:
配置出错,一开始我去查看该版本的源码,发现DataSourceProperties的配置类里面竟然没有filters这个属性,然后我就是用了druid下面的filters,结果显然而知,在druid的后台中,sql这些数据一个都没统计,然后我抱着瞎来的心态把filters直接写在datasource下面竟然成功了,我现在还是不理解为什么明明没有这个属性却能起到作用?巨坑!!!
下面是DataSourceProperties的部分源码,哪里有什么filters???
在这里插入图片描述

<think> 嗯,这个问题是关于ShardingSphere和Druid数据源配置关系的深入探讨。用户之前询问过用sharding实现多租户分表的可行性,现在转向了具体配置层面的问题:是否必须通过ShardingSphere配置数据源,能否保留原有独立的Druid配置。 从引用内容来看,用户应该是个有经验的开发者: - 引用[1]和[3]都提到Druid配置冗余问题,说明用户关注代码简洁性 - 引用[4]涉及源码改造,表明用户有底层探索能力 - 上下文显示用户已整合MyBatis/SpringBoot等技术栈 用户的真实诉求其实是:能否重复配置,直接复用现有Druid数据源?这背后可能隐藏两个痛点: 1. 配置冗余:需在ShardingSphere里重新定义Druid参数 2. 监控失效:如引用[3]提到的SQL监控丢失问题 仔细分析技术实现路径: - 关键矛盾点在于ShardingSphere的初始化机制(引用[3]源码分析) - 必须通过sharding.datasource配置主容器,但可通过Bean注入复用Druid配置 - 引用[2]的动态数据源管理能力很契合用户需求 需要特别注意的: - 配置覆盖顺序问题(如引用[3]遇到的HikariDataSource覆盖Druid) - 监控页集成时需要特殊处理Filter注册 解决方案要突出: 1. 配置复用技巧(避免重复写Druid参数) 2. 监控恢复方案(解决SQL监控丢失) 3. 动态扩展可能(引用[2]的集群模式价值) </think> 在 ShardingSphere 中使用 **独立 Druid 数据源配置完全可行**,且能避免冗余配置。以下是具体实现方案和注意事项: --- ### 🔧 一、两种配置模式对比 | **配置方式** | **配置位置** | 适用场景 | 优势 | |----------------------|-------------------------------|-----------------------------|-----------------------------| | **Sharding 托管配置** | `shardingsphere.datasource` 节点 | 全新项目 | 自动管理数据源生命周期[^2] | | **独立 Druid 配置** | `spring.datasource.druid` 节点 | 已有 Druid 配置的项目 | 复用原有监控/加密等高级功能[^3] | --- ### ✅ 二、复用独立 Druid 配置的方法 #### 1. 配置示例 (`application.yml`) ```yaml # 独立 Druid 配置 (原有配置) [^3] spring: datasource: druid: db0: url: jdbc:mysql://db0:3306/db username: root password: pass initial-size: 5 filters: stat,wall # 启用监控功能 db1: url: jdbc:mysql://db1:3306/db ... # ShardingSphere 引用已存在的数据源 [^1][^4] shardingsphere: datasource: names: db0, db1 # 直接复用 spring.datasource.druid 定义的 Bean # 无需重复配置连接参数! ``` #### 2. 关键说明 - **自动注入机制**: ShardingSphere 会优先使用 Spring 容器中已有的 `DataSource` Bean(如 `db0`, `db1`),避免重复创建[^4] - **保留 Druid 特性**: 监控页 (`/druid`)、SQL 防火墙、加密等功能完全保留[^3] --- ### ️ 三、避指南 #### 1. 配置冲突场景 ```yaml # ❌ 错误配置 (重复定义) shardingsphere: datasource: db0: # 此处会新建数据源,覆盖 Spring 的 Druid 配置[^3] url: jdbc:mysql://db0_new:3306/db ... ``` **现象**: - Druid 监控失效(实际使用的是 ShardingSphere 新建的 `HikariDataSource` 而非 `DruidDataSource`)[^3] **解决方案**: 删除 `shardingsphere.datasource` 下的子节点配置,仅保留 `names` 声明[^1][^4] #### 2. 动态数据源场景 若需动态增减数据源(如 Cluster 模式[^2]): ```java @Autowired private DataSource dataSource; // ShardingSphere 动态路由数据源 void addNewDataSource() { DruidDataSource newDs = new DruidDataSource(); // 新建 Druid 数据源 newDs.setUrl(...); ((ShardingSphereDataSource) dataSource).getContextManager() .addDataSource("db2", newDs); // 动态注入 } ``` --- ### 💎 四、最佳实践推荐 1. **已有 Druid 项目** ```yaml # 步骤: # 1. 保留 spring.datasource.druid 完整配置 # 2. ShardingSphere 仅声明 names shardingsphere: datasource: names: db0, db1 # 直接复用 ``` 2. **全新项目** ```yaml # 统一用 ShardingSphere 管理(简化配置) shardingsphere: datasource: db0: type: com.alibaba.druid.pool.DruidDataSource # 显式指定型[^3] url: ... filters: stat,wall # 启用监控 ``` --- ### 总结 | **场景** | 推荐方案 | |---------------------------|-----------------------------| | 已有 Druid 配置项目 | ✅ 独立配置 + `names` 引用 | | 全新项目 | ✅ Sharding 托管 + 显式声明 `type` | | 需动态增减数据源 | ✅ Cluster 模式 API[^2] | > **关键结论**: > ShardingSphere **强制**在自身配置中定义数据源细节,通过复用 Spring 容器的 `DataSource` Bean,可无缝集成独立 Druid 配置并保留其全部特性[^1][^3][^4]。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值