- 博客(545)
- 资源 (7)
- 收藏
- 关注
原创 godot小白入门前的一些前置知识了解
因为游戏是由很多场景构成,比如超级玛丽的在跳跃的整个页面,比如超级玛丽是一个场景,怪兽也是一个场景等,超级玛丽这个场景中是由一个主节点,下方挂了很多字节点组成的,比如它下头可能挂了图像节点,专门给超级玛丽展示图片的,还挂了碰撞检测节点,这个节点的能力是专门用来检测超级玛丽有没有被怪兽碰撞的,等等。简单理解,你从官网下载了 godot 包之后,下载到电脑上就是一个软件,这个软件可以理解成是视频制作软件(PR,PS)和代码编写软件(idea,rider)的集合,其中既可以写代码,也可以调整视频和图片。
2025-06-08 12:58:05
399
原创 github开源协议选择
修改后的代码必须开源,商业用途、修改、分发,衍生作品必须使用 GPL 协议,强调开源精神的项目。即使通过 SaaS(云服务)使用,也必须开源,商业用途、修改、分发,防止云服务公司闭源使用代码。可商用闭源,修改后也无需开源,适合个人项目,非常宽松。允许商业用途、闭源、修改、分发。核心保留版权声明、许可证文件,明确包含专利授权条款。允许商用,闭源,修改。如:Android、Kubernetes、Apache Kafka。如:React、Vue.js、jQuery。如:Linux、GCC、Git。
2025-06-08 12:04:07
284
原创 github中main与master,master无法合并到main
github 采用 main 替代 master 作为主分支不是出于技术背景,而是出于 2020 年全球范围内兴起的 “Black Lives Matter”上传 github 时候,发现传上去的是 master,但是 github 竟然还有一个 main。从 Git 2.9 版本开始,Git 默认不允许合并没有共同祖先的分支,以此避免意外合并两个不同项。然后在 2020 年 6 月宣布将默认分支名称从 master 改为 main 了,,,如果是本地已经有的项目,使用 master 分支名。
2025-06-07 23:02:36
612
原创 java中concurrent包常用的集合类操作
常规的集合类,比如 ArrayList,HashMap 当作为多线程下共享的变量时候,操作它们时会涉及线程安全的问题。典型应用:存储热点数据,避免重复计算;适合:读多写少的场景(因为写操作时复制底层数组,读操作无需加锁)适合:需要频繁读写的线程安全的场景。
2025-06-01 18:55:25
221
原创 java synchronized关键字用法
它为了解决多线程环境下资源的竞争问题。通过互斥锁机制,确保同一时间只有一个线程可以执行同步的代码。线程对共享变量的修改会立即刷新到主内存中,其他线程可以立即看到最新的值。锁对象:当前类的 Class 对象(如 MyClass.class)锁对象:可以灵活指定(如 this、Class 对象或自定义对象)锁对象:当前实例对象(this)
2025-06-01 18:36:18
294
原创 java 多线程中的volatile关键字作用
jvm 规定,每个线程有自己的工作内存(本地缓存),对变量的读写一般在自己的工作内存(本地缓存)中进行,如果一个线程修改了共享变量的值,其他线程可能无法立即看到最新的值,因为工作内存(本地缓存)还未被更新的原因。假设 A,B 线程同时执行,假设按照操作1 - 2 - 3 - 4 这样的操作顺序执行下来,线程B看到 flag == true 时,a 应该已经被赋值为 1,所以 b 的值是 1,输出 1。volatile 声明的变量,写操作时强制将变量的修改立即刷新到主内存;
2025-06-01 17:58:32
232
原创 springboot中@Async做异步操作(Completable异步+ThreadPoolTaskExecutor线程池+@Async注解)
默认情况下,@Async 使用 Spring 的 SimpleAsyncTaskExecutor 线程池(最大线程数为 Integer.MAX_VALUE),一旦请求激增,有可能会导致 cpu 陡增和内存陡增,导致服务崩溃强烈建议自定义线程池!// 核心线程数 executor . setMaxPoolSize(10);// 最大线程数 executor . setQueueCapacity(100);
2025-06-01 17:24:03
527
原创 java ExecutorService线程池使用(ExecutorService/Completable异步+ExecutorService线程池)
使用自定义配置的线程池,// 核心线程数// 最大线程数// 非核心线程空闲存活时间// 有界队列// 拒绝策略,默认就是拒绝策略// 创建自定义线程池unit,workQueue,handler// 创建自定义线程池(周期性执行)unit,workQueue,handlerCPU 密集型:CPU 核心数 + 1(减少上下文切换)IO 密集型:2 * CPU 核心数(线程常阻塞,需更多线程)根据系统资源设置,避免资源耗尽(如 corePoolSize * 1.5)
2025-06-01 16:45:21
826
原创 java CompletableFuture创建异步任务(Completable异步+ExecutorService线程池)
推荐根据业务需求配置10, // 核心线程数20, // 最大线程数60L, TimeUnit.SECONDS, // 空闲线程存活时间new LinkedBlockingQueue<>(100), // 任务队列new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略如果使用自定义线程池,确保在任务完成后关闭线程池(executorService.shutdown())
2025-06-01 12:46:10
197
原创 springboot配置cors拦截器与cors解释
其实本质是可以这么理解:具体哪个域名可以请求我的后端服务接口,是由我后端自己控制的,我后端可以控制成让 aaa.com 的域名可以访问,也可以控制成让 bbb.com 的域名可以访问,本质是浏览器先发一个 options 预检请求,通过响应头让浏览器知道能否跨域访问,可以的话就访问了,不可以的话浏览器就报 cors 错误。当浏览器访问 aaa.com 的页面,并向 bbb.com/list 发起请求时,浏览器会先检查是否跨域:由于 aaa.com 和 bbb.com 的域名不同,属于跨域请求;
2025-05-29 14:38:10
550
原创 mybatis的mapper对应的xml写法
在MyBatis中,如果不写这样的条件判断,如果是对表的写操作,如 update,其中的 set 中当name参数为null时,生成的SQL语句会直接包含name = null,从而将数据库中的对应字段更新为NULL。如果没写 @Param,MyBatis 默认将未使用 @Param 注解的参数封装为 Map,键名为 param1、param2、…if 是独立的判断,而 choose when 更像 ifelse 逻辑,一旦判断一个满足,后续的 when 就不执行了!是可选的,但如果省略且所有。
2025-05-28 20:51:03
1219
原创 java中自定义注解
/ 元注解:定义注解的行为@Retention(RetentionPolicy.RUNTIME) // 注解在运行时保留,可通过反射读取@Target(ElementType.METHOD) // 注解只能用于方法上// 成员变量(带默认值)@Service@LogExecution("创建用户")
2025-05-28 16:24:35
209
原创 springboot配置mybatis debug的sql日志输出
在 src/main/resources/log4j2.xml 中配置 MyBatis Mapper 包的日志级别为 DEBUG,并指定输出目标(控制台或文件)开发测试环境你可以配置上这个,方便快速定位问题,生产环境不建议开启,开也是临时开启为了排查线上问题。additivity=“false” 表示不将日志传递给父级 Logger(避免重复输出)实际开发中,生产/开发/测试环境,不同的环境对应各自的 log4j2.xml。
2025-05-28 13:50:49
303
原创 mysql explain使用
通过 EXPLAIN 你可以知道:如是否使用索引、扫描多少行、是否需要排序或临时表EXPLAIN 三板斧(type、key、Extra)
2025-05-27 17:47:54
454
原创 mysql中的索引怎么用?
即逐行读取表中的所有数据块,并检查每一行是否满足查询条件如果你的查询请求的数据不仅仅包含索引中的列(即索引没有覆盖查询所需的全部列),那么数据库还需要根据索引中记录的位置信息回到表中去取这些额外的数据。这一过程就是所谓的“回表”。由于需要额外的I/O操作来访问数据行,回表通常会增加查询的开销为了避免回表带来的性能损耗,一种策略是创建覆盖索引。覆盖索引是指一个索引包含了查询语句中所有需要的数据列。在这种情况下,数据库可以从索引中直接获取所有需要的信息,而无需访问表中的数据行,从而避免了回表操作。
2025-05-27 16:32:54
934
原创 java8函数式接口(函数式接口的匿名实现类作为某些方法的入参)
是 Java 8 引入的核心概念之一,指的是 仅包含一个抽象方法的接口。它可以被 @FunctionalInterface 注解标记(可选),但即使不标记,只要满足“只有一个抽象方法”的条件,编译器也会将其视为函数式接口函数式接口可以作为 Lambda 表达式的目标类型往往通过 lambda 表达式的写法,使用一个匿名类,来实现一个函数接口。
2025-05-26 21:58:25
302
原创 springboot中拦截器配置使用
Spring Boot 在启动时会自动扫描所有实现了 WebMvcConfigurer 接口的配置类,并调用其方法(如 addInterceptors)。Spring MVC 会通过反射调用 addInterceptors 方法,将拦截器注册到 Spring MVC 的处理链中。Spring Boot 的拦截器顺序由 InterceptorRegistry.order() 控制,@Order 注解不会生效。postHandle() 和 afterCompletion() 执行顺序,先注册确后执行。
2025-05-25 22:53:09
476
原创 springboot中过滤器配置使用
你使用javaspringboot过滤器 filter 用在请求到达 controller 之前或者响应返回给用户之前往往可以用 filter 来做请求的修改,日志、权限、跨域等场景,例如:设置编码和字符集,请求头,状态码等过滤器是在请求进入容器后,但请求进入 servlet 之前进行预处理的,请求结束返回也是,是在 servlet 处理完后,返回给前端之前拦截器可以获取 IOC 容器中的各个 bean,而过滤器就不行,在拦截器里注入一个 service,可以调用业务逻辑。
2025-05-25 18:27:18
1035
原创 springboot配置redis lettuce连接池,以及连接池参数解释
如果默认按照 shareNativeConnection = true,Lettuce 会始终使用一个物理连接,所有线程共享这个连接,不会生成第二个新的连接,连接池参数不生效,官方推荐默认值,因为已经适合了大多数场景,单个连接即可满足高并发需求,避免资源浪费。lettuce 连接池的特点是:一个 lettuce 连接可以被多个线程复用,不需要频繁创建连接,其实是通过 Netty 实现了异步非阻塞,单连接即可支持高并发。
2025-05-23 18:36:13
1073
原创 springboot配置mysql druid连接池,以及连接池参数解释
空闲连接:当一个连接使用完毕,并通过相应的归还机制(例如关闭连接对象)返回到连接池中时,它就成为了空闲连接,等待下一次被获取和使用。在 springboot 的 application.yml 中配置基本方式。空闲时:定义空闲时,即上一次连接归还,到下一次连接被请求使用 之间的时间。活跃连接:未归还到连接池的。
2025-05-23 17:26:42
430
原创 mysql连接池druid监控配置
然后如果项目使用 Servlet 3.0+ 并支持注解,可以通过 Java 配置类注册来代替上方的在 web.xml 中的配置:你可以写一个 DruidWebConfig 类来继承 ServletContextListener,再重写其中 contextInitialized 方法,其中你可以注册 StatViewServlet 和 WebStatFilter,然后再 web.xml 配置一个监听即可。如果你配置了 druid 的一些基本连接池的内容,这里不赘述,那么你肯定引入了 druid 的依赖了。
2025-05-23 15:27:30
580
原创 tomcat 目录结构组成
现在非常多的 java web 服务部署在 linux 服务器中,我们服务器中的 tomcat 会有各种文件路径,看下它有哪些文件。
2025-04-02 16:52:33
448
原创 java maven依赖传递以及版本冲突
依赖中 exclusions 掉某个子依赖,目的是防止内部依赖往外部传递,比如 A -> B,B 项目中有 C 依赖,如果 A 没有直接的 C 依赖,那么 A 使用的是 B 中的 C 依赖的版本,当 B exclusion 掉了 C,则表示这个 C 依赖无法传递到 A。首先得明确,并不是 A 自己的代码逻辑使用 4.0 的 C,然后 A 项目中运行到 B 中的代码时候就按照 1.0 的 C 去跑,并不是这样的,统一在 runing 的 A 项目统一使用一个版本的 C 的依赖在 run。
2025-03-14 19:22:22
433
原创 服务调用时,多种超时时间的差别
我们在进行服务调用时候,可能会看到非常多的超时时间的配置,那这些不同的超时时间的配置有啥区别呢?一般较成熟的企业,当作服务调用时候,会有比较成熟的各种超时时间的默认配置,和配置介绍说明。
2025-02-25 13:42:39
253
原创 调用下游时候发现超时一般怎么排查
如果在调用方的超时错误日志中强制记录下游服务唯一标识(如服务名/IP+端口),这样上游也能很快判定出下游哪个服务有问题(好的方式)排查 sql 慢查询(mysql 的 slow_query_log),企业工程侧一般会有一些 mysql 平台能看到这些慢查询记录。一般工程侧,各公司会有一些 trace 追踪平台或者工具,能够查出来调用链的情况,然后下游服务的调用时间也会有展示出来。长期可以针对性的优化,比如数据库问题优化数据库,多线程问题优化多线程代码。有些企业平台侧能看到上有调用超时的记录情况图表。
2025-02-21 18:01:48
396
原创 后端开发-分页游标设计(解决大数据量分页查询时的性能问题)
一般来说 order by 的不是索引字段,或者这个字段不能添加索引,那么不建议分页游标来做,如果非要用分页游标,也需要你贴紧一个有唯一索引的字段来做,但即使是这样,首页查询也会全表扫描,后续页查询时因为会先执行 where 中的语句能缩减一点点范围。如果使用一页一页的查找数据,按照每页 10 条查找,你查找第一页,因为 id 是主键索引你能快速查找到,然后后端多返回查找到的最后一条数据的这个索引字段 id(要求这个索引需要唯一)如果你遇到的是上方描述的场景,那么分页游标就是你很好的选择!
2025-02-20 18:27:26
1170
原创 springboot+mybatis按条件分页查询多张表
使用 join 进行多表连接查询,使用 pagehelper 分页插件,通过 MyBatis 的。和 JOIN 语句实现多表关联,使用 MyBatis 动态 SQL 标签(如 )处理条件组合。我希望做分页查询用户数据,用户数据为各个表内信息的汇总,并且这个分页查询会根据各种条件来查询。创建一个 mapper 接口 selectUserWithConditions。特殊情况下:如果多张表数据量很大,线上查询流量又大,怎么办?创建 dto 做查询数据接收的对象。那么通常该如何做呢?
2025-02-17 20:34:18
458
原创 springboot+mybatis进行普通事务操作transaction
如果你是 mysql 单个数据源,一旦配置好 yml 中的 msyql 和 mybatis 之后,一般对 Service 中的方法上头加上 @Transactional 就可以直接对其开启事务了(通常情况),使用上 @Transactional 表示该方法中如果抛出未捕获的异常时就会触发回滚,这样的异常是 RuntimeException 以及子类或者 error 错误时能回滚,如果是 IOException SQLException 等异常不会回滚。
2025-02-12 17:49:13
916
原创 springboot配置mybatis/mybatis plus
使用 mybatis 首先需要写 entity 数据库操作对象// fields如果你使用 mybatis plus,还会有好用的注解来提供 @TableName,@TableField(“name”) 等使用 mybatis 首先需要写 mapper 接口,接口中的方法名和下方待编写的 xml 中的方法名是一样的@Mapper// 自己要写的 function如果你使用 mybatis plus,它提供了一个 BaseMapper 可以继承,继承后其中有许多定义好的基本的数据库操作方法可以使用。
2025-02-11 20:21:21
1212
原创 springboot配置redis
配置完成 yml 后,你无需再配置 RedisTemplate 和 StringRedisTemplate 的 Configuration 代码了,因为 Spring Boot 会自动配置 RedisTemplate 和 StringRedisTemplate,你可以直接注入它们来操作 Redis@Bean// 使用StringRedisSerializer来序列化和反序列化redis的key值。
2025-02-07 21:14:11
348
原创 springboot配置mysql数据源(单个/多个数据源)
如果你配置单个 mysql 数据源,你完全做 mysql 数据源的 configuration,无需指定数据源和 mapper 包的映射关系,即你只用配置 yml,然后对应接口打上 @mapper 注解,就可以使用 mybatis 提供的 api 来进行数据库的操作,操作数据库 @mapper 标记的接口会自动使用 yml 中配置的唯一的数据源。你使用 springboot 框架,希望配置 mysql 数据源,你可能使用 mybatis 或者 mybatis plus 框架。
2025-02-07 20:38:01
1337
原创 springboot启动后初始化执行一批代码
还有一个也比较常用 ApplicationRunner,用起来和 CommandLineRunner 类似。其实 springboot 提供了很多接口来实现这一点,这里用 CommandLineRunner 方式。并且你甚至可以定义多个 CommandLineRunner 实现类,可以通过。应用启动后会立即执行,并且可以访问命令行参数(args)注解或实现 Ordered 接口来影响执行顺序。如果想各种顺序想写在一个类中,你甚至可以这么写。希望在应用启动后执行一些代码逻辑。
2025-02-06 17:30:52
271
原创 springboot+mybatis(mybatis plus)分页查询
如果你使用 springboot + mybatis plus,因为 mybatis plus 兼容 mybatis,所以即使你使用 mybatis plus 依然可以用如上方法来做分页查询,当然 mybatis plus 既然是 plus,他自己也有分页查询的一些能力,再往下会有 demo。如果你使用 mybatis 但不是 spring 项目,那么你需要首先引入 pagehelper 相关依赖,然后配置 mybatis-config.xml 分页插件,再然后在代码中使用即可。
2025-02-06 16:54:07
1147
原创 springboot项目的单元测试
Spring 中如果 Parent 类中通过 autowire 方式注入 Child 类,然后我在 springTest 测试方法中去 new 这个 Parent,我可以使用到其中的 Child 吗?回答:不行,会导致 Child 是 null,报空指针异常,因为 new 关键字创建的实例不是由 Spring 容器管理的,所以 Spring 不会为这个实例注入任何依赖。在 test 包下编写,对于普通的业务逻辑,直接常规使用 junit 的 @Test 注解即可。这样可以让其成功注入 bean。
2025-02-06 14:48:39
410
原创 springboot配置log日志
当然如果你不指定这个路径也可以,因为 springboot 会根据项目引入的日志框架,自动加载 resources 的日志配置文件,比如 springboot 项目是有 spring-boot-starter 的(其中含有 spring-boot-starter-logging),会尝试加载 logback-spring.xml 和 logback.xml 如果二者都不存在,则使用内置的默认 Logback 配置。如下是简单的日志文件配置,使用的是 logback 日志。
2025-02-06 14:29:03
663
原创 idea上git log面板的使用
当在 idea 中你选中某个分支后,这个分支在 git log 路线图中会以一条直线来呈现。每个节点表示 commit 到了一个新的版本了。路线中,每条路线其实是一个分支。
2025-01-15 14:43:32
900
原创 java远程调试debug
自己随便弄一个 idea 的项目,其中配置 configuration,Remote JVM Debug,输入被调试服务所在的 ip 以及 port。被调试的 java 服务需要开启允许被远程调试的配置,具体就是启动脚本中,加上允许被远程调试以及相应端口。
2025-01-11 16:12:44
408
原创 css样式:flex布局
一种非常常用的布局方式,Flex 是 Flexible Box 的缩写,弹性布局指定容器 display: flex 即可,可以将其定义为一个Flex容器Flex布局一般只作用到直接的子元素上。
2024-11-16 17:38:50
1275
mysql练习题-sql建表文件.txt
2020-03-12
typora-cobalt-theme-master-v1.1.zip
2020-06-01
Xcode Midnight.jar.zip
2020-05-30
Windows Update Blocker v1.1.zip
2020-04-19
mysql练习题-sql_practice.pdf
2020-03-12
datagrip 数据库切换主键的问题
2024-11-09
TA创建的收藏夹 TA关注的收藏夹
TA关注的人