策略模式
策略模式策略模式通过定义一族算法类,将每个算法分别封装起来,让它们可以互相替换。策略模式可以使算法的变化独立于使用它们的客户端 策略模式主要包含以下角色: 策略接口(Strategy):定义所有支持的算法的公共接口。客户端使用这个接口与具体策略进行交互。 具体策略(Concrete Strategy):实现策略接口的具体策略类。这些类封装了实际的算法逻辑。 上下文(Context):持有一个策略对象,用于与客户端进行交互。上下文可以定义一些接口,让客户端不直接与策略接口交互,从而实现策略的封装。 下面我们通过实现一个计算器来简单说明策略模式 首先定义策略接口 123public interface Operation { double execute(double num1, double num2);} 接下来,我们创建具体策略类来实现加法、减法和乘法运算 1234567891011121314151617public class Addition implements Operation { @Override ...
MP实现多数据源
SpringBoot整合MybatisPlus实现多数据源背景项目中需要对数据进行冷热分离,根据数据的一些特性从热库中迁移到冷库中,查找数据时如果热库找不到需要从冷库中查找,这个时候我们希望在程序中能够使用双数据源 引入依赖123456<!--多数据源--><dependency> <groupId>com.baomidou</groupId> <artifactId>dynamic-datasource-spring-boot-starter</artifactId> <version>3.6.1</version></dependency> 配置文件配置多数据源1234567891011121314151617181920212223server: port: 8000spring: datasource: dynamic: primary: hot# 配置默认数据库,及没有注解指定时走的数据库 ...
Redis实现分布式锁
...
IDEA远程DEBUG
IDEA远程Debug首先在服务端启动命令加上 1234# jdk8 address可以是任意开放的端口-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=33211# jdk9之后-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:33211 dockerfile的启动命令变成 1ENTRYPOINT java -jar -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=33211 chatspace-user-1.0.jar 然后我们需要开启docker远程访问功能 123456789vim /usr/lib/systemd/system/docker.service# 注释掉上面的一句,然后添加下面一句,记住9527的端口,防火墙、安全组都需要开启!!# ExecStart=/usr/bin/dockerd -H fd://...
websocket获取SpringSecurity异常
Websocket获取SpringSecurity用户信息失败问题问题描述项目中将用户的信息保存在SpringSecurity的安全上下文中,通过安全上下文获取用户id,但是在Websockt中 UserDetailsImpl userDetails = (UserDetailsImpl) SecurityContextHolder.getContext().getAuthentication().getPrincipal();发生空指针报错 问题分析WebSocket 协议与 HTTP 协议是不同的,它们是两种独立的协议,SpringSecurity是基于http协议的安全框架,所以websocket无法获取SpringSecurity中的安全上下文 解决方法ws是通过http协议升级而成的,所以可以在握手期间将安全上下文设置在会话的attribute中,然后ws通过attribute获取信息 12345678910111213public class WebsocketInterceptor implements HandshakeInterceptor...
Spring事务失效问题
Spring中事务失效问题问题描述在项目中某个业务中,需要调用自身服务的另一个接口,被调用方函数的事务就会失效 问题分析在Spring中事务是通过AOP切片控制的,在同一个类中调用方法会隐式的使用 this.调用而不是spring的切片方法 解决方法获取Spring的AOP代理对象进行方法调用,这样就可以保证事务切片正常运行
Mysql日期转换异常
MySQL的datetime和Java的LocalDateTime转换失败报错信息如下1234567891011121314org.springframework.dao.InvalidDataAccessApiUsageException: Error attempting to get column 'time' from result set. Cause: java.sql.SQLFeatureNotSupportedException; null; nested exception is java.sql.SQLFeatureNotSupportedException at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:96) at...
运行jar包没有主属性清单
运行jar包没有主属性清单问题描述java程序打jar包通过java -jar命令运行的时候报错没有主属性清单 问题分析出现这个报错主要就是两个原因: 缺少了项目maven打包插件 spring-boot-maven-plugin。 没有指定具体的项目的Main方法入口或启动类。 解决方案1.pom.xml文件中添加以下代码 12345678910111213141516171819202122232425262728<!-- 打包格式 --> <packaging>jar</packaging> <!-- 打包插件 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> ...
记一次@Builder引发的BUG
记一次@Builder引发的Bug问题描述:使用MybatisPlus的selectOne方法搜索一个User类时报错 1234567org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java.lang.IndexOutOfBoundsException: Index: 1, Size: 1### The error may exist in com/qgStudio/pedestal/mapper/UserMapper.java (best guess)### The error may involve com.qgStudio.pedestal.mapper.UserMapper.selectOne### The error occurred while handling results### SQL: SELECT ...
记一次小学问开发数据库异常
AI-Learning一次bug背景和排查bug出现在实践课代码提交接口上,源代码为 12while True: print(1) 运行是没有问题的,提交到judge0可以正常拿到token,用token也能正常拿到结果,问题出在存储到数据库的过程中,因为上述循环输出结果太长,把mysql的text撑爆了 导致提交记录一直没有更新,一直处于提交中的状态 这里可以去查一下mysql的text长度上限是多少 TEXT 65,535 bytes ~64kb MEDIUMTEXT 16,777,215 bytes ~16Mb LONGTEXT 4,294,967,295 bytes ~4Gb 所以在插入数据库前需要判断截断,做特殊处理 反思任何跟数据库相关的数据在落库之前一定要做校验,不止是从用户端拿来的数据还是调用第三方接口得到的用户,还有就是除了数据正确性外,还要注意数据长度