- 博客(159)
- 收藏
- 关注
原创 Spring事务提交时机与并发可见性问题总结
Spring声明式事务(@Transactional)并不一定在方法return前提交,AOP代理机制导致的“锁释放到提交事务之间的时间窗”是一个常见陷阱。编程式事务(TransactionTemplate)配合可以让事务提交和锁释放顺序严格受控,彻底消灭并发下的可见性漏洞。
2025-06-06 00:20:27
391
原创 记录被mybatis一级缓存坑的问题
我是通过其他方法调用A方法去查询的,但是有一天我发现有个方法连续调用了A方法五次,每次只有第一次有结果,后续的四次调用在A方法的查询代码中返回的List都是空的,我查资料说是mybatis一级缓存的问题,但是我这里查询的动作都是在A方法中的,理论上应该是每次调用A方法查询的都是新的集合,但是只有第一次调用有结果,其后续调用都是空集合。我之前有个方法需要多次调用数据库拿数据,由于每次查询数据比较少,所以我前期都是直接查数据库拿的,准备后面再改缓存。
2025-06-03 13:22:51
302
原创 @JsonFormat时区问题
由于注解优先于配置文件生效,所以确实以年月日返回了,但是时区不对所以导致返回的时间不一致,可能是@JsonFormat默认时区是timeZone为GMT(即标准时区),和北京时间相差8小时,所以需要显式配置。对于Java类型为Date类型的确实生效了,但是有些场景需要单纯返回yyyy-MM-dd格式的日期,就需要加@JsonFormat注解,我一开始添加的是。#json 时间戳统一转换。我在配置文件中添加了。
2025-05-23 15:44:25
296
原创 @XXX@占位符和${XXX}占位符区别
需要注意的就是在maven的pom文件里使用的占位符是${XXX}形式的,这是给pom文件内部使用的,但是如果springboot的配置文件yaml/yml想使用maven定义的值时必须用@XXX@引用,如果使用${XXX}不生效。maven的内部占位符也可以在构建时动态指定,使用-Dkey=value 或者 你定义了profiles多环境配置也可以使用-P[dev|test|prod]激活指定环境引用里面的属性。
2025-05-08 13:49:35
154
原创 关于在Springboot中设置时间格式问题
以上这些配置根据项目情况选择合适的序列化/反序列化方案,这些方案适用于json的入参/出参的序列化规则,也就是说,当你的入参是json格式时,对应的时间只要适用于你规定的格式,那么jackson将会自动处理。如果项目中的时间采用的是LocalDateTime、LocalDate、LocalTime等JDK8时间类,Jackson默认情况下不支持这些时间类的序列化,那么我们需要显式的配置它。如果你的项目比较乱,这些类混合在用,那么你需要在显式配置的时候捎带上Date类如何序列化的规则,如下。
2025-04-22 20:40:47
579
原创 解决IDEA中自动生成返回值带final修饰的问题
2、在自动生成的地方,仔细观看final下面带有下划线,说明此处存在快捷键,这时按下ALT + F, 选项框会取消勾选Declare final. 回车接受.此后自动生成的返回值就不会带有final修饰.1、在settings选项下,Editor–Code Style–Java–Code Generation,确保红框内的两项不被勾选。
2025-04-10 14:21:20
534
1
原创 线程对局部变量以及对只能通过当前线程的局部变量才能访问到的对象进行的操作总是线程安全的
局部变量是指在函数或代码块内部定义的变量,其作用范围仅限于定义它的函数或代码块内部线程安全是指多个线程访问共享资源时,不会破坏资源的完整性。
2025-03-27 20:27:12
300
原创 Thread.join源码分析
这是Thread.join的核心代码,实际上join方法有重载,分别为join()和join(long millis),在join()方法中实际上执行的是join(0);所以最终都会进入到上述代码块中。我们知道当调用一个线程对象的join方法时,实际上是让当前线程等待该线程对象执行完成。这里要区分当前的和,这是两个概念。
2025-03-25 14:28:12
569
原创 多线程中对共享变量的操作必须保证互斥
不可见”并非绝对:即使未同步,某些情况下修改仍可能被其他线程“偶然”看到(例如JVM因内存压力自动刷新缓存)。但这是不可预测的,不能依赖。可见性 ≠ 原子性:即使线程B的修改偶然可见,也无法保证线程A读取到的是“完整修改后的值”(例如对long或double的非原子操作)。在多线程代码编写中,对于共享变量的操作不要在未同步的情况下读写,一定要保证可见性,不管是加锁还是volatile修饰。未同步的操作:若线程修改共享变量时未通过锁同步,JVM不保证其修改对其他线程可见(可能停留在本地缓存中)
2025-03-23 15:11:06
144
原创 MySQL中count(*)与count(字段区别)
的结果,我们都知道A left join B时A的结果是一定存在的,当一对多时就会A有多个相同的结果,这个时候如果A left join B的同时在后面补上删除掉B1的条件,那么结果就只有一行了,像这种情况下左边的A1同样也就会少一行。我想表达的意思时,当在连接条件主动额外删除B表的数据时,实际上总体结果数量也被删除了(删除了一整行,除非下面在一条数据的情况下才会保留左表数据,因为只剩一行了),像这种情况发生时,你不管count(A表连接B表,若A和B是一对多的关系时,会出现。只有在这种情况下count(
2025-03-13 17:23:59
246
原创 关于分布式的误区
分布式系统是一个硬件或软件组件分布在不同的网络计算机上,彼此之间仅仅通过消息传递进行通信和协调的系统。通俗的理解,所谓分布式系统,就是一个业务拆分成多个子业务,分布在不同的服务器节点,共同构成的系统称为分布式系统,同一个分布式系统中的服务器节点在空间部署上是可以随意分布的,这些服务器可能放在不同的机柜中,也可能在不同的机房中,甚至分布在不同的城市。
2025-03-10 16:42:19
481
原创 Springboot-mybatis配置多数据源
先在配置文件中定义数据库连接的基本信息,我这里是举例子所以设定了两个MySQL数据库。一般是支持同时配置不同数据库的。可以大致看一下OMS数据源配置类的注释,基本都写了这个配置类做了什么。在写完配置文件之后,我们需要写相应的配置类去读取数据库的连接信息。
2025-03-07 11:21:05
220
原创 Debian系更新软件包时忽略指定的包
我安装的是Debian12系统,有时会更新软件包,但是由于我安装了docker,国内配置的软件源-清华源无法加速,从官方下载速度极慢,经常失败,我也没有更新docker的需求,所以这里记录下忽略docker的过程。
2025-02-28 13:43:16
360
转载 Xshell的SSH断开无法连接
可通过网页控制台进入系统,服务器供应商都会提供对应的网页控制端,可登陆系统,网页登录不受影响。xshell再次连接,成功。//进入到ssh秘钥目录。
2025-02-16 02:17:26
203
原创 debian12安装后的一些设置
之前在家里捣鼓的都是CentOS,后来听说停止维护了,这次安装Debian系统,由于是第一次安装,遇到了一些奇奇怪怪的问题,这里记录一下。
2025-02-16 02:14:23
1491
原创 一个类就创建Json反序列化所需的属性
平时我们开发的时候总是会有对接其他系统的需求,其他系统返回的Json并不总是简单的这种类型,有可能里面包含的数据比较杂,会出现多层嵌套呀,数组的值这种情况,我们反序列化的时候用Map当然也是可以处理的,就是比较麻烦,得一直去找,所以一般会创建一个类接收,但是遇到Json嵌套的比较多的时候并且里面的k和v属性也比较多的时候额外创建其他类又太麻烦,这种情况下我们可以使用Java的静态内部类去处理,如下。
2024-12-19 22:41:37
384
原创 终于知道大家为啥用Jackson进行json序列化的多了,记录下
之前我一直用的Gson,感觉Gson很方便,方法名简洁易懂,但是有次我对接其他平台的接口时,对方返回的json里的值是小数,使用Gson反序列化总是会处理成Double类型,尤其是需要先反序列化成Map之后再拿里面的值去转成对象时比较麻烦,看网上有解决Gson反序列化为小数的文章,配置了好一会也没配置好,就直接用Jackson了,确实很牛,可以正确识别原来对象的格式,不需要转换了,再贴下配置ObjectMapper序列化时间啥的吧,自用记录下。
2024-12-18 23:41:32
228
原创 记一次自定义类型处理器未生效的原因
之前分享过Mybatis连接PGSQL数据库,为了操作方便增加了一些类型处理器的文章,那时使用的是Springboot框架,,当时直接启动项目就注册了这些类型处理器,今天接触了新项目也要用到这些类型处理器,就自然而然的复制了过来,没想到启动项目不生效,找了半天才发现原因,这个项目是Springboot多模块的,然而我放置的位置在Springboot启动类所在的包的外面,所以导致即使加了@Configuration也无法被扫描到,根本就没生成Bean!
2024-12-18 23:30:25
270
原创 docker查看指定时间范围的日志
最后的> logs.txt 表示将容器日志输出到某个文件,这里输出到当前文件夹下的logs.txt。一般拉服务器日志到文件中使用docker logs ,会添加时间范围以更精确定位问题,就像下面。-t 针对每行日志添加时间戳。
2024-11-06 00:37:03
771
1
原创 Java关于相对路径和绝对路径
/ 最推荐 类加载的形式读取数据 不用在意源代码和编译后的文件的位置.class一般源代码和编译后的jar包中的资源位置都不一样的,这样获取类路径的方式可以保证不出错,下图可以看到实际都是从类路径中拿到的。
2024-10-19 17:38:17
973
原创 方法引用中为什么签名看起来不匹配也可以引用?(未绑定的方法引用)
实际上this是作为普通方法的第一个参数被传入的,如果一个普通方法有多个参数,那么this是排在第一位(只是被隐藏了),后续参数按照代码顺推的,所以我们有时可以看到方法引用没有严格按照方法签名去匹配,就是这个原因,就像下面这样。其实Java中的普通方法是有隐藏参数的,这个参数就是我们熟悉的this,所有的普通方法都是一样的 比如下面的eat方法。但是在JVM的角度上看,实际调用实例方法需要有一个this对象,你可以像下面这样去想。(但实际方法签名不是这样的,签名还是以我们看到的为准。
2024-10-17 00:02:04
281
原创 在mybatisPlus项目中引入pageHelper导致依赖冲突
可以看到是因为jsqlparser依赖导致的冲突,这两个jsqlparser依赖的版本源码中有些方法被改变了,导致运行的时候找不到方法报错,这里我把pageHelper中自带的jsqlparser给排除掉就好了。其实依赖冲突的原因有很多,报错的原因也不一定是找不到方法,具体情况需要具体分析。假如你需要在mybatisPlus框架中引入pageHelper插件,需要注意是否存在冲突,我之前就在项目中引入了该分页插件导致项目起不来,这里你可以使用idea中下载的maven Helper插件去查看冲突,如下图。
2024-10-10 12:59:06
533
原创 mybatisPlus对于pgSQL中UUID和UUID[]类型的交互
在PGSQL中,有的类型是UUID和UUID[]这种类型,在mybatis和这些类型交互的时候,Java中的类型可以设置为UUID和List,这是兼容的,可以正常读取和更新,但是在使用mybatis-Plus框架时就不行,需要手动设置类型处理器才可以,这里记录一下类型处理器的设置。配置完之后需要在实体类的对应属性上添加注解以使其生效。
2024-10-09 13:08:50
1108
原创 mybatis连接PGSQL中对于json和jsonb的处理
tips:本来是找了好久,都不知道该如何处理这种json/jsonb类型的,后来上网查资料才看到pgSQL的驱动包里有这个PGobject类型的。
2024-10-07 23:50:47
819
2
原创 mybatis自定义类型处理器
其实使用MySQL或Oracle数据库很少会遇到自定义类型处理器的情况,之前是因为项目中使用了PGSQL才接触到这块的,这里简单做一下记录要创建一个自定义的类型处理器,就需要继承BaseTypeHandler类或者实现TypeHandler接口(至于他俩的区别,说是BaseTypeHandler已经提供了一些基础实现,建议优先使用这个,这个没研究),重写其中的方法,如下图我这里创建的是针对String类型的类型处理器,在每个方法调用时做了简单的打印然后在XML中应用即可 ,非常简单。
2024-10-07 23:27:42
491
原创 MySQL随便写写
开启事务的时候,如果进行查询数据的话,那么这些数据是不会被上锁的,除非你显式的使用for update(X锁)或者for share(S锁)进行上锁,不然这些数据在事务未提交的时候也可以被其他事务修改。update语句自动加X锁。
2024-08-05 22:40:29
146
1
原创 Java类的初始化顺序
静态代码块仅在类加载的时候执行一次!重复创建对象不会重复执行!其实setter方法没必要加,是我手动调用的,所以顺序依次为。
2024-07-24 23:04:58
234
原创 Springboot循环依赖的解决方式
这个其实我也不好说,我自己写代码从来没有发现有循环依赖的问题,每个类确定好自己的职责,将方法正确的放入该类去引用bean一般就不会出现这种问题。这里我就描述一下循环依赖的产生吧,就是在容器启动过程准备bean的时候,会检测bean中是否注入了别的依赖,如果有就再去生成别的依赖对象注入到bean中,但是会发生这么一种情况,我有A,B两个@service,在A类中我通过注解引入B,然后再在B类中通过注解引入A,这个时候理论上就会无限产生A和B的实例,递归创建bean了属于是。
2024-07-24 22:56:42
775
4
原创 泛型的继承使用
图片描述的是我创建了一个TupleList类继承ArrayList,ArrayList中指定的泛型类型为TupleFour,并且TupleFour中的泛型可以看到和子类是一样的<A,B,C,D>,我之前在想为什么TupleFour类型的泛型也需要写,不写不也可以吗?当你定义一个泛型类,实例化时需要指定类型,如果不指定默认就是Object类型。所以我认为泛型的继承使用时,得先看子类定义的泛型,父类使用子类的泛型标记时,那么就产生一个约束的作用,编译器会帮你做类型检查。
2024-05-21 14:55:15
298
原创 VMware虚拟机网络配置
桥接模式其实就是借助你宿主机上的网卡进行联网和通信,所以相当于虚拟机和宿主机平级,处于同一个网段中。需要将这些信息修改为和宿主机同一网段即可,然后重启虚拟机或者重启网络服务。以上都完成之后可能会出现宿主机可以ping通虚拟机,但是虚拟机无法ping通宿主机的情况,这种情况大概率是因为宿主机的防火墙给拦截了,这种情况只需要到Windows防火墙开放【虚拟机监控】即可多台虚拟机按上述相同配置都可以互相ping。
2024-02-15 16:09:25
1090
原创 Java中多线程的中断状态
在Java中,我们创建完线程之后可能需要在某些情况下去停止线程的运行,一般的话可以手动在线程中设置一个flag,规定当flag为真时继续执行,当flag为假时停止执行。在Java中也给我们提供了一个叫【中断状态】的东西,我们可以调用线程的某些方法去控制该线程的中断与否。
2023-11-12 21:47:32
296
原创 MySQL创建和指定用户权限
详细见https://sourcebyte.vip/article/272.html或https://baijiahao.baidu.com/s?
2023-10-29 23:29:23
157
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人