- 博客(354)
- 资源 (6)
- 问答 (2)
- 收藏
- 关注
原创 xxljob阻塞处理策略设置为单机串行导致的bug
之前我们公司有个项目需要每五分钟去拉取平台上的订单,于是乎我就在xxljob设置了这个定时任务,设置如下:然后xxljob内的代码如下: 错误描述: 然后我发现有些订单没有拉取下来有遗漏,对运营工作造成了影响。 我第一时间找到了没拉取下来的订单,看了一下定时任务打印的日志,发现定时任务执行有延迟,本来16:30以后还要再执行三次任务,但是日志中没有体现,16:30以后应该要执行的三次任务延迟到了16:52在执行。后来检查代码才发现执行pullOrderTask这个方法的
2025-03-27 14:36:15
9706
原创 idea中的查看git历史记录,不显示详细信息
1、idea中git查看history正常显示如下图:1、idea中git查看history,现在不显示提交的历史文件详细信息,如下图: 1、找到如下窗口中画红色框的黑色线条,鼠标放在黑色线条上,往下拖拽即可显示。
2025-03-05 15:16:52
18127
原创 流未关闭导致文件无法删除
生成excel文件方法:@Overridei++) {生成zip文件方法:@Overridetry {i++) {int length;log.error("生成热销品压缩文件错误,错误详情:{}",e);throw new BizException(FAIL_CODE,"生成热销品压缩文件错误");主方法:先生成excel之后删除excel,但是由于没有关闭fis的文件流,导致文件无法删除,因此关闭文件流即可。
2024-10-16 11:36:06
52944
1
原创 多线程事务
我们在工作中经常会到往数据库里插入大量数据的工作,但是既需要保证数据的一致性,又要保证程序执行的效率。因此需要在多线程中使用事务,这样既可以保证数据的一致性,又能保证程序的执行效率。但是spring自带的@Transactional注解无法满足多线程间的事务一致性,因为这几个事务执行的线程不同,无法保持数据的一致性。
2024-05-25 23:01:25
43558
2
原创 CountDownLatch使用错误+未最终断开连接导致线程池资源耗尽
我设置了CountDownLatch对线程的协作做出了一些限制,但是我发现运行一段时间以后便发现定时任务不运行了。报错以后定时任务不运行了这是线程运行的状态,一直在等待状态并没有被释放,因此没有再执行任务。
2024-04-23 09:50:49
51697
原创 换行符导致字符串无法匹配
然后我用接口调的时候发现了异常,这个数据的前面有个换行符,但是用navicat之类的工具是看不出来的,因此对于备注这种东西最好用like来进行sql匹配。但是我使用navicat查看列表的时候并没有发现什么异常。我运行一句sql的时候,发现对应的字段查询不出结果。
2024-04-22 17:55:15
51109
原创 fastjson转换json时默认将属性第一个字母转小写
我新建了一个实体类,但是实体类的首字母是大写的,但是使用fastjson后打印的,Json字符串首字母却是小写的,这是fastjson的一个bug实体类: Json字符串:实体类上使用@JSONField注解以后就变正常了。代码修改如下:运行效果:
2024-04-19 16:52:14
52417
原创 未提交事务直接返回,导致连接池资源耗尽
我所撰写的代码如下,在使用编程式事务的时候,我未提交或回滚事务就直接返回,因为连接池默认连接数的大小是10,所以到第十一次的时候连接池就会使用完,导致任务无法进行。接口无法给予响应。
2024-04-11 11:15:36
52479
原创 未设置超时时间导致线程池资源耗尽,排查过程
我们一般认为线程处于blocked状态的时候线程才是处于阻塞状态,但是这个状态只是对于计算机来说的。对于我们来说,只要业务不执行了,线程就是处于阻塞状态的,因此任何状态下的线程对于业务来说都是阻塞的。
2024-04-10 16:57:15
53171
2
原创 Connection pool exhausted - try increasing ‘maxPoolSize‘ and/or ‘borrowConnectionTimeout‘ on the Dat
使用Atomikos这个插件配置参数AtomikosDataSourceBean时忘记配置MinPoolSize,MaxPoolSize,BorrowConnectionTimeout这三个参数,导致连接池资源耗尽。调接口时反应及慢,迟迟不响应,之后提示下面的报错。
2024-03-29 17:31:36
53877
原创 使用C++从零开始,自己写一个MiniWeb
初始化可以分为五步:1、网络通讯初始化===>>>2、创建套接字===>>>3、绑定端口===>>>4、绑定套接字===>>>5、创建监听队列。浏览器发起新的访问时,会向服务器端发送一个请求报文。请求报文由4四个部分组成:请求行、请求头部行、空行、请求数据。在http.cpp最上面引入依赖,并撰写main方法,打印错误日志的方法。4、右击源文件,点击添加,新建http.cpp文件。2、选择空项目并点下一步(切记不能选错项目类型)3、填写项目名称和路径,点击创建即可。1、打开VS点击创建新项目。
2024-02-11 21:19:21
57688
原创 MySQL中的free链表,flush链表,LRU链表
你在执行增删改的时候,如果发现数据页没缓存,那么必然会基于free链表找到一个空闲的缓存页,然后读取到缓存页里去,但是如果已经缓存了,那么下一次就必然会直接使用缓存页。反正不管怎么样,你要更新的数据页都会在Buffer Pool的缓存页里,供你在内存中直接执行增删改的操作。接着你肯定会去更新Buffer Pool的缓存页中的数据,此时一旦你更新了缓存页中的数据,那么缓存页里的数据和磁盘上的数据页里的数据,是不是就不一致了?这个时候,我们就说缓存页是脏数据,脏页。
2023-08-28 15:05:37
55609
原创 MySQL中的Buffer Pool
一、概述一、概述Buffer Pool是数据库的一个内存组件,里面缓存了磁盘上的真实数据,然后我们的Java系统对数据库执行的增删改操作,其实主要就是对这个内存数据结构中的缓存数据执行的。我们先来看一下下面的图,里面就画了数据库中的Buffer Pool内存组件。
2023-08-27 17:05:37
54739
原创 MySQL执行更新的流程
引擎要执行更新语句的时候 ,比如对“id=10”这一行数据,他其实会先将“id=10”这一行数据看看是否在缓冲池里,如果不在的话,那么会直接从磁盘里加载到缓冲池里来,而且接着还会对这行记录加独占锁。
2023-08-27 16:30:56
55425
原创 死锁产生的4个必要条件
1 . 产生死锁的必要条件:(1)互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。(2)请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。(3)不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。(4)环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。解决死锁的基本方法2 . 预防死锁:(1)资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
2023-08-19 22:19:25
55135
原创 线程池原理
线程池,按照配置参数(核心线程数、最大线程数等)创建并管理若干线程对象,没有任务的时候,这些线程都处于等待空闲状态。如果有新的线程任务,就分配一个空闲线程执行。如果所有线程都处于忙碌状态,线程池会创建一个新线程进行处理或者放入队列(工作队列)中等待。
2023-08-19 22:04:29
54697
原创 池化技术介绍
提前保存大量的资源,以备不时之需以及重复使用。池化技术应用广泛,如内存池,线程池,连接池等等。内存池相关的内容,建议看看 Apache、Nginx 等开源 web 服务器的内存池实现。由于在实际应用当做,分配内存、创建进程、线程都会设计到一些系统调用,系统调用需要导致程序从用户态切换到内核态,是非常耗时的操作。因此,当程序中需要频繁的进行内存申请释放,进程、线程创建销毁等操作时,通常会使用内存池、进程池、线程池技术来提升程序的性能。
2023-08-19 21:41:27
53961
原创 服务的拆分
标准是按照业务的关联程度来决定,关联比较密切的业务适合拆分为一个微服务,而功能相对比较独立的业务适合单独拆分为一个微服务。以社交App为例,你可以认为首页信息流是一个服务,评论是一个服务,消息通知是一个服务,个人主页也是一个服务。
2023-08-19 21:01:40
54452
原创 Java编译器中的优化技术
Java中的热点代码主要有两类,包括:1、被多次调用的方法。2、被多次执行的循环体。前者很好理解,一个方法被调用得多了,方法体内代码执行的次数自然就多,它成为热点代码是理所当然的。而后者则是为了解决当一个方法只被调用过一次或少量的几次,但是方法体内部存在循环次数较多的循环体,这样循环体的代码也被重复执行多次,因此这些代码也应该认为是“热点代码”。对于这两种情况,编译的目标对象都是整个方法体,而不会是单独的循环体。
2023-07-26 22:31:26
54556
原创 自己动手写一个编译器
Pcode 是 TinyC 编译器的中间代码,是本人参考 pascal 编译器的中间代码 pcode 、并结合逆波兰表达式(后缀表达式)的逻辑后,设计出的一种非常简单的、基于栈和符号表的虚拟代码。Pcode 虚拟机是一个用来运行 Pcode 命令的、假想的机器,它包括:一个代码区(code)、一个指令指针(eip)、一个栈(stack)、一个变量表(var_table)、一个函数表(func_table)以及一个标签表(label_table)。
2023-07-25 14:38:14
61735
3
原创 封装hiredis成dll包,为老项目提供redis网络支持
1、需要下载window8.1的SDK否则无法下载2、平台工具集需要使用Visual Studio 2015(v140)
2023-07-19 15:37:19
54627
原创 封装cpp-httplib成dll包,为老项目提供http网络支持
公司内某些老的项目不支持https或者http1.1的一些新功能,需要开发对应的SDK供其调用,以便维护老项目。
2023-07-19 08:40:31
55568
原创 环形链表(快慢指针)
给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递。仅仅是为了标识链表的实际情况。如果链表中存在环 ,则返回 true。否则,返回 false。
2023-07-12 21:38:42
53950
原创 通过反射机制获取父类在内的所有属性字段
我之前写的通过反射拿到接口入参是这样写的,但是这样写有一个问题,就是无法获得父类的参数信息,导致日志无法打印出全部参数。
2023-07-12 21:03:10
55856
原创 Web项目中耗时操作,用异步请求,减少请求等待时间,使用Redis保证操作幂等性
最近项目中碰到了一个接口需要比较耗时的操作,但是我们公司前后端交互的网关设置了超时时间。因此我需要设置出一个方案保证给用户比较快的响应,又保证任务执行了。因此我采用了,下面的操作方式。客户端发送请求后,我会先去Redis中检查是否还有任务在执行,如果有则不开启异步线程,如果没有则开启异步线程进行数据的业务操作。下面就是我写的伪代码。
2023-07-09 22:31:27
54268
原创 Redis 为什么这么快?
决定 Redis 请求效率的因素主要是三个方面,分别是网络、cpu、内存。在网络层面,Redis 采用多路复用的设计,提升了并发处理的连接数,不过这个阶段, Server 端的所有 IO 操作,都是由同一个主线程处理的这个时候 IO 的瓶颈就会影响到 Redis 端的整体处理性能。所以从 Redis6.0 开始,在多路复用及层面增加了多线程的处理,来优化 IO 处理的能力不过,具体的数据操作仍然是由主线程来处理的,所以我们可以认为 Redis 对于数据 IO的处理依然是单线程。
2023-07-04 09:36:31
54153
原创 Spring Bean 作用域的定义
3、request,用来定义一个作用范围仅在 request 中的 Bean,也就是说在每次 HTTP。4、session,用来定义一个作用范围仅在 session 中的 Bean,也就是说在每次 HTTP。2、prototype,用来定义一个 Bean 为多例,也就是说在每次请求获取 Bean 的时都会。5、globalSession,用来定义一个作用范围仅在中的 Bean。的一个实例对象,Spring 中的 Bean 默认都是单例的。重新创建实例,因此每次获取到的实例对象都是不同的。
2023-07-03 17:21:07
54641
原创 Nacos 配置更新的工作流程
Nacos Client 端需要获取服务端变更的配置,前提是要有一个比较, 也就是拿客户端本地的配置信息和服务端的配置信息进行比较。一旦发现和服务端的配置有差异,就表示服务端配置有更新,于是把更新的配置拉到本 地。在这个过程中,有可能因为客户端配置比较多,导致比较的时间较长,使得配置同步较慢的问题。所谓长轮训,(如图)就是客户端发起一次轮训请求到服务端,当服务端配置没有任何变更的时候,这个连接一直打开。进行判断,服务端会逐个比较这些配置中 md5 不同的 key,把存在更新的 key 返回给。
2023-07-02 14:46:39
54587
原创 零拷贝原理
须要经过几个拷贝的过程。从磁盘中读取目标文件内容拷贝到内核缓冲区,CPU 控制器再把内核缓冲区的数据赋值到用户空间的缓冲区中, 接着在应用程序中,调用 write() 方法,把用户空间缓冲区中的数据拷贝到内核下的 Socket Buffer 中。最后,把在内核模式下的 SocketBuffer 中的数据赋值到网卡缓冲区(NIC Buffer)网卡缓冲区再把数据传输到目标服务器上。在这个流程中,数据只经历了两次拷贝就发送到了网卡中,并且减少了 2 次 cpu 的上下文切换,对于效率有非常大的提高。
2023-07-01 15:39:47
54128
原创 Java的SPI
不过,在Java里面并没有提供实现,因为不同的数据库厂商,会有不同的语法和实现。所以只能由第三方数据库厂商来实现,比如Oracle是oracle.jdbc.OracleDriver,mysql是com.mysql.jdbc.Driver. 然后在应用开发的时候,根据集成的驱动实现连接到对应数据库。然后第三方可以实现这个接口来完成功能的扩展和实现。实例化会造成性能开销,并且加载一些不需要用到的实现类,会导致内存资源的浪费,在这个目录下,以接口的全限定名命名的配置文件,文件内容是这个接口的实现类。
2023-07-01 11:58:23
54390
原创 String、StringBuffer、StringBuilder 区别
最后是 StringBuilder,它比 StringBuffer 的性能高,因为 StringBuffer 加了同步锁。String 内部的 value 值是 final 修饰的,所以它是不可变类。所以每次修改 String 的值,StringBuffer 和 StringBuilder 是可变类,字符串的变更不会产生新的对象。String 的性能是最的低的,因为不可变意味着在做字符串拼接和修改的时候,需要重新。String 是不可变类,所以它是线程安全的。StringBuilder 不是线程安全的。
2023-07-01 11:36:37
54065
原创 受检异常和非受检异常
所以,除了 Error 和 RuntimeException 及派生类以外,其他异常都是属于受检异常,所谓的受检异常,表示在编译的时候强制检查的异常,这种异常需要显示的通过。而非受检异常,表示在编译器可以不需要强制检查的异常,这种异常不需要显示去捕捉。比如数据库异常、文件读取异常,这些异常是程序无法提前预料到的,但是一旦出现问。Exception 表示程序中的异常,可能是由于程序不严谨导致的,比如。这种异常和程序本身无关,所以不需要检查,属于非受检异常。行时异常,也是属于非受检异常。
2023-07-01 11:28:19
54386
2
【模拟飞行领域】微软模拟飞行2020终极版资源汇总:包含教程、机模、地景及插件下载链接和常见问题解答
2025-06-03
智慧社区管理文件,可作为学年论文项目,也可作为练手项目
2022-05-23
图书管理系统,该系统运用java驱动mysql,内含大量基础操作,阅读代码有利于提升基础操作水平。
2022-03-20
使用vue的时候数据修改后又自动置空了
2022-05-22
求执行顺序,最好有详细的图解
2022-03-11
TA创建的收藏夹 TA关注的收藏夹
TA关注的人