Spring Boot2.X-整合druid+mysql

本文详细介绍了如何在SpringBoot项目中集成并配置Druid数据源,包括数据源的基本配置、监控页面的添加以及相关过滤器的设置。通过示例代码展示了如何在`application.yaml`中配置数据源参数,并创建了`DruidConfig`配置类以启用Druid监控功能。同时,还提供了测试用例以验证配置的有效性。

目录

1.项目结构

2.代码

3.集成效果


源码下载:https://download.youkuaiyun.com/download/adam_zs/28993988icon-default.png?t=L892https://download.youkuaiyun.com/download/adam_zs/28993988

注意:application.yaml文件中配置数据源和druid的参数都要放在spring.datasource下边,要不然启动项目会报错!

1.项目结构

 

2.代码

spring:
  datasource:
    username: root
    password: 123456
    url: jdbc:mysql://xxx.xxx.xxx.xxx:3306/sakila?serverTimezone=UTC&useUnicode=true@characterEncoding=utf-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

    #Spring Boot 默认是不注入这些属性值的,需要自己绑定
    #druid 数据源专有配置
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: true

    #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
    #如果允许时报错  java.lang.ClassNotFoundException: org.apache.log4j.Priority
    #则导入 log4j 依赖即可,Maven 地址: https://mvnrepository.com/artifact/log4j/log4j
    filters: stat,wall,log4j
    maxPoolPreparedStatementPerConnectionSize: 20
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

    
package com.wangzs.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Servlet;
import javax.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class DruidConfig {
	@ConfigurationProperties(prefix = "spring.datasource")
	@Bean
	public DataSource druidDataSource() {
		return new DruidDataSource();
	}

	@Bean
	public ServletRegistrationBean druidServletRegistrationBean() {
		ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(),
				"/druid/*");
		Map<String, String> initParams = new HashMap<>();
		initParams.put("loginUsername", "admin");
		initParams.put("loginPassword", "123456");
		// 后台允许谁可以访问
		// initParams.put("allow", "localhost"):表示只有本机可以访问
		// initParams.put("allow", ""):为空或者为null时,表示允许所有访问
		initParams.put("allow", "");
		// deny:Druid 后台拒绝谁访问
		// initParams.put("msb", "192.168.1.20");表示禁止此ip访问

		servletRegistrationBean.setInitParameters(initParams);
		return servletRegistrationBean;
	}

	// 配置 Druid 监控 之 web 监控的 filter
	// WebStatFilter:用于配置Web和Druid数据源之间的管理关联监控统计
	@Bean
	public FilterRegistrationBean webStatFilter() {
		FilterRegistrationBean bean = new FilterRegistrationBean();
		bean.setFilter(new WebStatFilter());

		// exclusions:设置哪些请求进行过滤排除掉,从而不进行统计
		Map<String, String> initParams = new HashMap<>();
		initParams.put("exclusions", "*.js,*.css,/druid/*");
		bean.setInitParameters(initParams);

		// "/*" 表示过滤所有请求
		bean.setUrlPatterns(Arrays.asList("/*"));
		return bean;
	}
}
package com.wangzs;

import javax.sql.DataSource;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.jdbc.core.JdbcTemplate;

import com.alibaba.druid.pool.DruidDataSource;

@SpringBootTest
class StudySpringBootJdbcApplicationTests {

	@Autowired
	private DruidDataSource druidDataSource;

	@Autowired
	private JdbcTemplate jdbcTemplate;

	@Test
	public void test_jdbcTemplate() {
		DataSource dataSource = jdbcTemplate.getDataSource();
		System.out.println("==test_jdbcTemplate==" + dataSource);
	}

	@Test
	public void test_druid() {
		System.out.println("==druidDataSource.getInitialSize()==" + druidDataSource.getInitialSize());
		System.out.println("==druidDataSource.getMaxActive()==" + druidDataSource.getMaxActive());
	}
}

3.集成效果

 

 

 

 

Properties检查语法:server.port=9012 spring.application.name=saas-base # logback logging.config=classpath:saas-logback.xml logPath=/app/lds-pxp/${spring.application.name}/logs logging.maxHistory=30 #\u670D\u52A1\u6CE8\u518C\u4E2D\u5FC3,\u96C6\u7FA4\u591A\u4E2A\u6709\u9017\u53F7\u5206\u5272 spring.profiles.active=prod spring.cloud.nacos.discovery.server-addr=192.168.88.130:9848 spring.cloud.nacos.config.server-addr=${spring.cloud.nacos.discovery.server-addr} spring.main.allow-bean-definition-overriding=true #spring.cloud.nacos.config.file-extension=properties #spring.cloud.nacos.config.shared-configs[0]=application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} spring.redis.host=192.168.88.130 spring.redis.port=6379 spring.redis.password=123456 spring.redis.database=15 spring.datasource.druid.stat-view-servlet.enabled=true spring.datasource.druid.stat-view-servlet.loginUsername=admin spring.datasource.druid.stat-view-servlet.loginPassword=123456 spring.datasource.dynamic.druid.initial-size=5 spring.datasource.dynamic.druid.min-idle=5 spring.datasource.dynamic.druid.maxActive=20 spring.datasource.dynamic.druid.maxWait=60000 spring.datasource.dynamic.druid.timeBetweenEvictionRunsMillis=60000 spring.datasource.dynamic.druid.minEvictableIdleTimeMillis=300000 spring.datasource.dynamic.druid.validationQuery=SELECT 1 FROM DUAL spring.datasource.dynamic.druid.testWhileIdle=true spring.datasource.dynamic.druid.testOnBorrow=false spring.datasource.dynamic.druid.testOnReturn=false spring.datasource.dynamic.druid.poolPreparedStatements=true spring.datasource.dynamic.druid.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.dynamic.druid.filters=stat,slf4j spring.datasource.dynamic.druid.connectionProperties=druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.dynamic.datasource.master.url=jdbc:mysql://192.168.88.130:3306/dev_base?useUnico
最新发布
04-01
<think>好的,我现在需要帮助用户检查他们提供的配置文件中的语法问题。首先,我得仔细阅读用户提供的配置内容,逐行检查是否有明显的语法错误或配置错误。 首先,用户给出的配置看起来像是一个Spring Boot应用的配置文件,可能是application.properties或类似的。常见的配置项包括服务器端口、应用名称、日志设置、Nacos服务发现、Redis和数据库连接等。 让我从第一个部分开始检查: 1. `server.port=9012`:这个看起来没问题,指定了端口号,没有语法问题。 2. `spring.application.name=saas-base`:应用名称配置正确。 3. 注释`# logback`,没问题。 4. `logging.config=classpath:saas-logback.xml`:指定日志配置文件,路径正确。 5. `logPath=/app/lds-pxp/${spring.application.name}/logs`:这里使用了属性占位符,应该没问题,但需要注意实际路径是否存在,不过语法上是对的。 6. `logging.maxHistory=30`:日志保留天数,正确。 接下来是服务注册中心的配置: 7. `spring.profiles.active=prod`:激活prod环境,正确。 8. `spring.cloud.nacos.discovery.server-addr=192.168.88.130:9848`:Nacos服务发现的地址,端口是9848,需要注意Nacos的默认端口是8848,用户可能在这里写错了。9848是用于gRPC的端口,而通常服务发现使用8848,这可能是一个潜在的问题点。 9. `spring.cloud.nacos.config.server-addr=${...}`:引用了上面的地址,同样需要注意端口是否正确。 10. `spring.main.allow-bean-definition-overriding=true`:允许Bean覆盖,语法正确。 接下来是Redis配置: 11. `spring.redis.host=192.168.88.130`:正确。 12. `spring.redis.port=6379`:正确。 13. `spring.redis.password=123456`:正确。 14. `spring.redis.database=15`:正确,但需要确认数据库是否存在。 数据库连接池的配置部分: 15. `spring.datasource.druid.stat-view-servlet.enabled=true`:正确。 16. `spring.datasource.druid.stat-view-servlet.loginUsername=admin`:正确。 17. `spring.datasource.druid.stat-view-servlet.loginPassword=123456`:正确。 18. `spring.datasource.dynamic.druid.initial-size=5`:动态数据源配置,注意这里可能属于动态数据源插件(如dynamic-datasource-spring-boot-starter),配置项是否正确。例如,`initial-size`是否是Druid的正确属性,或者是否应该放在`spring.datasource.druid`下。这里用户可能混淆了动态数据源和Druid的配置层级。正确的路径可能应该是`spring.datasource.dynamic.druid.initial-size`,如果该starter支持这样的配置,那没问题,否则可能需要调整。 19. 类似的,后续的`min-idle`, `maxActive`等属性,同样需要确认配置路径是否正确。 20. `spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver`:正确。 21. `spring.datasource.dynamic.datasource.master.url=jdbc:mysql://192.168.88.130:3306/dev_base?useUnico`:这里发现URL不完整,`useUnico`应该是`useUnicode=true&characterEncoding=utf8`之类的,存在拼写错误或者未完成的情况。这是明显的语法问题,导致配置不完整,应用启动时可能会报错。 接下来,用户提供的配置在最后一行突然结束,可能是在复制时遗漏了后面的内容,比如`useUnicode`的参数和后续的其他配置项,如用户名和密码是否缺失。例如,通常数据库URL还会包括其他参数,并且应该有`username`和`password`的设置,但在用户的配置中没有看到,这可能是一个大问题。 此外,检查是否有未闭合的引号或特殊字符未转义。例如,在`connectionProperties`中使用了`\=`来转义等号,这在属性文件中是正确的,因为等号不需要转义,但用户可能想表达的是属性中的等号,这里是否正确?例如`druid.stat.mergeSql=true`,实际上应该使用`druid.stat.mergeSql=true`,不需要转义,但用户写成了`druid.stat.mergeSql\=true`,这里的反斜杠可能导致解析错误,因为属性文件中键值对是用等号分隔的,如果键中包含等号,可能需要转义,但Druid的配置中应该直接写值部分,所以这里的转义符可能多余,导致配置错误。 总结可能的问题点: 1. Nacos的server-addr端口可能是错误的,应该检查是否为8848。 2. 数据库URL不完整,`useUnico`后面缺少内容,需要补充完整。 3. 动态数据源配置项是否正确,比如`spring.datasource.dynamic.druid`是否是正确的配置前缀,还是应该放在`spring.datasource.druid`下。 4. 检查`connectionProperties`中的转义符是否正确。 5. 确保数据库配置的username和password是否存在,用户提供的配置中似乎缺失了这些关键信息,比如`spring.datasource.dynamic.datasource.master.username`和`password`。 现在,我需要将这些潜在的问题整理出来,用清晰的结构告诉用户,并指出如何修正。特别是数据库URL不完整和缺失的数据库凭证,这会导致应用无法启动,需要优先处理。另外,Nacos的端口问题也需确认。</think>以下是对配置文件的语法检查及问题分析,按优先级排序: --- ### **1. 严重错误:数据库连接URL不完整** ```properties spring.datasource.dynamic.datasource.master.url=jdbc:mysql://192.168.88.130:3306/dev_base?useUnico ``` - **问题**:URL 参数 `useUnico` 未完整,应为 `useUnicode=true&characterEncoding=utf-8`。 - **修复**: ```properties spring.datasource.dynamic.datasource.master.url=jdbc:mysql://192.168.88.130:3306/dev_base?useUnicode=true&characterEncoding=utf8 ``` --- ### **2. 缺失关键配置项:数据库用户名和密码** - **问题**:未配置数据库的用户名和密码,导致连接失败。 - **修复**:补充以下配置: ```properties spring.datasource.dynamic.datasource.master.username=您的数据库用户名 spring.datasource.dynamic.datasource.master.password=您的数据库密码 ``` --- ### **3. 潜在配置问题:Nacos 服务端口** ```properties spring.cloud.nacos.discovery.server-addr=192.168.88.130:9848 ``` - **问题**:Nacos 默认服务端口为 `8848`,`9848` 是 gRPC 端口(仅用于 2.x 版本客户端通信)。 - **建议**: - 若使用 Nacos 1.x,端口应改为 `8848`。 - 若使用 Nacos 2.x 且启用了 gRPC,需同时开放 `9848` 和 `8848` 端口。 --- ### **4. 转义符问题:Druid 连接属性** ```properties spring.datasource.dynamic.druid.connectionProperties=druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 ``` - **问题**:属性文件中的等号 `=` 无需转义,反斜杠 `\` 会导致解析错误。 - **修复**: ```properties spring.datasource.dynamic.druid.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 ``` --- ### **5. 动态数据源配置层级问题** 配置项前缀为 `spring.datasource.dynamic.druid`,但通常 Druid 配置应位于 `spring.datasource.druid`。需确认是否使用了动态数据源插件(如 `dynamic-datasource-spring-boot-starter`),其配置规范为: ```properties # 动态数据源配置示例 spring.datasource.dynamic.datasource.master.driver-class-name=... spring.datasource.dynamic.datasource.master.url=... spring.datasource.dynamic.druid.initial-size=5 # 此处配置可能无效 ``` - **建议**:将 Druid 通用配置移至 `spring.datasource.druid`,例如: ```properties spring.datasource.druid.initial-size=5 spring.datasource.druid.min-idle=5 ``` --- ### **其他注意事项** 1. **日志路径权限**:确保 `/app/lds-pxp/...` 目录存在且应用有写入权限。 2. **Redis 数据库验证**:确认 Redis 的 `database=15` 是否存在。 3. **Nacos 配置中心**:检查注释掉的 `spring.cloud.nacos.config.shared-configs` 是否需要启用。 --- **总结建议**:优先修复数据库 URL 和补充用户名密码,其次检查 Nacos 端口及 Druid 配置层级。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值