- 博客(48)
- 收藏
- 关注
原创 @Value
建议平时在使用@Value时,尽量都设置一个默认值。如果不需要默认值,宁可设置一个空。2、其他非单值类型2.1 数组2.2 集合类-List在properties文件中📢:如果要给集合赋值为null,需要使用EL表达式或2.3 集合类-Set在properties文件中2.4 集合类-Map📢:注意!!!:要使用EL表达式2.5 注入bean通过这种方式,可以注入id为roleServiceImpl的bean。2.6 获取bean的变量和方法2.7 静态类:用T加括号2.8 逻辑运算。
2025-03-21 14:37:12
256
原创 SpringBoot两种方式接入DeepSeek
(1)自定义请求头) {(2)自定义响应体String id,) {int index,) {(3)service@Service// 构造请求体0.7,1000// 设置请求头// 发送请求apiUrl,entity,// 处理响应= null) {throw new RuntimeException("API请求失败: " + response.getStatusCode());请求体中可以指定:调整模型、温度、最大 token 数等。
2025-02-24 17:40:24
2378
1
原创 ThreadLocal为什么会内存溢出
每个线程(Thread对象)内部维护一个 ThreadLocalMap,用于存储该线程的所有Thread对象的属性,当线程存活时ThreadLocalMap不会被回收。实例的:实际存储的值((如线程池中的线程):线程执行完任务后不会销毁,而是回到线程池等待下一个任务。该线程的会一直存在。如果是静态变量,它不会被回收(生命周期与类一致)。如果是局部变量,当方法执行完毕,实例可能被回收,导致Entry的 Key(弱引用)被自动清理。如果线程长期存活(如线程池的核心线程),且频繁使用但未清理,
2025-02-13 19:17:12
1076
原创 Redis Zset类型详细使用
你可以把任务的ID作为Zset的元素,把任务的执行时间戳作为分数。比如,你可以用用户的ID作为Zset的元素,用用户之间的相似度(比如共同好友数、兴趣匹配度等)作为分数。你可以用玩家的ID作为Zset的元素,用积分作为分数。同样,对于动态排序,你可以用动态的ID作为Zset的元素,用发布时间戳或热度作为分数。:O(NK)+O(Mlog(M)),N是最小集合的元素个数,K是集合数量,M是结果集合的元素个数。:默认情况下,ZADD返回的是添加的元素个数,但加上这个选项后,还会包含更新的元素个数。
2025-02-10 20:34:14
696
原创 分布式事务解决方案:TCC模式
TCC(Try-Confirm-Cancel)是一种补偿性事务模式,它将一个完整的业务操作分为二步完成Try: 尝试执行业务完成所有业务检查预留必要的业务资源Confirm: 确认执行业务真正执行业务不做任何业务检查只使用 Try 阶段预留的资源Cancel: 取消执行业务释放 Try 阶段预留的资源回滚操作。
2025-02-07 15:05:08
333
原创 Redis性能优化
此时的主线程依旧会接收写请求,紧接着,主线程又需要把数据写到文件内存中(write 系统调用),当主线程使用后台子线程执行了一次 fsync,需要再次把新接收的操作记录写回磁盘时,如果主线程发现上一次的 fsync 还没有执行完,那么它就会阻塞。需要注意的是,Redis 的淘汰数据的逻辑与删除过期 key 的一样,也是在命令真正执行之前执行的,也就是说它也会增加我们操作 Redis 的延迟,而且,写 OPS 越高,延迟也会越明显。如果是 never,就表示,内存大页机制被禁止。
2025-02-06 14:01:07
1040
原创 springBoot+MyBatis分包方式实现多数据源
当执行的是com.example.simplejobdemo.repository.db1包下的mapper使用的就是db1数据源,当执行的是com.example.simplejobdemo.repository.db2包下的mapper使用的就是db2数据源。
2025-02-05 11:40:24
173
原创 基于Mybatis继承AbstractRoutingDataSource使用自定义注解实现动态数据源
AbstractRoutingDataSource的核心功能是根据用户定义的规则,动态决定在特定的操作中使用哪个数据源。这通常是通过重写方法来实现的,该方法用于确定当前线程应该使用哪个数据源的键。/*** MyBatis内部根据实现AbstractRoutingDataSource类的determineCurrentLookupKey实现数据源的动态路由*/@Override/*** 静态内部类,用于从线程中获取当前要使用的数据源*/
2025-01-26 17:17:45
388
原创 几种不常用的 MyBatis 写法
bind 标签帮助我们在 SQL 中进行表达式计算,减少了 Java 中的拼接操作,使 SQL 更加简洁。多数据源支持让我们能够更好地管理不同的数据源,适用于微服务架构和复杂数据需求的场景。复用 SQL 片段能够提升代码的可维护性,避免了 SQL 语句的重复编写。
2025-01-24 16:03:06
197
原创 @Async注解
默认情况下,Spring会用一个简单的线程池来执行异步任务。可以自定义线程池的配置,比如线程的数量、队列的大小等。可以通过实现接口来完成。@Overrideexecutor.setThreadNamePrefix("自定义线程池");
2025-01-23 20:56:02
172
原创 clickhouse 分布式表创建、增加、更新、删除、查询
通过local表来更新 同时指定上集群名称;如果通过all来更新则不支持会报错。删除ck表,先删除分布式表,再删除本地表。
2024-12-18 18:30:39
886
原创 mysql-binlog的三种模式
Statement模式:适用于对日志量有较高要求,且能够确保SQL语句在不同环境下执行结果一致性的场景。Row模式:适用于对数据一致性要求极高,且不介意增加日志量和存储成本的场景。Mixed模式:是MySQL默认推荐的日志格式,能够平衡日志量和数据一致性的需求,适用于大多数常规场景。在选择binlog日志格式时,需要根据实际需求和场景进行权衡和选择。
2024-11-28 15:58:06
721
原创 反射-Field.isSynthetic()
方法定义在类中,该方法不接受任何参数,并返回一个布尔值。如果调用该方法的字段是合成字段,则返回true;否则返回false。
2024-11-06 11:23:43
409
原创 @Import
可以通过自定义的逻辑来注册额外的Bean。3. 导入实现了ImportSelector的类:如果@Import的参数是实现了ImportSelector接口的类,Spring会调用ImportSelector接口的selectImports()方法,根据返回的类名数组将相应的类注册为Bean。1. 导入其他配置类:如果@Import的参数是其他配置类(例如@Configuration注解的类),Spring会将导入的配置类也加入到容器中,使得被导入的配置类内部定义的Bean也可以被管理。
2024-10-29 16:50:51
232
原创 @Configuration(proxyBeanMethods = false)
结论:标注@Configuration(proxyBeanMethods = false)注解的配置类,类中被@Bean标注的方法将不会被spring通过CGLB代理,(1)先看 proxyBeanMethods = true (默认是true)的情况。(2)将proxyBeanMethods = true 由 true 改成false。可以看出从Spring容器中获取的依旧是单例Bean,而通过方法获取的是多实例的。
2024-10-29 15:59:56
318
原创 入参校验及全局异常处理
基于Aop思想的一种实现默认对所有Controller进行拦截也可以指定规则,类似于@ComponentScan, 则匹配org.my.pkg包及其子包下的所有Controller,当然也可以用数组的形式指定,如:@ControllerAdvice(basePackages={"org.my.pkg", "org.my.other.pkg"}), 也可以通过指定注解来匹配,比如我自定了一个 @CustomAnnotation。
2024-10-11 15:48:09
781
原创 责任链模式
log.info("StrategyCheck task 后置校验");log.info("StrategyCheck task 前置校验");其次观察者模式中所有的订阅者没有任何关联,而责任链模式中的每个处理环节具有传递性。使用场景:多个连续的功能上不相互依赖的处理环节,共同完成一项任务。log.info("执行任务。比较:与观察者模式不同的是,观察者模式中所有的订阅者可。(2) 有多个处理环节。(3)实现类-第一环节。(4)实现类-第二环节。(5)实现类-第三环节。特点:(1)顺序执行。
2024-10-09 16:52:57
515
原创 Spring 源码部分接口实践
1.自定义条件注解1.1 @conditional注解@Conditional注解是Spring框架中的一个条件注解,可以根据不同的条件来决定是否需要创建一个Bean对象。其工作原理是,在Bean创建之前根据条件判断进行筛选,只有当条件满足时才会创建Bean对象。1.2自定义条件注解(1)实现Condition接口(2)自定义注解,这样。
2024-09-29 20:50:03
1212
原创 分页查询的优化
会先把需要排序的文件加载到缓存中,因此适当增加sort_buffer_size缓存大小能优化排序性能。实际上MySQL得先扫描前10000条记录,然后丢掉,再返回后面10条。这就像你在书店找第10001本书,得先把前面的全数一遍。首先需要在查询字段和排序字段上创建合适的索引,否则数据库引擎就会扫描整张表,降级为filesort。这样,MySQL可以直接从last_id开始找,不用再从头扫描,性能杠杠的。答案是:从上一次结果中获取最大的那条记录(也就是最后一条记录)如何获取每次开始查找的位置呢?
2024-09-27 15:46:43
328
原创 动态线程池 - 配置中心nacos
4.监听nocos配置变更:更新线程核心线程数及最大线程数。注意:核心线程数不得大于最大线程数,3.创建一个单例线程池。
2024-09-19 14:37:45
264
原创 自定义拦截器
2、把拦截器放入到容器中(实现WebMvcConfigurer接口)* 1、编写一个拦截器实现HandlerInterceptor接口。* 3、配置好拦截器要拦截那些内容。
2024-09-09 16:35:14
195
原创 轻量级HTTP客户端框架—Forest
Forest 是一个开源的 Java HTTP 客户端框架,它能够将 HTTP 的所有请求信息(包括 URL、Header 以及 Body 等信息)绑定到自定义的 Interface 方法上,能够通过调用本地接口方法的方式发送 HTTP 请求。全局配置可以配置一个全局统一的SSL协议,但现实情况是有很多不同服务(尤其是第三方)的API会使用不同的SSL协议,这种情况需要针对不同的接口设置不同的SSL协议。(2)创建请求方法的实例,并指定请求URL。发送HTTP请求不会总是成功的,总会有失败的情况。
2024-08-16 17:30:55
2743
原创 MySQL 之 本地事务
是 Spring 框架提供的一个注解,用于声明事务性方法。它可以用于类、方法和接口上,以便对数据库操作进行事务管理。通过使用这个注解,我们可以控制事务的传播行为、隔离级别、超时时间以及回滚条件等参数,从而实现更加灵活和高效的事务管理。下面详细介绍一下。
2024-08-15 18:01:35
693
原创 MySQL 之 FIND_IN_SET()函数
eg:表a有一个字段name = hello,hello47 判断是否包含47这个字段(完全包含,非部分包含)函数是为逗号分隔的列表设计的,判断一个字段(其值由逗号分隔的多个子字符串组成)是否包含某个特定的子字符串。还可以根据包含的数量查询,比如查询name字段包含两个47的。此外,oracle没有内置的函数,需要使用正则表达式。
2024-08-13 18:36:26
255
1
原创 基于@within | @target | @annotation注解的AOP切面
会匹配到标注了指定注解的类,并且在该类的子类中,那些没有重写父类方法也会被匹配到。等注解结合使用,指定在特定类上执行的切面逻辑。等注解结合使用,指定在特定类上执行的切面逻辑。等注解结合使用,指定在特定类上执行的切面逻辑。就会被匹配为切点,不影响其子类和父类。@annotation注解(方法级)@target 注解(类级)@within注解(类级)只匹配标注了指定注解的类。该配置就是:如果某个。该配置就是:如果某个。
2024-08-13 18:34:23
500
原创 压缩存储GZIPOutputStream
是 Apache Commons Lang 库中的一个方法调用,用于将 Java 字符串中的转义字符恢复为其原始形式。是一个计算数据流的 CRC-32 校验和的类,主要用来验证压缩数据的完整性的。类,它实现了一个流式过滤器,主要用于以GZIP文件格式写入压缩数据。类可以用来压缩数据,那么下面给出一个压缩字符串的示例代码。数据的输出流,因此需要用到压缩器。被替换为一个换行符)
2024-08-13 18:16:38
443
原创 多线程之parallelStream
parallelStream默认使用线程池ForkJoinPool来调度的,而ForkJoinPool的默认线程数是CPU核数 - 1。总结:在使用parallelStream时要注意根据需求选择合适的线程池,避免出现线程池溢出等一系列问题。输出:使用spring框架中的 ForkJoinPool.commonPool。输出:使用的依旧是 ForkJoinPool.commonPool。举例二:使用其他线程池,如 Executors.输出:使用自定的ForkJoinPool线程池。
2024-08-05 17:04:35
1255
原创 限速器RateLimiter | 重试机制RetryTemplate | 延迟器Timer
它提供了一种简洁且灵活的方式来处理因暂时性故障而导致的操作失败,允许开发者在执行某个操作时设置重试逻辑,以确保在遇到可恢复的异常时能够重新尝试。* 定义重试策略:可以定义重试的次数、每次重试之间的间隔时间,甚至可以设置不同的重试策略(如指数退避策略)if (Math.random() < 0.7) { // 70% 的概率抛出异常。// 取消 Timer,停止所有任务。if (Math.random() < 0.7) { // 70% 的概率抛出异常。
2024-07-31 21:36:45
653
原创 Spring定时任务
方案一:基于@Scheduled注解的定时任务,修改定时规则需要修改代码,修改后需要重启项目。方案五:使用ScheduledThreadPoolExecutor定时任务线程池执行定时任务。方案三:动态定时任务,在数据库中查询定时规则,可以随时改变定时任务的执行规则。方案二:基于@EnableAsync的多线程定时任务。方案四:基于线程池的多线程定时任务。
2024-05-24 10:38:37
211
原创 SpringBoot 整合 Redis
5. 定制化 LettuceConnectionFactory。3. 定制化redisTemplate。4. 定制化缓存管理。
2024-05-23 11:06:16
1650
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人