MySQL数据库连接池泄露导致MySQL Server超时关闭连接
前言
最近做项目,发现老项目出现xxx,这个错误其实很简单,出现在MySQL数据库Server端对长时间没有使用的client连接执行清楚处理,因为是druid数据库,且在github也出现这样的issue:The last packet successfully received from the server was 6,011 milliseconds ago. The last packet sent successfully to the server was 6,011 milliseconds ago.,所以怀疑是不是druid配置的问题,毕竟连接池会定时的检查连接,但是实际排查发现不是那么回事,是连接池泄露了,只不过并发不大,表现为{conn-10002} discard错误而已。
准备
按照笔者上次的文章mybatis plus相同Id与xml配置错误时,mybatis plus解决逻辑_mybatis plus xml文件查询id名字相同-CSDN博客
准备数据库,且通过开启root权限
demo
demo简单写一下,实际项目肯定复杂很多
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>2.7.17</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.2.22</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><version>2.7.17</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.3.2</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency></dependencies>
写一个main controller dao
@SpringBootApplication
@MapperScan("org.example.druid.demo.dao")
public class DruidMain {public static void main(String[] args) {SpringApplication.run(DruidMain.class, args);}
}@RestController
public class DemoController {@Autowiredprivate UserDao userDao;@RequestMapping(value = "/demo", method = RequestMethod.GET)public String demo(){int num = userDao.updateUser();return "{\"update\" : " + num + "}";}
}@Mapper
public interface UserDao {@Update("update User set age = 30 where id = 1")int updateUser();
}
配置文件
spring.datasource.druid.url= jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.druid.username= root
spring.datasource.druid.password= 123456i
spring.datasource.druid.driver-class-name= com.mysql.cj.jdbc.Driver
spring.datasource.druid.initialSize=1
spring.datasource.druid.minIdle=1
spring.datasource.druid.maxActive=2
spring.datasource.druid.maxWait=20000
spring.datasource.druid.timeBetweenEvictionRunsMillis=1000
spring.datasource.druid.minEvictableIdleTimeMillis=30000
spring.datasource.druid.validationQuery=SELECT 1
spring.datasource.druid.validationQueryTimeout=1
spring.datasource.druid.testOnBorrow=false
spring.datasource.druid.testOnReturn=false
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.keepAlive=true
spring.datasource.druid.socketTimeout=6000
spring.datasource.druid.poolPreparedStatements=true
访问 http://localhost:8080/demo
这一步实际上没什么问题,但是如果涉及编程式事务,那么可能出现代码逻辑漏洞
@Configuration
public class DemoConfiguration {@Beanpublic PlatformTransactionManager initPlatformTransactionManager(DruidDataSource dataSource) {return new DataSourceTransactionManager(dataSource);}
}@RestController
public class DemoController {@Autowiredprivate UserDao userDao;@Autowiredprivate PlatformTransactionManager transactionManager;@RequestMapping(value = "/demo", method = RequestMethod.GET)public String demo(){TransactionStatus transactionStatus = transactionManager.getTransaction(new DefaultTransactionDefinition());int num = 0;try {num = userDao.updateUser();transactionManager.commit(transactionStatus);} catch (TransactionException e) {transactionManager.rollback(transactionStatus);}return "{\"update\" : " + num + "}";}
}
这样写也没问题,但是,如果我们在事务拿到后,因为一些逻辑return呢
设置MySQL的超时时间
通过临时设置或者永久设置,--来自bing AI搜索
比如我们临时设置1分钟试试,问题复现
排查过程
The last packet successfully received from the server was 6,006 milliseconds ago. The last packet sent successfully to the server was 6,006 milliseconds ago.
2025-02-24 22:44:02.967 ERROR 2485 --- [nio-8080-exec-1] c.a.druid.pool.DruidPooledStatement : CommunicationsException, druid version 1.2.22, jdbcUrl : jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai, testWhileIdle true, idle millis 6017, minIdle 1, poolingCount 0, timeBetweenEvictionRunsMillis 1000, lastValidIdleMillis 6017, driver com.mysql.cj.jdbc.Driver, exceptionSorter com.alibaba.druid.pool.vendor.MySqlExceptionSorter
2025-02-24 22:44:02.972 ERROR 2485 --- [nio-8080-exec-1] com.alibaba.druid.pool.DruidDataSource : {conn-10002} discardcom.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failureThe last packet successfully received from the server was 6,011 milliseconds ago. The last packet sent successfully to the server was 6,011 milliseconds ago.at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:175) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:916) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:483) ~[druid-1.2.22.jar:na]at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48) [mybatis-3.5.14.jar:3.5.14]at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75) [mybatis-3.5.14.jar:3.5.14]at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) [mybatis-3.5.14.jar:3.5.14]at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) [mybatis-3.5.14.jar:3.5.14]at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) [mybatis-3.5.14.jar:3.5.14]at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) [mybatis-3.5.14.jar:3.5.14]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_431]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_431]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_431]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_431]at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) [mybatis-spring-2.1.2.jar:2.1.2]at com.sun.proxy.$Proxy56.update(Unknown Source) [na:na]at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:288) [mybatis-spring-2.1.2.jar:2.1.2]at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:67) [mybatis-3.5.14.jar:3.5.14]at org.apache.ibatis.binding.MapperProxy$PlainMethodInvoker.invoke(MapperProxy.java:141) [mybatis-3.5.14.jar:3.5.14]at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:86) [mybatis-3.5.14.jar:3.5.14]at com.sun.proxy.$Proxy59.updateUser(Unknown Source) [na:na]at org.example.druid.demo.controller.DemoController.demo(DemoController.java:27) [classes/:na]at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_431]at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_431]at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_431]at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_431]at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) [spring-web-5.3.30.jar:5.3.30]at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) [spring-web-5.3.30.jar:5.3.30]at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) [spring-webmvc-5.3.30.jar:5.3.30]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) [spring-webmvc-5.3.30.jar:5.3.30]at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) [spring-webmvc-5.3.30.jar:5.3.30]at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) [spring-webmvc-5.3.30.jar:5.3.30]at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072) [spring-webmvc-5.3.30.jar:5.3.30]at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) [spring-webmvc-5.3.30.jar:5.3.30]at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) [spring-webmvc-5.3.30.jar:5.3.30]at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) [spring-webmvc-5.3.30.jar:5.3.30]at javax.servlet.http.HttpServlet.service(HttpServlet.java:529) [tomcat-embed-core-9.0.82.jar:4.0.FR]at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) [spring-webmvc-5.3.30.jar:5.3.30]at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) [tomcat-embed-core-9.0.82.jar:4.0.FR]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) [tomcat-embed-websocket-9.0.82.jar:9.0.82]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) [spring-web-5.3.30.jar:5.3.30]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.30.jar:5.3.30]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) [spring-web-5.3.30.jar:5.3.30]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.30.jar:5.3.30]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) [spring-web-5.3.30.jar:5.3.30]at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) [spring-web-5.3.30.jar:5.3.30]at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) [tomcat-embed-core-9.0.82.jar:9.0.82]at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.82.jar:9.0.82]at java.lang.Thread.run(Thread.java:750) [na:1.8.0_431]
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failureThe last packet successfully received from the server was 6,011 milliseconds ago. The last packet sent successfully to the server was 6,011 milliseconds ago.at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_431]at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_431]at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_431]at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_431]at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:62) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:150) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:166) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.protocol.a.NativeProtocol.readMessage(NativeProtocol.java:582) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.protocol.a.NativeProtocol.checkErrorMessage(NativeProtocol.java:762) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.protocol.a.NativeProtocol.sendCommand(NativeProtocol.java:701) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.protocol.a.NativeProtocol.sendQueryPacket(NativeProtocol.java:1052) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.NativeSession.execSQL(NativeSession.java:657) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:893) ~[mysql-connector-j-8.0.33.jar:8.0.33]... 70 common frames omitted
Caused by: java.net.SocketTimeoutException: Read timed outat java.net.SocketInputStream.socketRead0(Native Method) ~[na:1.8.0_431]at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[na:1.8.0_431]at java.net.SocketInputStream.read(SocketInputStream.java:171) ~[na:1.8.0_431]at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[na:1.8.0_431]at com.mysql.cj.protocol.ReadAheadInputStream.fill(ReadAheadInputStream.java:107) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.protocol.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:150) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.protocol.ReadAheadInputStream.read(ReadAheadInputStream.java:180) ~[mysql-connector-j-8.0.33.jar:8.0.33]at java.io.FilterInputStream.read(FilterInputStream.java:133) ~[na:1.8.0_431]at com.mysql.cj.protocol.FullReadInputStream.readFully(FullReadInputStream.java:64) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.protocol.a.SimplePacketReader.readHeaderLocal(SimplePacketReader.java:81) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.protocol.a.SimplePacketReader.readHeader(SimplePacketReader.java:63) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.protocol.a.SimplePacketReader.readHeader(SimplePacketReader.java:45) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.protocol.a.TimeTrackingPacketReader.readHeader(TimeTrackingPacketReader.java:52) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.protocol.a.TimeTrackingPacketReader.readHeader(TimeTrackingPacketReader.java:41) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.protocol.a.MultiPacketReader.readHeader(MultiPacketReader.java:54) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.protocol.a.MultiPacketReader.readHeader(MultiPacketReader.java:44) ~[mysql-connector-j-8.0.33.jar:8.0.33]at com.mysql.cj.protocol.a.NativeProtocol.readMessage(NativeProtocol.java:576) ~[mysql-connector-j-8.0.33.jar:8.0.33]... 75 common frames omitted
这个问题在github也有类似的情况,但是不一定是笔者遇到的问题:https://github.com/alibaba/druid/issues/5963
对于连接泄露可以配置泄露连接强制回收,但是这个仅在排查问题使用
removeAbandoned: true
removeAbandonedTimeoutMillis: 30000 #(以毫秒数为单位)
logAbandoned: true
貌似有用,但是实际情况是占用数据库连接的线程并不一定是问题的代码逻辑,我这里仅仅写了一个controller,刚好对应上
所以排查还需要另外的思路。
解决方法
开启连接池连接的状态日志,这里以druid为例
spring.datasource.druid.filters=stat,wall,slf4j logging.level.com.alibaba.druid=TRACE
可以看到事务并没提交,连接关闭不了
当然笔者使用的MySQL版本低了点,还有缓存,再高一些版本的MySQL就删除了,毕竟命中效率比较低,还是吞吐量比较重要,还增加了查询重写插件
可以看到根本关闭不了连接,这个时候就需要安装报错的连接id搜索,相同连接ID报错前的最后一次数据库操作很可能就是出问题的连接操作,同时业务日志打印也非常重要,否则极难判断
然后判断id为10002的 正常业务是做了什么,就可以找到问题了,我这里示例Demo偷懒了,应该用另一个controller来验证
找到问题就好处理有问题的代码了。
总结
我们在写代码时,尽量还是使用框架封装的逻辑,比如连接池,比如Spring声明式事务,可以避免编程式事务在写代码时的逻辑漏洞,因为在没触发的时候很难出现,测试很多时候不充分。实际上一起写jdbc的时候还很少出现这个问题,因为那个时候会非常注意连接的回收,事务的提交逻辑,但是Spring自动管理后,这个就很少注意了,因为注解声明式事务太方便了,只有特殊时候才会自己管理事务。
另外这个问题具备隐蔽性,因为报错是MySQL驱动连接MySQL Server报超时未使用关闭连接,但是此处示例的根源却是编程式事务导致连接池泄露。
相关文章:
MySQL数据库连接池泄露导致MySQL Server超时关闭连接
前言 最近做项目,发现老项目出现xxx,这个错误其实很简单,出现在MySQL数据库Server端对长时间没有使用的client连接执行清楚处理,因为是druid数据库,且在github也出现这样的issue:The last packet successf…...
Deepseek和Grok 3对比:写一段冒泡排序
1、这是访问Grok 3得到的结果 2、grok3输出的完整代码: def bubble_sort(arr):n len(arr) # 获取数组长度# 外层循环控制排序轮数for i in range(n):# 内层循环比较相邻元素,j的范围逐渐减少for j in range(0, n - i - 1):# 如果当前元素大于下一个元…...
EX_25/2/22
找到第一天mystring练习,实现以下功能 mystring str "hello" mystring ptr "world" str str ptr; str ptr str[0] H #include <iostream> #include <cstring> #include <cstdlib> #include <unistd.h> #in…...
el-select滚动获取下拉数据;el-select滚动加载
el-select下拉获取数据 1.解决问题2.封装MyScrollSelect组件3.使用MyScrollSelect组件 1.解决问题 场景:下拉数据量过大,后端提供一个分页查询接口;需要每次滚动加载下一页的下拉数据 且单选的状态,需要支持回显,通过n…...
Spring Boot面试题
Spring Boot面试题 基础概念 Q1: Spring Boot的核心特性有哪些? public class SpringBootBasicDemo {// 1. 自动配置SpringBootApplicationpublic class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class…...
STM32-智能小车项目
项目框图 ST-link接线 实物图: 正面: 反面: 相关内容 使用L9110S电机模块 电机驱动模块L9110S详解 | 良许嵌入式 一、让小车动起来 新建文件夹智能小车项目 在里面复制19-串口打印功能 重命名为01-让小车动起来 新建文件夹motor&…...
SAP-ABAP:ABAP第一代增强详解
在SAP ABAP开发中,第一代增强(First-Generation Enhancement) 是早期用于扩展标准程序功能的传统技术,主要通过预定义的增强点(Enhancement Points)实现。以下是详细解析: 一、第一代增强的核心…...
20分钟 Bash 上手指南
文章目录 bash 概念与学习目的第一个 bash 脚本bash 语法变量的使用位置参数管道符号(过滤条件)重定向符号条件测试命令条件语句case 条件分支Arrayfor 循环函数exit 关键字 bash 脚本记录历史命令查询文件分发内容 bash 概念与学习目的 bash࿰…...
地铁站内导航系统:基于蓝牙Beacon与AR技术的动态路径规划技术深度剖析
本文旨在分享一套地铁站内导航系统技术方案,通过蓝牙Beacon技术与AI算法的结合,解决传统导航定位不准确、路径规划不合理等问题,提升乘客出行体验,同时为地铁运营商提供数据支持与增值服务。 如需获取校地铁站内智能导航系统方案文…...
WordPress R+L Carrier Edition sql注入漏洞复现(CVE-2024-13481)(附脚本)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...
滴水逆向_引用_友元函数_运算符重载
作业: 运算符号重载实现。 struct Person { public:int x;int y; public:Person(){this->x 10;this->y 20;}Person(int x, int y){this->x x;this->y y;}//申明友元函数void Printf(const Person& p){printf("%d %d",p.x,p.y);}/…...
git中,如何查看具体单个文件的log
在 Git 中,可以使用多种方式查看单个文件的提交日志(Log),以下详细介绍不同场景下的查看方法: 目录 一、基本命令查看文件的完整提交日志 二、查看文件提交日志并显示差异内容 三、限制显示的提交日志数量 四、按…...
如何生成traceid以及可视化展示
根据你的需求,以下是一些可以生成唯一 traceId 并用于分布式链路追踪的工具和项目,这些项目支持生成唯一的 traceId,并将其用于日志记录和分布式追踪: 1. OpenTelemetry OpenTelemetry 是一个开源的观测框架,支持生成…...
2024 ICPC香港站 L.Flipping Paths的一种解法
太变态了,场上被硬控了两个小时,最后20分钟思路熬出来了但是没写对~,糖完了。怎么说呢,香港站这样的轻量级赛站,这次强队也很少,导致很多题目的难度升级了,这道L题是一道银牌题,不少…...
Uniapp 开发中遇到的坑与注意事项:全面指南
文章目录 1. 引言Uniapp 简介开发中的常见问题本文的目标与结构 2. 环境配置与项目初始化环境配置问题解决方案 项目初始化注意事项解决方案 常见错误与解决方案 3. 页面与组件开发页面生命周期注意事项示例代码 组件通信与复用注意事项示例代码 样式与布局问题注意事项示例代码…...
Python - 代码片段分享 - Excel 数据实时写入方法
文章目录 前言注意事项工具 pandas1. 简介2. 安装方式3. 简单介绍几个api 实战片段 - 实时写入Excel文件结束语 要么出众,要么出局 前言 我们在爬虫采集过程中,总是将数据解析抓取后统一写入Excel表格文件,如果在解析数据出现问题容易出现数据…...
一文详解U盘启动UEFI/Legacy方式以及GPT/MBR关系
对于装系统的老手而说一直想研究一下装系统的原理,以及面对一些问题时的解决思路,故对以前的方法进行原理上的解释,主要想理解其底层原理。 引导模式 MBR分区可以同时支持UEFI和Legacy引导,我们可以看一下微pe制作的启动盘&#…...
Java函数式接口的巧妙应用
引言 函数式接口(Functional Interface)是Java 8引入的一个重要概念,它是Lambda表达式和方法引用的基础。通过函数式接口,Java实现了对函数式编程的支持,让代码更加简洁、灵活。本文将带你深入理解函数式接口…...
爱普生SG-8101CE可编程晶振赋能智能手机的精准心脏
在智能手机高速迭代的今天,高性能、低功耗与小型化已成为核心诉求。智能手机作为人们生活中不可或缺的工具,需要在各种复杂场景下稳定运行。爱普生SG-8101CE可编程晶振凭借其卓越性能,成为智能手机中不可或缺的精密时钟源,为通信、…...
条件渲染
当if条件为true则会被显示出来,若为false则不会显示出来。 在App.vue中需要引用一下。 if else一样的if为真则显示if的内容,若不是则显示else下的内容。 多条件判断。 if在为false时,根本不会渲染,而show则会,只不过d…...
sklearn中的决策树-分类树:剪枝参数
剪枝参数 在不加限制的情况下,一棵决策树会生长到衡量不纯度的指标最优,或者没有更多的特征可用为止。这样的决策树 往往会过拟合。为了让决策树有更好的泛化性,我们要对决策树进行剪枝。剪枝策略对决策树的影响巨大,正确的剪枝策…...
算法随笔_59: 子数组最小乘积的最大值
上一篇:算法随笔_58: 队列中可以看到的人数-CSDN博客 题目描述如下: 一个数组的 最小乘积 定义为这个数组中 最小值 乘以 数组的 和 。 比方说,数组 [3,2,5] (最小值是 2)的最小乘积为 2 * (325) 2 * 10 20 。 给你一个正整数数组 nums …...
线性模型 - 支持向量机延伸
为了更好的理解支持向量机模型,本文我们延伸学习和理解一下和支持向量机相关的一些概念,这些概念都是偏理论和数学的知识,比较抽象和复杂,而且需要一定的高等数学知识。大家可以先明白其所包含的意义,然后逐步深入理解…...
力扣3464. 正方形上的点之间的最大距离
力扣3464. 正方形上的点之间的最大距离 题目 题目解析及思路 题目要求在points集合中找出k个点,k个点之间的最小的曼哈顿距离的最大值 最大最小值的题一般直接想到二分 将正方形往右展开成一条线,此时曼哈顿距离为两点直线距离**(仅起点右边的点)** …...
AI数字人源码搭建部署指南
为实现AI数字人的智能交互功能,需开发包含语音识别、自然语言处理、机器学习等技术的AI算法和模型。利用TensorFlow、PyTorch等深度学习框架完成模型训练。具体步骤包括以下四个方面: 需求分析:通过市场调研、用户访谈、专家咨询等方式&…...
智能拖把控制板开发
智能拖把控制板开发全流程解析 一、硬件架构与H桥驱动设计 工程师小明选用四颗AO3400A低导通电阻MOS管构建H桥驱动拓扑,实测全桥导通电阻仅15mΩ,较传统方案降低40%损耗。通过优化PCB布局将驱动环路电感控制在15nH以内,配合10kHz互补PWM信号…...
【Swift 算法实战】利用 KMP 算法高效求解最短回文串
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
【数字化转型+AI:现代企业腾飞的一对翅膀】
——解析数字时代的核心竞争力 在全球化竞争与技术迭代加速的今天,传统企业若想突破增长瓶颈,必须抓住两大核心驱动力:数字化转型与人工智能(AI)。这两大技术如同企业腾飞的双翼,共同构建敏捷性、创…...
Zabbix——踩坑HttpRequest,header添加无效
背景 在试图尝试通过Zabbix接入DeepSeek API的时候,由于使用了HTTP的方式,所以需要使用Zabbix 自带的HttpRequest库进行请求,产生了下面的问题 问题 curl curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completio…...
MTK Android12 预装apk可卸载
文章目录 需求解决方法1、device/mediatek/mt6761/device.mk2、/vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_vendor_list.txt3、路径:4、Android.mk 需求 近期,客户需要预装一个apk,同时该apk要可卸载。解…...
让网页“浪“起来:打造会呼吸的波浪背景
每次打开那些让人眼前一亮的网页时,你是否有注意到那些看似随波逐流的动态背景?今天咱们不聊高深的技术,就用最朴素的CSS,来解锁这个让页面瞬间鲜活的秘籍。无需JavaScript,不用复杂框架,准备好一杯咖啡&am…...
YOLO11的单独推理程序
YOLO11的单独推理程序,可以实例化加载一次多次推理。 YOLO11的单独推理程序,可以实例化加载一次多次推理。 YOLO11的单独推理程序,可以实例化加载一次多次推理。 YOLO11的单独推理程序,可以实例化加载一次多次推理。 YOLO11的单独推理程序,可以实例化加载一次多次推理…...
代码随想录day21
669.修剪二叉搜索树 //理解修建后重建树的概念 TreeNode* trimBST(TreeNode* root, int low, int high) {if(root nullptr) return nullptr;if(root->val < low){TreeNode* node trimBST(root->right, low, high);return node;}if(root->val > high){TreeNod…...
利用Ai对生成的测试用例进行用例评审
利用AI对生成的测试用例进行用例评审,可以从用例的完整性、有效性、一致性等多个维度展开,借助自然语言处理、机器学习等技术,提高评审效率和准确性。以下为你详细介绍具体方法: 1. 需求匹配度评审 利用自然语言处理(NLP)技术 步骤:首先将软件需求文档和生成的测试用例…...
JAVAweb-JS基本数据类型,变量,DOM,pop,push函数,事件
JavaScript,可以嵌套在静态页面中添加一些动态语言. JavaScript是开发web脚本语言,但也被用到了很多非浏览器环境中,比如node平台 JS可以嵌套在静态页面中可以给静态页面添加一些动态效果(脚本语言),不同浏览器厂商(在浏览器中都有内置解析器解析JS语法) <!DOCTYPE html&g…...
SpringBoot源码解析(十一):准备应用上下文
SpringBoot源码系列文章 SpringBoot源码解析(一):SpringApplication构造方法 SpringBoot源码解析(二):引导上下文DefaultBootstrapContext SpringBoot源码解析(三):启动开始阶段 SpringBoot源码解析(四):解析应用参数args Sp…...
Python CNN基于深度学习的轴承故障智能检测平台
一、 项目概述 本项目旨在利用深度学习技术,构建一个基于Python的轴承故障智能检测平台。该平台能够对轴承的振动信号进行分析,自动识别轴承的健康状态,并判断故障类型,从而实现轴承故障的早期预警和诊断,提高设备的运…...
CCNP知识笔记
路由选路原理 路由信息来源 路由信息怎么来的? 直连路由(C): 通过直连接口UP产生智联路由条目(物理层UP数据链路层UP) 静态路由(S): 通过网络管理员逐条写入的路由条…...
递归树求解递归方程
*递归树是迭代计算模型 *递归树的生成过程与迭代过程一致 *根据递归定义不断扩展递归树,直到边界条件(其值已知) *对递归树产生的所有项求和就是递归方程的解 例一: T(n) 1 n1 T(n) 2T(n/2) n n>1 对于…...
2025年【熔化焊接与热切割】找解析及熔化焊接与热切割模拟试题
在当今工业领域,熔化焊接与热切割技术作为重要的加工手段,广泛应用于各种金属结构的制造与维修中。然而,这些作业过程伴随着高风险,对从业人员的安全知识和技能提出了极高的要求。为了提升相关人员的安全意识和操作技能࿰…...
Linux系统:服务器常见服务默认IP端口合集
服务器的默认IP端口取决于所使用的协议和服务类型。以下是一些常见服务和协议的默认端口: 服务端口实例: HTTP服务 默认端口:80 说明:用于普通的HTTP网页访问。例如,访问 http://example.com 时,默认使用8…...
LangChain教程 - RAG - PDF摘要
系列文章索引 LangChain教程 - 系列文章 随着人工智能和大语言模型(LLM)的快速发展,越来越多的工具和平台被引入以简化我们的日常任务。LangChain是一个非常强大的框架,它能够帮助开发者构建与LLM(如OpenAI、Ollama等…...
[java基础-JVM篇]3_JVM类加载机制
摘要:JVM通过设立不同优先级和职责的加载器保证了类加载的安全性与灵活性,即双亲委派机制,但是实际生产中更复杂的需求又需要破坏双亲委派,即打破JVM约定过的类加载程序 目录 类的生命周期 类加载 加载 类加载器 双亲委派机制…...
相似性搜索(2)
在本篇中,我们通过播客相似性搜索为例,进一步研究基于chroma 的相似性搜索: 参考: https://www.kaggle.com/code/switkowski/building-a-podcast-recommendation-engine/notebook 数据集来源: https://www.kaggle.…...
Linux 本地部署 Deepseek-R1 大模型!
DeepSeek-R1 的发布,掀起了一场风暴! 开源、强大、本地可部署,真正私有的 AI 助手,不受网络、隐私等限制,数据安全感直接拉满! 今天,手把手带你在 Linux 上本地部署 DeepSeek-R1,关…...
软件测试高频面试题
以下是一些软件测试高频面试题: 基础概念类 HTTP和HTTPS的区别:HTTPS使用SSL/TLS协议对传输数据加密,HTTP没有加密;HTTPS可确保数据完整性,防止传输中被篡改,HTTP不保证;HTTP默认用80端口&…...
光明谷推出AT指令版本的蓝牙音箱SOC 开启便捷智能音频开发新体验
前言 在蓝牙音箱市场竞争日益激烈的当下,开发一款性能卓越且易于上手的蓝牙音箱,成为众多厂商追求的目标。而光明谷科技有限公司推出的 AT 指令版本的蓝牙音箱 SOC,无疑为行业带来了全新的解决方案,以其诸多独特卖点,迅…...
数据安全_笔记系列01:数据分类分级与敏感数据识别详解
数据安全_笔记系列01:数据分类分级与敏感数据识别详解 1)、数据分类分级与敏感数据识别详解 数据分类分级是数据安全治理的核心环节,旨在根据数据的敏感性和重要性,制定差异化的保护策略。以下从 定义、法规、方法、工具、案例 等维度全面解…...
SOUI基于Zint生成UPC码
UPC 码(Universal Product Code,通用产品代码)是一种广泛使用的条形码系统,主要用于零售商品的标识和追踪。有两种主要格式:UPC-A 和 UPC-E。 UPC-A 长度12位数字。适用于大型商品 UPC-E 长度8位数字。UPC-E是UPC-A…...
MySQL 主从同步延迟:原因剖析与解决之道
在现代数据库应用中,MySQL 的主从同步是一种常见且重要的架构模式,它能提供数据备份、读写分离等诸多优势,有效提升系统的可用性和性能。然而,主从同步延迟问题却常常困扰着数据库管理员和开发者,严重时甚至会影响业务…...