SpringBoot配置Druid

简介: SpringBoot配置Druid

1.新建一个springboot项目,建好之后别忘记yml中配置启动端口

#启动端口

server:

 port: 8088

配置好之后,验证看下是否正常,写个测试类

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
@RequestMapping("/test")
public class TestController {
    @RequestMapping("/helloWord")
    public String HelloWord(){
        System.out.println("hello java");
        return "hello java";
    }
}

2.启动项目

显示刚刚自己设置的端口号,启动成功,然后访问下看看是否正常

OK,启动和访问都没有问题。

3.引入对应的依赖包,版本的话看个人需求 我用的是2.2.4,数据库我用的是postgresql

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
<dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
<!--引入druid starter-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.16</version>
        </dependency>
 
 <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.16</version>
        </dependency>

4.配置application.yml

#启动端口
server:
  port: 8088
 
 
#druid细节配置可以写在yml中,也可以代码实现。我这版是代码实现的
 
spring:
  datasource:
    url: 连接地址
    username: 账号
    password: 密码
    driver-class-name: org.postgresql.Driver
    type: com.alibaba.druid.pool.DruidDataSource #切换为druid

5.配置DruidConfiguration

 
import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import lombok.extern.slf4j.Slf4j;
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.sql.DataSource;
import java.sql.SQLException;
import java.util.*;
 
/**
 * SpringBoot配置Druid
 */
 
 
@Slf4j
@Configuration
public class DruidConfiguration {
 
    @ConfigurationProperties("spring.datasource")
    @Bean
    public DataSource druidDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        try {
            // 启动程序时,在连接池中初始化多少个连接(10-50已足够)
            dataSource.setInitialSize(50);
            // 回收空闲连接时,将保证至少有 minIdle 个连接(与 initialSize 相同)
            dataSource.setMinIdle(50);
            // 连接池中最多支持多少个活动会话
            dataSource.setMaxActive(10000);
            // 程序向连接池中请求连接时,超过 maxWait 的值后,认为本次请求失败,即连接池,没有可用连接,单位毫秒,设置 -1 时表示无限等待(建议值为100)
            dataSource.setMaxWait(100);
            /*
                缓存通过以下两个方法发起的 SQL:
                public PreparedStatement prepareStatement(String sql)
                public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
                (建议值为 true)
             */
            dataSource.setPoolPreparedStatements(true);
            // 每个连接最多缓存多少个 SQL(建议值为 20)
            dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
            // 检查空闲连接的频率,单位毫秒,非正整数时表示不进行检查(建议值:2000)
            dataSource.setTimeBetweenEvictionRunsMillis(2000);
            // 连接池中某个连接的空闲时长达到 N 毫秒后, 连接池在下次检查空闲连接时,将回收该连接,要小于防火墙超时设置 net.netfilter.nf_conntrack_tcp_timeout_established 的设置
            dataSource.setMinEvictableIdleTimeMillis(600000);
            // 配置一个连接在池中最大生存的时间,单位是毫秒
            dataSource.setMaxEvictableIdleTimeMillis(900000);
            // 程序没有 close 连接且空闲时长超过 minEvictableIdleTimeMillis,则会执行 validationQuery 指定的 SQL,以保证该程序连接不会池 kill 掉,其范围不超过 minIdle 指定的连接个数(建议值为 true)
            dataSource.setKeepAlive(true);
            // 检查池中的连接是否仍可用的 SQL 语句,druid 会连接到数据库执行该 SQL,如果正常返回,则表示连接可用,否则表示连接不可用
            dataSource.setValidationQuery("SELECT 1");
            // 当程序请求连接,池在分配连接时,是否先检查该连接是否有效(高效,并且保证安全性;建议值为 true)
            dataSource.setTestWhileIdle(true);
            // 程序申请连接时,进行连接有效性检查(低效,影响性能;建议值为 false)
            dataSource.setTestOnBorrow(false);
            // 程序返还连接时,进行连接有效性检查(低效,影响性能;建议值为 false)
            dataSource.setTestOnReturn(false);
            // 物理连接初始化的时候执行的 sql
//            Collection<String> connectionInitSqls = new ArrayList<>(10);
//            connectionInitSqls.add("SELECT 1 FROM DUAL");
//            dataSource.setConnectionInitSqls(connectionInitSqls);
            /*
                这里配置的是插件,常用的插件有:
                监控统计:stat
                日志监控:log4j2
                防御 SQL 注入:wall
             */
            dataSource.setFilters("stat,log4j2");
            // 是否合并多个 DruidDataSource 的监控数据
            dataSource.setUseGlobalDataSourceStat(true);
            // 监控统计
            // 是否启用慢 SQL 记录
            dataSource.addConnectionProperty("druid.stat.logSlowSql", "true");
            // 执行时间超过 slowSqlMillis 的就是慢,单位毫秒(建议值 500)
            dataSource.addConnectionProperty("druid.stat.slowSqlMillis", "500");
            // 要求程序从池中 get 到连接后,N 秒后必须 close,否则 druid 会强制回收该连接,不管该连接中是活动还是空闲,以防止进程不会进行 close 而霸占连接(建议值为 false,当发现程序有未正常 close 连接时设置为 true)
//            dataSource.setRemoveAbandoned(false);
            // 设置 druid 强制回收连接的时限,当程序从池中 get 到连接开始算起,超过此值后,druid将强制回收该连接,单位秒(应大于业务运行最长时间)
//            dataSource.setRemoveAbandonedTimeout();
            // 当 druid 强制回收连接后,是否将 stack trace 记录到日志中(建议值为 true)
//            dataSource.setLogAbandoned(true);
            // 连接属性。比如设置一些连接池统计方面的配置 druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
//            dataSource.setConnectProperties();
 
            // 防御 SQL 注入
            WallFilter wallFilter = new WallFilter();
            WallConfig config = new WallConfig();
            // 是否允许执行 DELETE 语句(建议值为 false)
            config.setDeleteAllow(false);
            // 是否允许删除表(建议值为 false)
            config.setDropTableAllow(false);
            wallFilter.setConfig(config);
 
            // 插件代理
            List<Filter> proxyFilters = new ArrayList<>(10);
            proxyFilters.add(wallFilter);
            dataSource.setProxyFilters(proxyFilters);
 
        } catch (SQLException e) {
            log.error(e.toString());
        }
        return dataSource;
    }
 
    @Bean
    public ServletRegistrationBean<StatViewServlet> statViewServlet() {
        // 监控信息显示页面
        StatViewServlet statViewServlet = new StatViewServlet();
        // 访问监控信息显示页面的 url 路径(建议值为 /druid/* )
        String urlPattern = "/druid/*";
 
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(statViewServlet, urlPattern);
 
        Map<String, String> initParams = new HashMap<>();
        // 是否允许清空统计数据
        initParams.put("resetEnable", "false");
        // 登录监控信息显示页面的用户名
        initParams.put("loginUsername", "admin");
        // 登录监控信息显示页面的密码
        initParams.put("loginPassword", "admin");
        // 允许访问控制(格式:ip地址、ip地址/子网掩码位数)逗号分隔多个地址
        initParams.put("allow", "127.0.0.1");
        // 拒绝访问控制(格式:ip地址、ip地址/子网掩码位数)逗号分隔多个地址
//        initParams.put("deny", "");
 
        bean.setInitParameters(initParams);
        return bean;
    }
 
    @Bean
    public FilterRegistrationBean<WebStatFilter> webStatFilter() {
        FilterRegistrationBean<WebStatFilter> bean = new FilterRegistrationBean<>();
        // 网络监控过滤器(用于采集 web-jdbc 关联监控的数据)
        bean.setFilter(new WebStatFilter());
        // 过滤所有的 url 路径
        Collection<String> urlPatterns = new ArrayList<>();
        urlPatterns.add("/*");
        bean.setUrlPatterns(urlPatterns);
 
        Map<String, String> initParams = new HashMap<>();
        // 排除不必要采集的 url 路径,以逗号“,”分割
        initParams.put("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,*.map,/druid/*");
        // 是否使用 session 监控功能
        initParams.put("sessionStatEnable", "true");
        // 是否使用 session 监控最大数量(默认是1000)
        initParams.put("sessionStatMaxCount", "1000");
        // 使得 druid 能够知道当前的 session 的用户是谁,根据需要,把改值修改为你 user 信息保存在 session 中的 sessionName
        initParams.put("principalSessionName", "session_user_key");
        // 如果你的 user 信息保存在 cookie 中,你可以配置 principalCookieName,使得 druid 知道当前的 user 是谁,根据需要,把该值修改为你 user 信息保存在 cookie 中的 cookieName
        initParams.put("principalCookieName", "cookie_user_key");
        // 是否监控单个 url 调用的 sql 列表
        initParams.put("profileEnable", "true");
        bean.setInitParameters(initParams);
        return bean;
    }
}

6.验证下连接数据库是否正常

新建表,写入数据(这些我就不一一阐述了)。同学们可以自己操作下。

我的项目结构

我找了一张表,写一个Controller我们查下看看是否可以正常查询

 
 
import com.yun.greedy.modules.staff.entity.yUser;
import com.yun.greedy.modules.staff.service.StaffService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.List;
 
@RestController
@RequestMapping("/staff")
public class StaffController {
 
    @Autowired
    private StaffService staffService;
 
    @RequestMapping("/list")
    public String list() {
        List<yUser> list = staffService.getBaseMapper().selectList(null);
        list.forEach(System.out::println);
        return "查询完成";
    }
}

验证连接数据库查询成功!

7.查看Druid的监控信息

登录此地址http://localhost:8088/druid/login.html

账号密码是ServletRegistrationBean中的配置admin        admin

登录成功之后就可以查看各种的监控信息了

对于Druid连接池自带的监控,主要包括以下几个方面:

监控数据统计:Druid连接池内置了丰富的监控指标,可以统计连接池的使用情况、连接池的性能指标、SQL执行情况等。通过Druid的监控数据统计,可以方便地了解连接池的状态和性能。

SQL监控:Druid连接池可以记录SQL执行的详细信息,包括SQL语句、执行时间、执行结果等。通过Druid的SQL监控,可以方便地分析和优化SQL语句的性能。

防火墙功能:Druid连接池内置了防火墙功能,可以对SQL进行实时的监控和过滤,防止恶意的SQL攻击。

监控界面:Druid连接池提供了一个Web界面,可以直观地查看连接池的状态和性能指标,方便进行监控和管理。

好了,到这里就是完成了,有兴趣的同学可以自己尝试一下呃。更强大的功能可以参考下官网


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
6月前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
1055 0
|
3月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
377 3
|
4月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
679 5
|
4月前
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
225 0
探索Spring Boot的@Conditional注解的上下文配置
|
10月前
|
缓存 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
1110 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
|
5月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
1119 10
|
10月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
1300 0
|
10月前
|
Java 测试技术 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
181 0
|
10月前
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
959 0
|
6月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
1275 1