SpringBoot使用Druid连接池 + 配置监控页面(自定义版 + starter版)
目录
- 1. Druid连接池的功能
- 2. 自定义版
- 2.1 pom.xml添加依赖
- 2.2 MyDataSourceConfig实现
- 2.3 application.properties配置
- 编写Controller进行测试
- 2.4 druid监控页面查看
- 3. starter版
- 3.1 pom.xml添加依赖
- 3.2 自动配置分析
- 3.3 使用application.properties对druid进行配置
- 3.4 druid配置参考
1. Druid连接池的功能
全方位监控、防SQL注入攻击等
2. 自定义版
2.1 pom.xml添加依赖
添加druid连接池的依赖,如下所示:
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.15</version></dependency>
2.2 MyDataSourceConfig实现
说明如下:
- @ConfigurationProperties(prefix = “spring.datasource”)注解,将以spring.datasource开头的配置和DataSource类进行绑定,就可以在application.properties对DataSource的属性进行设置了
- druidDataSource.setFilters(“stat,wall”):开启SQL监控、SQL防火墙功能
- 向IOC容器添加ServletRegistrationBean组件,开启druid监控功能。设置了druid监控的访问页面是/druid/*;也设置了登录监控页面的账号和密码
- 向IOC容器添加FilterRegistrationBean组件,开启Web应用菜单功能,让druid进行Web应用的统计。设置了统计的Web URL和排除的Web URL
package com.hh.springboottest.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.sql.DataSource;
import java.sql.SQLException;
import java.util.Arrays;@Configuration
public class MyDataSourceConfig {// 将application.properties中spring.datasource前缀对应的值赋值给DataSource类属性@ConfigurationProperties(prefix = "spring.datasource")@Beanpublic DataSource dataSource() {DruidDataSource druidDataSource = new DruidDataSource();try {// 开启SQL监控菜单功能,让druid进行SQL的执行统计// 开启SQL防火墙菜单功能druidDataSource.setFilters("stat,wall");} catch (SQLException e) {e.printStackTrace();}return druidDataSource;}// 向IOC容器添加ServletRegistrationBean组件,开启druid监控功能@Beanpublic ServletRegistrationBean statViewServlet() {StatViewServlet statViewServlet = new StatViewServlet();ServletRegistrationBean<StatViewServlet> servletRegistrationBean =// druid监控的访问页面是/druid/*new ServletRegistrationBean<>(statViewServlet, "/druid/*");// 开启监控页面的访问登录账号和密码servletRegistrationBean.addInitParameter("loginUsername", "druid");servletRegistrationBean.addInitParameter("loginPassword", "123456");return servletRegistrationBean;}// 开启Web应用菜单功能,让druid进行Web应用的统计@Beanpublic FilterRegistrationBean webStatFilter() {WebStatFilter webStatFilter = new WebStatFilter();FilterRegistrationBean<WebStatFilter> filterRegistrationBean =new FilterRegistrationBean<>(webStatFilter);// 设置统计的Web URLfilterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));// 设置排除的Web URLfilterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");return filterRegistrationBean;}}
2.3 application.properties配置
在代码中可以对DataSource进行各种配置参数的set,也可以在application.properties中对durid连接池进行配置,如下所示:
# 最好注释HikariDataSource
# spring.datasource.type=com.zaxxer.hikari.HikariDataSourcespring.datasource.filters=stat,wall
spring.datasource.max-active=12
编写Controller进行测试
package com.hh.springboottest.myController;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;import javax.sql.DataSource;@Slf4j
@RestController
public class HelloController {@Autowiredprivate JdbcTemplate jdbcTemplate;@AutowiredDataSource dataSource;@ResponseBody@GetMapping("/queryFromDb")public String queryFromDb() {Long userCount = jdbcTemplate.queryForObject("select count(*) from user", Long.class);// 返回的结果是:数据库连接池类型为class com.alibaba.druid.pool.DruidDataSourcelog.info("数据库连接池类型为{}", dataSource.getClass());return userCount.toString();}}
2.4 druid监控页面查看
访问http://localhost:8080/druid/index.html,页面效果如下:
其中数据源菜单在RestController等进行了调用才有结果显示
其中SQL监控页面如下。
SQL监控项上,执行时间、读取行数、更新行数都有区间分布,将耗时分布成8个区间:
- 耗时0到1毫秒的次数
- 耗时1到10毫秒的次数
- 耗时10到100毫秒的次数
- 耗时100到1000毫秒的次数
- 耗时1到10秒的次数
- 耗时10到100秒的次数
- 耗时100到1000秒的次数
- 耗时1000秒以上的次数
耗时区间分布提供了“执行+RS时分布”,是将执行时间+ResultSet持有时间合并监控,这个能方便诊断返回行数过多的查询
3. starter版
首先注释上面MyDataSourceConfig的@Configuration注解,或者删除MyDataSourceConfig.java文件。开始进行starter版的开发
3.1 pom.xml添加依赖
添加druid-spring-boot-starter的依赖;和添加spring-boot-starter-aop,用于druid监控页的Spring监控菜单。如下所示:
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.15</version></dependency><!-- 导入SprngBoot的aop的Starter,用于druid监控页的Spring监控菜单 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
可以看到自动添加了druid、spring-boot-autoconfiguration依赖
3.2 自动配置分析
查看druid-spring-boot-starter-1.2.15.jar的DruidDataSourceAutoConfigure.class,可以看到:
- DruidDataSourceAutoConfigure是在DataSourceAutoConfiguration之前添加到IOC容器的,这样就先使用了druid连接池
- 同时对DruidStatProperties、DataSourceProperties两个配置类进行了绑定
- 向IOC容器添加了DruidSpringAopConfiguration、DruidStatViewServletConfiguration、DruidWebStatFilterConfiguration.class、DruidFilterConfiguration四个组件
- 向IOC容器添加了DataSource
package com.alibaba.druid.spring.boot.autoconfigure;
......省略部分......
@Configuration
@ConditionalOnClass({DruidDataSource.class})
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
@EnableConfigurationProperties({DruidStatProperties.class, DataSourceProperties.class})
@Import({DruidSpringAopConfiguration.class, DruidStatViewServletConfiguration.class, DruidWebStatFilterConfiguration.class, DruidFilterConfiguration.class})
public class DruidDataSourceAutoConfigure {
......省略部分......
@Bean(initMethod = "init")@ConditionalOnMissingBeanpublic DataSource dataSource() {LOGGER.info("Init DruidDataSource");return new DruidDataSourceWrapper();}
}
查看DruidStatProperties配置类,druid的配置是由spring.datasource.druid开头的参数进行配置的
......省略部分......
@ConfigurationProperties("spring.datasource.druid")
public class DruidStatProperties {
......省略部分......
}
查看DataSourceProperties配置类,datasource的配置是由spring.datasource开头的参数进行配置的
......省略部分......
@ConfigurationProperties(prefix = "spring.datasource"
)
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
......省略部分......
}
查看DruidSpringAopConfiguration类,aop相关的是由spring.datasource.druid.aop-patterns参数进行配置的,主要用来监控SpringBean。对应druid监控页面的Spring监控菜单
......省略部分......
@ConditionalOnProperty({"spring.datasource.druid.aop-patterns"})
public class DruidSpringAopConfiguration {
......省略部分......
}
查看DruidStatViewServletConfiguration类,如下所示:
- statViewServlet相关的是由spring.datasource.druid.stat-view-servlet.enabled参数进行配置的,默认关闭
- 向IOC容器添加了ServletRegistrationBean组件
- 该类主要做了允许哪些IP可以访问监控页面,不允许哪些页面访问监控页面
- 和设置监控页面的登录账号和密码
- 和设置重置按钮的开启和关闭
......省略部分......
@ConditionalOnWebApplication
@ConditionalOnProperty(name = {"spring.datasource.druid.stat-view-servlet.enabled"},havingValue = "true"
)
public class DruidStatViewServletConfiguration {private static final String DEFAULT_ALLOW_IP = "127.0.0.1";public DruidStatViewServletConfiguration() {}@Beanpublic ServletRegistrationBean statViewServletRegistrationBean(DruidStatProperties properties) {DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();ServletRegistrationBean registrationBean = new ServletRegistrationBean();registrationBean.setServlet(new StatViewServlet());registrationBean.addUrlMappings(new String[]{config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*"});if (config.getAllow() != null) {registrationBean.addInitParameter("allow", config.getAllow());} else {registrationBean.addInitParameter("allow", "127.0.0.1");}if (config.getDeny() != null) {registrationBean.addInitParameter("deny", config.getDeny());}if (config.getLoginUsername() != null) {registrationBean.addInitParameter("loginUsername", config.getLoginUsername());}if (config.getLoginPassword() != null) {registrationBean.addInitParameter("loginPassword", config.getLoginPassword());}if (config.getResetEnable() != null) {registrationBean.addInitParameter("resetEnable", config.getResetEnable());}return registrationBean;}
}
查看DruidWebStatFilterConfiguration类,如下所示:
- WebStatFilter相关的是由spring.datasource.druid.web-stat-filter.enabled参数进行配置的,默认关闭
- 向IOC容器添加了FilterRegistrationBean组件
- 该类设置了对哪些Web URL进行统计,哪些Web URL不进行统计(比如: “.js,.gif,.jpg,.png,.css,.ico,/druid/*”)
......省略部分......
@ConditionalOnWebApplication
@ConditionalOnProperty(name = {"spring.datasource.druid.web-stat-filter.enabled"},havingValue = "true"
)
public class DruidWebStatFilterConfiguration {public DruidWebStatFilterConfiguration() {}@Beanpublic FilterRegistrationBean webStatFilterRegistrationBean(DruidStatProperties properties) {DruidStatProperties.WebStatFilter config = properties.getWebStatFilter();FilterRegistrationBean registrationBean = new FilterRegistrationBean();WebStatFilter filter = new WebStatFilter();registrationBean.setFilter(filter);registrationBean.addUrlPatterns(new String[]{config.getUrlPattern() != null ? config.getUrlPattern() : "/*"});registrationBean.addInitParameter("exclusions", config.getExclusions() != null ? config.getExclusions() : "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");......省略部分......}
......省略部分......
}
查看DruidFilterConfiguration类,是对所有Druid自己的Filter的配置,比如wall防火墙
......省略部分......
public class DruidFilterConfiguration {private static final String FILTER_STAT_PREFIX = "spring.datasource.druid.filter.stat";private static final String FILTER_CONFIG_PREFIX = "spring.datasource.druid.filter.config";private static final String FILTER_ENCODING_PREFIX = "spring.datasource.druid.filter.encoding";private static final String FILTER_SLF4J_PREFIX = "spring.datasource.druid.filter.slf4j";private static final String FILTER_LOG4J_PREFIX = "spring.datasource.druid.filter.log4j";private static final String FILTER_LOG4J2_PREFIX = "spring.datasource.druid.filter.log4j2";private static final String FILTER_COMMONS_LOG_PREFIX = "spring.datasource.druid.filter.commons-log";private static final String FILTER_WALL_PREFIX = "spring.datasource.druid.filter.wall";private static final String FILTER_WALL_CONFIG_PREFIX = "spring.datasource.druid.filter.wall.config";......省略部分......
}
3.3 使用application.properties对druid进行配置
druid的配置如下所示:
# 配置druid监控功能
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.login-username=druid
spring.datasource.druid.stat-view-servlet.login-password=123456
spring.datasource.druid.stat-view-servlet.reset-enable=false# 开启druid监控页面的sql监控菜单、防火墙菜单
spring.datasource.druid.filters=stat,wall,slf4j# 对filters里面的stat的详细配置
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.log-slow-sql=true
# 1秒
spring.datasource.druid.filter.stat.slow-sql-millis=1000# 对filters里面的wall的详细配置
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.config.update-allow=true
spring.datasource.druid.filter.wall.config.drop-table-allow=false# 配置Web应用菜单功能
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*# 监控指定路径下的SpringBean。用于Spring监控菜单
spring.datasource.druid.aop-patterns=com.hh.springboottest.*
3.4 druid配置参考
连接池配置
spring.datasource.druid.initial-size=
spring.datasource.druid.max-active=
spring.datasource.druid.min-idle=
spring.datasource.druid.max-wait=
spring.datasource.druid.pool-prepared-statements=
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=
# 和上面的等价
spring.datasource.druid.max-open-prepared-statements=
spring.datasource.druid.validation-query=
spring.datasource.druid.validation-query-timeout=
spring.datasource.druid.test-on-borrow=
spring.datasource.druid.test-on-return=
spring.datasource.druid.test-while-idle=
spring.datasource.druid.time-between-eviction-runs-millis=
spring.datasource.druid.min-evictable-idle-time-millis=
spring.datasource.druid.max-evictable-idle-time-millis=
# 配置多个英文逗号分隔
spring.datasource.druid.filters=
监控配置
# WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter# 是否启用StatFilter,默认值false
spring.datasource.druid.web-stat-filter.enabled=
spring.datasource.druid.web-stat-filter.url-pattern=
spring.datasource.druid.web-stat-filter.exclusions=
spring.datasource.druid.web-stat-filter.session-stat-enable=
spring.datasource.druid.web-stat-filter.session-stat-max-count=
spring.datasource.druid.web-stat-filter.principal-session-name=
spring.datasource.druid.web-stat-filter.principal-cookie-name=
spring.datasource.druid.web-stat-filter.profile-enable=# StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置# 是否启用StatViewServlet(监控页面),默认值为false(考虑到安全问题默认并未启动,如需启用建议设置密码或白名单以保障安全)
spring.datasource.druid.stat-view-servlet.enabled=
spring.datasource.druid.stat-view-servlet.url-pattern=
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=
spring.datasource.druid.stat-view-servlet.deny=# Spring监控配置,说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置# Spring监控AOP切入点,如x.y.z.service.*, 配置多个英文逗号分隔
spring.datasource.druid.aop-patterns=
相关文章:

SpringBoot使用Druid连接池 + 配置监控页面(自定义版 + starter版)
目录 1. Druid连接池的功能2. 自定义版2.1 pom.xml添加依赖2.2 MyDataSourceConfig实现2.3 application.properties配置编写Controller进行测试2.4 druid监控页面查看 3. starter版3.1 pom.xml添加依赖3.2 自动配置分析3.3 使用application.properties对druid进行配置3.4 druid…...

【业务功能篇77】微服务-OSS对象存储-上传下载图片
3. 图片管理 文件存储的几种方式 单体架构可以直接把图片存储在服务器中 但是在分布式环境下面直接存储在WEB服务器中的方式就不可取了,这时我们需要搭建独立的文件存储服务器。 3.1 开通阿里云服务 针对本系统中的相关的文件,图片,文本等…...
【CSS 常用加载动画效果】
常用加载效果 呼吸灯效果波浪光效果转圈加载 呼吸灯效果 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><div id"ti"></div></body><style>b…...
python 模块requests 发送 HTTP 请求
一、简介 requests 模块是 python 基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作 二、安装 pip install requestsimport requests三、方法 requsts.requst(method, url,headers,cookies,prox…...

关于 Camera 预览和录像画质不一样的问题分析
1、问题背景 基于之前安卓平台的一个项目,客户有反馈过一个 Camera app 预览的效果,和录像效果不一致的问题。 这里的预览是指打开 Camera app 后直接出图的效果;录像的效果则是指打开 Camera app 开启录像功能,录制一段视频&…...

【音视频】 视频的播放和暂停,当播放到末尾时触发 ended 事件,循环播放,播放速度
video 也可以 播放 MP3 音频,当不想让 视频显示出来的话,可以 给 video 设置宽和高 1rpx ,不可以隐藏 <template><view class"form2box"><u-navbar leftClick"leftClick"><view slot"left&q…...

Python数据分析高薪实战第一天 python基础与项目环境搭建
开篇词 数据赋能未来,Python 势不可挡 互联网公司从红利下的爆发期,进入新的精细化发展阶段,亟须深入分析与挖掘业务与数据价值,从而找到新的增长点突破现有增长瓶颈。各行各业的数据分析需求井喷,数据分析人才成为争…...

pandas数据分析——groupby得到分组后的数据
groupbyagg分组聚合对数据字段进行合并拼接 Pandas怎样实现groupby聚合后字符串列的合并(四十) groupby得到分组后的数据 pandas—groupby如何得到分组里的数据 date_range补齐缺失日期 在处理时间序列的数据中,有时候会遇到有些日期的数…...

Android studio 软件git使用
在 test 分支添加的方法 , 现在切换到 master分支 总共 2 个分支 , 当前的分支是 test 出现了 先试一下 force checkout , 尝试之后发现 , 你更改没有带过来 , 以为哪个类在master分支没有 , 所以这边也没有 , 切回分支 test 发现之前的跟改没有 , 这样即可以找回 继续切换…...

通过C实现sqlite3操作,导入电子词典
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sqlite3.h> int main(int argc, const char *argv[]) {//创建并打开一个数据库sqlite3 *db NULL;if(sqlite3_open("./dict.db",&db) ! SQLITE_OK){printf("…...

K8S集群中使用JDOS KMS服务对敏感数据安全加密 | 京东云技术团队
基本概念 KMS,Key Management Service,即密钥管理服务,在K8S集群中,以驱动和插件的形式启用对Secret,Configmap进行加密。以保护敏感数据, 驱动和插件需要使用者按照需求进行定制和实现自己的KMS插件&…...
SpringBoot+quartz实现定时任务的创建、删除、查询操作
1、在pom.xml文件中导入quartz的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency> 2、配置quartz的数据源等操作 package com.train.batch.config;imp…...

Oracle的学习心得和知识总结(二十八)|Oracle数据库数据库回放功能之论文二翻译及学习
目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《Oracle Database SQL Language Reference》 2、参考书籍:《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…...
排序算法:归并排序
约翰冯诺伊曼在 1945 年提出了归并排序。在讲解归并排序之前,我们先一起思考一个问题:如何将两个有序的列表合并成一个有序的列表? 将两个有序的列表合并成一个有序的列表 这太简单了,笔者首先想到的思路就是,将两个列…...
Hbase-技术文档-spring-boot整合使用hbase--简单操作增删改查--提供封装高可用的模版类
使用spring-boot项目来整合使用hbase。 引入依赖 <dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.4.3</version> </dependency> 依赖声明表示将把Apache HBase客户端库…...

基于Pytorch的神经网络部分自定义设计
一、基础概念(学习笔记) (1)训练误差和泛化误差[1] 本质上,优化和深度学习的目标是根本不同的。前者主要关注的是最小化目标,后者则关注在给定有限数据量的情况下寻找合适的模型。训练误差和泛化误差通常不…...
持续更新串联记忆English words
(一)这是一组关于“服装搭配”的单词。通过在记忆中检索,回忆起隐藏的信息吧~ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>今日单词>>&…...
postgresql 内核源码分析 btree索引的增删查代码基本原理流程分析,索引膨胀的原因在这里
B-Tree索引代码流程分析 专栏内容: postgresql内核源码分析手写数据库toadb并发编程 开源贡献: toadb开源库 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤&…...

详细了解G1、了解G1、G1垃圾收集器详解、G1垃圾回收器简单调优
4.详细了解G1: 4.1.一:什么是垃圾回收 4.2.了解G1 4.3.G1 Yong GC 4.4.G1 Mix GC 4.5.三色标记算法 4.6.调优实践 5.G1垃圾收集器详解 5.1.G1垃圾收集器 5.2.G1的堆内存划分 5.3.G1的运行过程 5.4.三色标记 5.4.1.漏标问题 5.5.记忆集与卡表 5.6.安全点与…...
vue项目中 package.json 详解
在 Vue 项目中,package.json 是一个重要的配置文件,它包含了项目的名称、版本、作者、依赖等信息。下面是一份详细的 Vue 项目 package.json 配置说明: 1.name:项目的名称,用于标识项目,例如:&q…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
全面解析数据库:从基础概念到前沿应用
在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...