ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Druid Spring Boot Starter 完全指南:连接池、监控与多数据源实战配置

Druid Spring Boot Starter 完全指南:连接池、监控与多数据源实战配置 数据库后端【免费下载链接】druid阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品为监控而生的数据库连接池项目地址https://gitcode.com/gh_mirrors/druid/druid点击查看免费下载Druid Spring Boot Starter 是阿里 Druid 数据库连接池官方提供的 Spring Boot 集成模块它让开发者可以零代码、纯配置地在一个 Spring Boot 项目中完成 Druid 连接池的装配、内置 Filter 的启用、Web 监控StatViewServlet / WebStatFilter与 Spring 方法级监控的接入并可通过DruidStatManagerFacade以编程方式获取全部监控数据。读完本文你将掌握依赖引入、配置属性全解、多数据源创建、Filter 定制与监控数据暴露的完整实战方案并能对照仓库源码理解其底层自动装配原理。一、模块定位与版本选择druid-spring-boot-starter的核心作用是借助 Spring Boot 的自动装配机制把 Druid 的连接池与监控能力无缝嵌入 Spring Boot 应用——开发者只需在配置文件中声明spring.datasource.druid.*属性无需手写任何装配代码。该模块适用于 Spring Boot 2.x。如果项目使用 Spring Boot 3.0 及以上版本应改用同仓库下的 druid-spring-boot-3-starter仓库中还提供了面向更新版本体系的 druid-spring-boot-4-starter。三个 starter 的配置方式与本文完全一致仅底层依赖的 Spring Boot 版本线不同。从源码结构看本模块的自动装配入口为 DruidDataSourceAutoConfigure.java它通过AutoConfigureBefore(DataSourceAutoConfiguration.class)保证在 Spring Boot 默认数据源装配之前生效并通过ConditionalOnProperty(name spring.datasource.type, havingValue com.alibaba.druid.pool.DruidDataSource, matchIfMissing true)声明只要 classpath 中存在DruidDataSource就默认接管数据源装配。这也是为什么引入 starter 后无需任何额外开关即可生效。二、快速开始引入依赖与最小配置1. 引入依赖Mavendependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.1.17/version /dependencyGradlecompile com.alibaba:druid-spring-boot-starter:1.1.17当前仓库中该模块的版本号可从 pom.xml 看到与 Druid 主版本保持一致示例中为1.2.29-SNAPSHOT。从该 pom 还可以看到模块自身的依赖构成Druid 核心包、spring-boot-autoconfigure、可选的spring-jdbc以及用于生成 IDE 配置元数据的spring-boot-configuration-processor这正是后文IDE 提示支持的实现基础。2. 最小配置spring.datasource.urljdbc:mysql://localhost:3306/demo spring.datasource.usernameroot spring.datasource.password123456 # ...其他配置可选不是必须的使用内嵌数据库的话上述三项也可省略不填提示由于 starter 会默认接管数据源装配如果你使用 H2 等内嵌数据库并配合 Spring Boot 自动探测上述三项连接参数可以完全省略。3. 配置属性名称的设计原则Druid Spring Boot Starter 的配置属性名称完全遵照 Druid 原生命名。你既可以用spring.datasource.druid.*前缀也可以直接使用 Spring Boot 标准的spring.datasource.*前缀。两者关系的底层实现在 DruidDataSourceWrapper.java 中非常清晰该类继承DruidDataSource并用ConfigurationProperties(spring.datasource.druid)绑定spring.datasource.druid.*配置在afterPropertiesSet()中如果spring.datasource.druid.*下未配置username/password/url/driver-class-name则回退使用 Spring Boot 标准spring.datasource.*前缀下的 JDBC 属性最终调用init()完成连接池初始化这也是为何注解上不直接设置initMethod而是把初始化时机放在afterPropertiesSet末尾避免构建期检查 bean 定义时触发初始化失败。因此spring.datasource.druid.url与spring.datasource.url是等价的前者优先后者作为兜底。三、配置属性全解含源码级默认值说明1. JDBC 配置spring.datasource.druid.url # 或spring.datasource.url spring.datasource.druid.username # 或spring.datasource.username spring.datasource.druid.password # 或spring.datasource.password spring.datasource.druid.driver-class-name # 或 spring.datasource.driver-class-name2. 连接池配置spring.datasource.druid.initial-size # 初始化时建立的物理连接数默认 0 spring.datasource.druid.max-active # 最大活跃连接数默认 8 spring.datasource.druid.min-idle # 最小空闲连接数默认 0 spring.datasource.druid.max-wait # 获取连接的最大等待毫秒数默认 -1不限制 spring.datasource.druid.pool-prepared-statements # 是否缓存 PreparedStatement默认 false spring.datasource.druid.max-pool-prepared-statement-per-connection-size # 每个连接上 PSCache 上限默认 10 spring.datasource.druid.max-open-prepared-statements # 与上面等价 spring.datasource.druid.validation-query # 校验 SQL如 SELECT 1 spring.datasource.druid.validation-query-timeout # 校验超时秒数 spring.datasource.druid.test-on-borrow # 借出连接时校验默认 false spring.datasource.druid.test-on-return # 归还连接时校验默认 false spring.datasource.druid.test-while-idle # 空闲时校验Druid 默认 true spring.datasource.druid.time-between-eviction-runs-millis # 空闲连接回收线程运行间隔毫秒默认 60000 spring.datasource.druid.min-evictable-idle-time-millis # 连接最小可回收空闲时间毫秒默认 30000 spring.datasource.druid.max-evictable-idle-time-millis # 连接最大可回收空闲时间毫秒默认 252000007 小时 spring.datasource.druid.filters # 配置多个内置 Filter英文逗号分隔如 stat,wall,slf4j ....//more以上所有属性的类型与默认值均来自核心类 DruidDataSource.java 的字段声明与DEFAULT_*常量如DEFAULT_MAX_ACTIVE 8、DEFAULT_INITIAL_SIZE 0、DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS 60_000L未配置的项一律采用这些默认值。需要特别说明的一个细节DruidDataSourceWrapper重写了setMaxEvictableIdleTimeMillis在maxEvictableIdleTimeMillis minEvictableIdleTimeMillis时不再立即抛异常而是先记录值、留待DruidDataSource#init()阶段统一校验——这是为了修复 issue #3084、#2763 而做的兼容处理自 1.1.14 起避免 Spring Boot 配置绑定顺序导致的启动失败。3. 监控配置# WebStatFilter 配置 spring.datasource.druid.web-stat-filter.enabled # 是否启用 WebStatFilter默认 false spring.datasource.druid.web-stat-filter.url-pattern # 过滤 URL 匹配规则默认 /* spring.datasource.druid.web-stat-filter.exclusions # 排除的静态资源默认 *.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/* spring.datasource.druid.web-stat-filter.session-stat-enable # 是否开启 session 统计 spring.datasource.druid.web-stat-filter.session-stat-max-count # 最大 session 统计数 spring.datasource.druid.web-stat-filter.principal-session-name # 统计 principal 时使用的 session 属性名 spring.datasource.druid.web-stat-filter.principal-cookie-name # 统计 principal 时使用的 cookie 名 spring.datasource.druid.web-stat-filter.profile-enable # 是否开启 profile 模式 # StatViewServlet 配置 spring.datasource.druid.stat-view-servlet.enabled # 是否启用 StatViewServlet监控页面默认 false出于安全考虑默认不启动启用时建议设置密码或白名单 spring.datasource.druid.stat-view-servlet.url-pattern # 监控页面访问路径默认 /druid/* spring.datasource.druid.stat-view-servlet.reset-enable # 是否允许重置统计 spring.datasource.druid.stat-view-servlet.login-username # 监控页面登录用户名 spring.datasource.druid.stat-view-servlet.login-password # 监控页面登录密码 spring.datasource.druid.stat-view-servlet.allow # 白名单 IP默认 127.0.0.1 spring.datasource.druid.stat-view-servlet.deny # 黑名单 IP # Spring 监控配置 spring.datasource.druid.aop-patterns # Spring 监控 AOP 切入点如 x.y.z.service.*多个用英文逗号分隔监控配置的默认值并非凭空而来可以从自动装配源码中得到印证DruidStatViewServletConfiguration.java 在spring.datasource.druid.stat-view-servlet.enabledtrue时注册StatViewServletURL 默认映射/druid/*且默认白名单仅放行127.0.0.1DruidWebStatFilterConfiguration.java 在spring.datasource.druid.web-stat-filter.enabledtrue时注册WebStatFilter默认排除*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*等静态资源DruidSpringAopConfiguration.java 只要检测到spring.datasource.druid.aop-patterns配置即生效使用DruidStatInterceptor配合RegexpMethodPointcutAdvisor对匹配的方法进行拦截统计若spring.aop.autofalse还会额外注册DefaultAdvisorAutoProxyCreator保证切面生效。4. 配置格式与扩展能力配置文件既可以用.properties也可以用.yml效果一致在配置项较多的情况下推荐.yml层次结构更清晰。Druid Spring Boot Starter 不仅限于上述属性。凡是 DruidDataSource.java 中提供了setter方法的可配置属性如keep-alive、remove-abandoned、fail-fast、connection-properties等都可以通过spring.datasource.druid.xxx形式进行配置。由于DruidDataSourceWrapper本身就是ConfigurationProperties(spring.datasource.druid)的绑定目标Spring Boot 会把所有以该前缀开头的松绑定属性写入对应 setter因此配置能力与 Druid 原生完全对齐。四、多数据源配置实战1. 配置继承机制多数据源场景下Druid 支持配置继承 逐级覆盖的写法spring.datasource.urljdbc:mysql://localhost:3306/demo spring.datasource.usernameroot spring.datasource.password123456 # Druid 数据源配置继承 spring.datasource.* 配置相同则覆盖 spring.datasource.druid.initial-size5 spring.datasource.druid.max-active5 # Druid 数据源 1 配置继承 spring.datasource.druid.* 配置相同则覆盖 spring.datasource.druid.one.max-active10 spring.datasource.druid.one.max-wait10000 # Druid 数据源 2 配置继承 spring.datasource.druid.* 配置相同则覆盖 spring.datasource.druid.two.max-active20 spring.datasource.druid.two.max-wait20000强烈注意Spring Boot 2.X 版本不再支持配置继承多数据源场景下每个数据源的完整配置都需要单独声明否则配置不会生效。也就是说上面示例中druid.one若想使用initial-size5必须在druid.one.initial-size5中显式声明。2. 通过 DruidDataSourceBuilder 创建数据源Primary Bean ConfigurationProperties(spring.datasource.druid.one) public DataSource dataSourceOne(){ return DruidDataSourceBuilder.create().build(); } Bean ConfigurationProperties(spring.datasource.druid.two) public DataSource dataSourceTwo(){ return DruidDataSourceBuilder.create().build(); }从 DruidDataSourceBuilder.java 源码可以看到create().build()实际返回的正是DruidDataSourceWrapper它继承自DruidDataSource并实现了afterPropertiesSet的初始化逻辑因此每个数据源都会独立完成配置绑定与init()。源码中还保留了一个Deprecated的build(Environment env, String prefix)方法那是为了兼容 Spring Boot 1.X 中.properties配置按声明顺序绑定的问题issue #1796而设计使用.yml或 Spring Boot 2.0 时无需使用。仓库的测试用例 DruidMultiDataSourceTestCase.java 以及 MultiDataSourceConfigurer.java 演示了多数据源从配置到注入的完整链路可直接作为参考。五、Filter 定制从快捷开关到细粒度配置1. 两种启用方式方式一快捷方式通过spring.datasource.druid.filtersstat,wall,log4j以英文逗号分隔启用多个内置 Filter。注意这些 Filter 都是默认配置只能解决有/无的问题。方式二细粒度配置当默认配置无法满足需求时放弃filters快捷方式改用spring.datasource.druid.filter.*进行逐项配置# 配置 StatFilter spring.datasource.druid.filter.stat.enabledtrue spring.datasource.druid.filter.stat.db-typeh2 spring.datasource.druid.filter.stat.log-slow-sqltrue spring.datasource.druid.filter.stat.slow-sql-millis2000 # 配置 WallFilter spring.datasource.druid.filter.wall.enabledtrue spring.datasource.druid.filter.wall.db-typeh2 spring.datasource.druid.filter.wall.config.delete-allowfalse spring.datasource.druid.filter.wall.config.drop-table-allowfalse # 其他 Filter 配置不再演示关键规则要想使自定义 Filter 配置生效必须将对应 Filter 的enabled设置为true。Druid Spring Boot Starter 默认禁用 StatFilter需要监控统计时必须显式开启。2. 受支持的 Filter 清单目前以下 8 个 Filter 获得了开箱即用的配置支持前缀均为spring.datasource.druid.filter.*可参考 IDE 提示逐项配置StatFilter—— SQL 统计WallFilter—— SQL 防火墙其下还有config.*子配置对应WallConfigConfigFilter—— 配置解密EncodingConvertFilter—— 编码转换Slf4jLogFilter—— slf4j 日志Log4jFilter—— Log4j 日志Log4j2Filter—— Log4j2 日志CommonsLogFilter—— Commons Logging 日志3. 源码视角Filter 如何被装配DruidFilterConfiguration.java 展示了每个 Filter 的装配模式以 StatFilter 为例Bean ConfigurationProperties(FILTER_STAT_PREFIX) // spring.datasource.druid.filter.stat ConditionalOnProperty(prefix FILTER_STAT_PREFIX, name enabled) ConditionalOnMissingBean public StatFilter statFilter() { return new StatFilter(); }即只有当filter.stat.enabledtrue时才创建对应 Bean且通过ConfigurationProperties把filter.stat.*下的属性绑定到 Filter 实例若用户已自行声明同类型 Bean则ConditionalOnMissingBean保证不重复装配。WallFilter 略有特殊——它依赖WallConfig完成config.*子配置的绑定并通过filter.setConfig(wallConfig)注入。装配好的 Filter 最终通过DruidDataSourceWrapper.autoAddFilters(ListFilter)自动挂载到连接池上该方法为Autowired(requiredfalse)见 DruidDataSourceWrapper.java。六、以 JSON 方式暴露 Druid 监控数据Druid 的监控数据在开启 StatFilter 后可通过DruidStatManagerFacade编程获取Druid 自带的监控系统数据也来源于此。下面演示如何在 Spring Boot 中通过 HTTP 接口将监控数据以 JSON 形式暴露出去实际使用中你可以按需扩展监控维度与暴露方式。RestController public class DruidStatController { GetMapping(/druid/stat) public Object druidStat(){ // DruidStatManagerFacade#getDataSourceStatDataList 该方法可以获取所有数据源的监控数据 // 除此之外 DruidStatManagerFacade 还提供了一些其他方法你可以按需选择使用。 return DruidStatManagerFacade.getInstance().getDataSourceStatDataList(); } }接口返回的 JSON 示例H2 数据源运行一段时间后的真实快照含连接池、SQL 执行、PSCache、事务等全量统计[ { Identity: 1583082378, Name: DataSource-1583082378, DbType: h2, DriverClassName: org.h2.Driver, URL: jdbc:h2:file:./demo-db, UserName: sa, FilterClassNames: [ com.alibaba.druid.filter.stat.StatFilter ], WaitThreadCount: 0, NotEmptyWaitCount: 0, NotEmptyWaitMillis: 0, PoolingCount: 2, PoolingPeak: 2, PoolingPeakTime: 1533782955104, ActiveCount: 0, ActivePeak: 1, ActivePeakTime: 1533782955178, InitialSize: 2, MinIdle: 2, MaxActive: 30, QueryTimeout: 0, TransactionQueryTimeout: 0, LoginTimeout: 0, ValidConnectionCheckerClassName: null, ExceptionSorterClassName: null, TestOnBorrow: true, TestOnReturn: true, TestWhileIdle: true, DefaultAutoCommit: true, DefaultReadOnly: null, DefaultTransactionIsolation: null, LogicConnectCount: 103, LogicCloseCount: 103, LogicConnectErrorCount: 0, PhysicalConnectCount: 2, PhysicalCloseCount: 0, PhysicalConnectErrorCount: 0, ExecuteCount: 102, ErrorCount: 0, CommitCount: 100, RollbackCount: 0, PSCacheAccessCount: 100, PSCacheHitCount: 99, PSCacheMissCount: 1, StartTransactionCount: 100, TransactionHistogram: [ 55, 44, 1, 0, 0, 0, 0, 0 ], ConnectionHoldTimeHistogram: [ 53, 47, 3, 0, 0, 0, 0, 0 ], RemoveAbandoned: false, ClobOpenCount: 0, BlobOpenCount: 0, KeepAliveCheckCount: 0, KeepAlive: false, FailFast: false, MaxWait: 1234, MaxWaitThreadCount: -1, PoolPreparedStatements: true, MaxPoolPreparedStatementPerConnectionSize: 5, MinEvictableIdleTimeMillis: 30001, MaxEvictableIdleTimeMillis: 25200000, LogDifferentThread: true, RecycleErrorCount: 0, PreparedStatementOpenCount: 1, PreparedStatementClosedCount: 0, UseUnfairLock: true, InitGlobalVariants: false, InitVariants: false } ]对这份输出可以重点解读几组监控指标连接池水位PoolingCount当前池中连接数、PoolingPeak历史峰值、ActiveCount活跃连接数、ActivePeak活跃峰值反映连接池的实时压力与历史峰值连接获取与释放LogicConnectCount逻辑连接创建次数、LogicCloseCount、LogicConnectErrorCount、NotEmptyWaitCount/NotEmptyWaitMillis获取连接等待次数与等待耗时用于判断是否存在连接池饥饿SQL 执行ExecuteCount、ErrorCount、CommitCount、RollbackCount、StartTransactionCount反映业务负载与事务行为PSCachePSCacheAccessCount、PSCacheHitCount、PSCacheMissCount用于评估 PreparedStatement 缓存命中率直方图TransactionHistogram与ConnectionHoldTimeHistogram分别给出事务耗时与连接持有耗时的分布。仓库演示代码中的 DruidStatController.java 提供了可运行的同款实现测试用例 DruidDataSourceTestCase.java 与 DruidFilterTestCase.java 则验证了数据源与 Filter 的装配结果可作为集成验证的参考。七、IDE 提示支持由于模块在 pom.xml 中引入了spring-boot-configuration-processor注解处理器编译时会自动生成spring-configuration-metadata.json配置元数据。因此在 IntelliJ IDEA 等 IDE 中编写application.properties/application.yml时输入spring.datasource.druid.即可获得完整的属性名提示、默认值与描述说明几乎不可能写错属性名。这也是官方建议通过 IDE 输入提示来进行配置的原因。八、运行演示与测试仓库在src/test目录下提供了完整的可运行 Demo位于 druid-spring-boot-starter/src/test克隆仓库后直接运行 test 包内的DemoApplicationDemoApplication.javaDemo 基于 H2 内嵌数据库 Spring Data JPA 构建配合testcase包下的数据源、Filter、多数据源等测试用例可以一键观察 Druid 在 Spring Boot 中的完整装配行为通过 HTTP 访问监控接口即可看到上文展示的 JSON 监控数据。九、参考与延伸阅读模块英文说明README_EN.md核心连接池实现DruidDataSource.java所有可配置属性的 setter 与默认值来源自动装配入口DruidDataSourceAutoConfigure.java配置属性类DruidStatProperties.java监控与安全相关仓库根目录下的 monitoring-guide.md 与 wall-security-guide.mdSpring Boot 3 及以上版本请参考 druid-spring-boot-3-starter、druid-spring-boot-4-starter本文覆盖了从依赖引入、单数据源/多数据源配置、Filter 定制到监控数据暴露的完整链路对于更复杂的场景如 SQL 防火墙规则细化、配置解密、KeepAlive 保活等均可在上述源码路径中找到对应的属性入口与实现逻辑按同样的spring.datasource.druid.*规范进行配置即可。赞分享数据库后端【免费下载链接】druid阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品为监控而生的数据库连接池项目地址https://gitcode.com/gh_mirrors/druid/druid点击查看免费下载相关推荐dynamic-datasource连接池监控实战Spring Boot Admin深度配置指南dynamic datasource连接池监控实战Spring Boot Admin深度配置指南 dynamic datasource作为Spring Boo后端数据库终极指南Spring Boot Admin监控多数据源的完整配置方案终极指南Spring Boot Admin监控多数据源的完整配置方案 在现代Spring Boot应用开发中多数据源管理和实时监控是保障系统稳定性的关键环节后端数据库终极指南Spring Boot多数据源监控实战轻松掌握连接池健康状态终极指南Spring Boot多数据源监控实战轻松掌握连接池健康状态 在现代Spring Boot应用开发中多数据源管理已成为企业级项目的标配需求。动态数后端数据库上一篇从代码到收益Qbot量化交易机器人的完整贡献指南下一篇Flet中的主题切换实现深色模式与浅色模式的动态切换创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表