IntelliJ 2023.2 版本在 MacOS 上表现卡顿问题的解决
IntelliJ MyBatis 的 XML 文件自动映射到数据,并提供 SQL 代码提示
IntelliJ 自用的根据数据库表生成实体类的脚本
1 | import com.intellij.database.model.DasTable |
生成的实体类预览
1 | package com.hfky.pmms.workbench.patrol.group.model; |
SpringBoot --- 实现实时消息推送的解决方案汇总
方案
- 短轮询
- 长轮询: 可以使用 Spring 提供的
DeferredResult
实现 - iframe流
- SSE: 服务器响应
text/event-stream
类型的数据流信息,思路类似于在线视频播放
1 | <script> |
1 | private static Map<String, SseEmitter> sseEmitterMap = new ConcurrentHashMap<>(); |
- MQTT
- WebSocket
OpenWrt --- 作为旁路网关/旁路由/透明网关供 Google TV 联网激活
背景
家里的主路由是 iKuai 的,无法安装科学插件,于是想到使用 OpenWrt 作为旁路网关供家里的一些设备上网
我的方案是在群晖上安装 OpenWrt 系统虚拟机来做旁路由
折腾过的方案
一开始使用过群晖的 Docker 套件部署 clash-premium 容器用来做旁路网关
这种方法需要注意的是需要使用 macvlan 创建一个独立的 docker 网络,用来的到和局域网同网段的新的 IP
最终失败了,提示内核不支持的 tun 模式的功能
后来我找了一个旧的笔记本直接运行编译后的二进制的 clash-premium 版本, 也是提示内核不支持,系统是 CentOS 7.2, clash-premium 版本是最新版
安装虚拟机
选择的 OpenWrt 固件: https://openwrt.mpdn.fun:8443/?dir=lede/x86_64
选择 【高大全版】
在群晖里安装套件 Virtual Machine Manager
之后
- 新增硬盘映像,选择下载并解压出来的 img 文件
- 到【虚拟机】栏,选择【导入】虚拟机,选择从 【硬盘映像导入】
- 创建虚拟机, 这里注意在创建虚拟机时网卡记得选 e1000, 否则虚拟机运行后, OpenWrt 界面显示网络接口是 半双工的
修改 OpenWrt 配置
- 修改 /etc/config/network 网络配置文件,修改 “lan” 一栏的 IP 地址,网关,DNS, 修改完成重启
- 登录 OpenWrt, 用户名密码 root/password
- 来到【服务】- 【OpenClash】- 【配置订阅】导入配置信息,并配置自动更新
- 再来到 【插件设置】 - 【版本更新】,这里要下载 TUN 内核, 如果下载失败,点下载到本地,手动下载,并通过 【系统】- 【文件管理】上传到 /etc/openclash/core/ 目录下, 并授权可执行,
chmod +x /etc/openclash/core/clash_tun
- 再来到 【模式设置】选择 Fake-IP (TUN) 模式运行
- 再来到 【网络】- 【接口】LAN 接口设置, 基本设置, 关闭最下方的 DHCP 服务器, 选择 【忽略此接口】
- 最后来到 【DHCP/DNS】- 【高级设置】, 滚到最下方,添加 【自定义挟持域名】, 添加一条记录
time.android.com 203.107.6.88 安卓时间服务器
修改客户端配置
有 3 中方法可以配置
- 可以到 iKuai 的 【网络设置 > DHCP设置 > DHCP静态分配】手动下发网关地址
- 可以在 iKuai 的 【网络设置 > DHCP设置 > DHCP服务端】设置网关地址和首选 DNS 地址
- 手动修改 Google TV 的网络设置为静态
因为我这里是首次激活,需要采取第一种方式或者第二种方式,后面激活成功后,可以还原配置,使用第三种方式
坑记录
Google TV 首次激活会联机安卓的时间服务器进行校时,不通的话会无法连接 WiFi,这就要求 WiFi 能科学上网并且能正确访问 time.android.com
域名解析请求是 UDP 访问方式,需要旁路网关支持 UDP 转发
而满足这个要求需要 DNS 劫持
这里有个重要的点就是,OpenClash 需要开启 Fake-IP (TUN) 模式运行,
否则的话域名劫持无法解析,使用 ntpdate time.android.com
会提示 no server suitable for synchronization found
错误
SpringBoot --- @Transactional 注解关于事务的记录备忘
背景
@Transactional是一种基于注解管理事务的方式,spring通过动态代理的方式为目标方法实现事务管理的增强。
@Transactional使用起来方便,但也需要注意引起@Transactional失效的场景,本文总结了七种情况,下面进行逐一分析。
场景
- 异常被捕获后没有抛出
- 抛出非 RuntimeException 异常
- 方法内部直接调用
- 新开启一个线程
- 注解到 private 方法上
- 数据库本身不支持 (mysql数据库,必须设置数据库引擎为InnoDB)
- 事务传播属性设置错误
手动回滚事务和提交事务
- 回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
- 提交
引入 PlatformTransactionManager Bean1
platformTransactionManager.commit(TransactionAspectSupport.currentTransactionStatus());
也可以使用 platformTransactionManager 来回滚事务