- 博客(116)
- 收藏
- 关注
原创 tornado 下载文件,显示下载速度、已下载大小、剩余时间、进度条、文件总大小
tornado 下载文件,显示下载速度、已下载大小、剩余时间、进度条、文件总大小
2024-08-06 16:09:25 409
原创 spring boot jar 启动报错 Zip64 archives are not supported
spring boot 版本是 2.1.8.RELEASE,引入以下 phoenix 依赖之后启动报错:java.lang.IllegalStateException: Zip64 archives are not supported
2024-06-25 18:18:17 1027
原创 Thread.stop() 与 ThreadDeath 的理解、注意点以及误区
Thread.stop() 与 ThreadDeath 的理解、注意点以及误区
2023-04-07 09:32:15 927 1
原创 MySQL 普通查询、流式查询、游标查询以及使用 mybatis 如何实现
MySQL 普通查询、流式查询、游标查询以及使用 mybatis 如何实现
2023-03-18 14:54:33 6291
原创 docker kali 安装 xfce4 桌面 + tigervnc + novnc
docker kali 安装 xfce4 桌面 + tigervnc + novnc
2022-12-15 10:09:56 3067
原创 docker Centos 7 安装 xfce4 桌面 + x11vnc + novnc
docker Centos 7 安装 xfce4 桌面 + x11vnc + novnc
2022-11-05 15:46:05 3183
原创 命令行版 Centos 7 虚拟机安装 xfce4 桌面 + x11vnc + novnc
命令行版 Centos 7 虚拟机安装 xfce4 桌面 + x11vnc + novnc
2022-11-04 17:04:14 4450 1
原创 ArrayBlockingQueue、LinkedBlockingQueue 区别
ArrayBlockingQueue、LinkedBlockingQueue 区别
2022-07-06 17:45:56 474
原创 FeignClient 支持占位符及其原理
问题与解决方案在使用 FeignClient 的时候,测试环境和线上环境的域名是不同的,可以使用占位符来动态配置。如下@FeignClient(name = "test-feign", url = "${feign.url}")public interface TestFeignClient { ...}application.propertiesfeign.url=localhost:8080原理坑人的是 FeignClient 的注释中只说了 value、name 支持占位符
2021-12-13 17:55:44 2737 3
原创 SpringBoot 中怎么方便的使用 LocalDateTime
Spring 中主要有两种使用 LocalDateTime 的方式需要格式化,如下:LocalDateTime 作为 Controller 的参数LocalDateTime 是某实体类的字段,实体类作为 Controller 的参数LocalDateTime 作为 Controller 的返回值LocalDateTime 是某实体类的字段,实体类作为 Controller 的返回值@RestControllerpublic class TestController { @GetMap
2021-12-07 23:30:17 4168 6
原创 Redis 分布式锁的一些问题
无法释放锁,导致死锁如下,执行业务代码时如果宕机了,锁就无法释放,后续其他线程无法获取锁,导致死锁。doXXX() { if (!lock(key)) { reture false; } try { // 业务代码 } finally { unlock(key); }}lock(key) { return setNX(key, "");}解决办法:添加超时时间,如下lock(key, timeout) { if (setNX(key, "")) { // 10
2021-10-23 19:51:42 598
原创 Springboot、EasyExcel 发送带附件的邮件
主要依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.11</version></dependency><dependency> <groupId>org.springframework.boot</grou
2021-10-18 18:28:02 900
原创 springboot java mail 超时配置不生效
问题最近上线了定时发送电子邮件的功能,是基于 SpringBoot 的。但是经常出现卡死的情况,导致客户频繁咨询客服同志,使用 jstack 查看,发现线程每次都是卡在了如下的地方,很显然 SocketInputStream.socketRead0() 是在等待邮件服务器的响应,但由于某些原因一直没有响应,就会一直卡着。又因为是单线程的模型(xxl-job 的单机串行),所以一个卡着就会导致后面的都无法发送。"Thread-10" #54 prio=10 os_prio=0 tid=0x00005627
2021-10-08 21:51:03 2018
原创 定时任务异常终止 spring VS JDK
之前遇到过定时任务异常终止的问题,此次对 jdk 的 ScheduledThreadPoolExecutor 与 spring 的 @Scheduled 进行了测试以及源码的分析。测试每秒执行一次,当 count == 3 时抛出异常。JdkTestpublic class JdkTest { private static final ScheduledExecutorService EXECUTOR = new ScheduledThreadPoolExecutor(1); p
2021-10-06 16:43:11 1035
原创 Iterator、ListIterator 使用时的注意点
Iterator 是集合框架的重要组成部分,用来封装集合的遍历。ListIterator 扩展了 Iterator,添加了一些针对 List 的方法,比如向前遍历、添加、更新。同时迭代器在使用时会有一些坑。Iterator简介、测试public interface Iterator<E> { /** * 迭代器没有到达末尾则返回 true */ boolean hasNext(); /** * 返回下一个元素,或者抛出异常 NoSuc
2021-09-14 00:33:08 452
原创 TemporalAdjusters 与 TemporalAdjuster
TemporalAdjuster 是调整时间对象的策略接口。有两种使用方式,更推荐第二种用法:temporal = thisAdjuster.adjustInto(temporal);temporal = temporal.with(thisAdjuster);public interface TemporalAdjuster { Temporal adjustInto(Temporal temporal);}TemporalAdjusters 实现了一些标准的调整器:本月的第一天
2021-08-14 15:14:32 493
原创 Collectors.toMap 报错 NullPointerException
最近线上偶尔会报一个 NPE,是 Collectors.toMap 导致的,这里小记一下,防止再次踩坑。场景:批量查询用户信息,查询结果为 List<User>,然后将其转换成 Map<Integer, String>,以供其他地方使用,但在 Collectors.toMap 时抛出了异常 NullPointerException。复现问题public class ToMapTest { public static void main(String[] args)
2021-08-12 21:15:15 4314 4
原创 MySQL 字符串类型
MySQL 中的字符串大体分为三类,这里不讨论第三类:长度以字符为单位的(character string 或 nonbinary string):CHAR、VARCHAR、TEXT(共四种:TINYTEXT、TEXT、 MEDIUMTEXT、LONGTEXT)长度以字节为单位(binary string):BINARY、VARBINARY、BLOB(共四种:TINYBLOB、BLOB、 MEDIUMBLOB、LONGBLOB)其他:ENUM、SET下表为各种类型的最大长度:单位25
2021-08-05 21:39:44 4834
翻译 Springboot 可执行 Jar 的格式
spring-boot-loader 模块让 Spring Boot 支持可执行的 jar 和 war 文件。如果使用 Maven 或 Gradle 插件,则会自动生成可执行的 jar,您通常不需要了解它们的工作原理。如果您需要从不同的 build 系统创建可执行 jar,或者您只是对底层技术感到好奇,本附录提供了一些背景知识。1. 嵌套 JARJava 没有提供任何标准的方法来加载嵌套的 jar 文件(jar 文件本身包含在另一个 jar 中)。如果您需要分发可以从命令行运行而无需解包的自包含应用程
2021-07-26 15:27:10 2755
原创 MySQL 触发器
前段时间在工作中踩到了关于触发器的两个坑,所以将触发器的相关知识撸了一遍,固有了此文。问题回顾命令行创建触发器报语法错误CREATE TRIGGER order_update AFTER UPDATE ON `order` FOR EACH ROWBEGIN IF old.state = 0 and new.state = 1 THEN update t1...; insert into t2 ...; insert into t3 ...; END IF;END;当时创建的
2021-07-17 15:53:54 465
原创 MySQL 聚合函数
名称描述介绍MAX()最大值MIN()最小值COUNT()行数SUM()总和AVG()返回参数的平均值GROUP_CONCAT()拼接字符串BIT_AND()按位返回 ANDBIT_OR()按位或返回BIT_XOR()返回按位异或JSON_ARRAYAGG()将结果集作为单个 JSON 数组返回5.7.22JSON_OBJECTAGG()将结果集作为单个 JSON 对象返回5.7.2...
2021-07-11 19:23:34 1178
原创 MySQL日期时间函数
本节介绍可用于操作时间值的函数。有关每个日期和时间类型具有的值范围以及可以指定值的有效格式的说明,请参见 第 11.2 节“日期和时间数据类型”。这是一个使用日期函数的示例。以下查询会选择*date_col*过去 30 天内数据:mysql> SELECT something FROM tbl_name -> WHERE DATE_SUB(CURDATE(),INTERVAL 30 DAY) <= date_col;需要 date 的函数通常接受 datetime 并忽略时
2021-07-05 09:58:18 504
原创 IntStream 的方法
上一篇介绍了 Stream 的用法,为了简化基本类型流使用,以及消除频繁自动装箱、拆箱的性能损耗,JDK 提供了三种基本类型的流:IntStream、 LongStream、DoubleStream。本篇将介绍一下 IntStream 中区别于 Stream 的方法。IntStream 中的元素类型是基本类型的 int,所以对应的方法参数从 Predicate、Function、ToLongFunction、Consumer、Supplier… 变成了 IntPredicate、IntFunction、I
2021-06-27 19:34:27 1463
原创 Stream 的方法
Stream 中的方法分为三类:静态方法:用于创建流中间操作:通常是将一种流转换成另一种流终止操作:通常是对流中的元素进行计算,得出一个结果流是惰性求值的,只有执行终止操作时才会正在执行计算。创建流empty生成一个空的流public static void empty() { Stream.empty().forEach(System.out::println);}of生成包含指定元素的串行流public static void empty() { Strea
2021-06-26 16:13:35 2119
原创 Collections
排序 List:sort// 以自然顺序排序,元素必须实现 Comparable 接口public static <T extends Comparable<? super T>> void sort(List<T> list);// 使用传入的 Comparator 进行比较public static <T> void sort(List<T> list, Comparator<? super T> c);public s
2021-06-17 21:44:25 198
原创 Arrays 的方法
排序:sort、parallelSort两种方法都可以排序整个数组或某个范围,parallelSort 会使用 ForkJoin common pool。// 排序整个数组void sort(int[] a);// 排序某个范围,左闭右开void sort(int[] a, int fromIndex, int toIndex)// 数组元素必须实现 Comparable 接口void sort(Object[] a);void sort(Object[] a, int fromIndex
2021-06-13 16:39:36 267
原创 PageHelper 原理
本文来探寻一下 PageHelper 分页和 count 的原理,数据库是 MySQL。基本思路是:PageHelper向 Mybatis 注册处理分页和 count 的拦截器 PageInterceptor通过 PageHelper.startPage() 方法把分页相关的参数放到 ThreadLcoal 中Mybatis 执行 SQL 过程中会调用拦截器根据查询 SQL 构建 count SQL从 ThreadLcoal 拿出分页信息,在查询 SQL 后面拼接 limit ?, ?清空
2021-06-07 21:31:24 1651 3
原创 Collectors 中的各种方法
Collectors 中提供了很多好用的 Collector 实现,大大提高了我们的生产力,比如,将元素放入 Collection,一些聚合、汇总、分组操作。转集合:toCollection、toList、toSettoCollection() 可以转成任意的 Collection 实现类toList 转成 ArrayListtoSet 转成 HashSetpublic static void main(String[] args) { String[] arr = {"a", "b"
2021-06-04 22:25:49 2170 1
翻译 使用 JSON String 更新现有的对象
使用 JSON String 更新现有的对象ObjectMapper 的以下方法创建了 ObjectReader 实例,该实例可在反序列化传入 JSON 的同时更新现有对象。ObjectReader readerForUpdating(Object valueToUpdate)ObjectReader 有各种方法来读取输入 JSON 并返回更新后的对象。比如public <T> T readValue(String jsonInput) throws IOExceptionExam
2021-05-31 10:27:15 571
翻译 @JsonFilter 基于属性名过滤属性
@JsonFilter 可以按照属性名过滤要序列化的属性,它指定一个过滤器的 ID,真正的过滤器通过 ObjectMapper 注册,过滤器需要实现接口 com.fasterxml.jackson.databind.ser.PropertyFilter。通常直接使用 SimpleBeanPropertyFilter、SimpleBeanPropertyFilter。SimpleFilterProvider filterProvider = new SimpleFilterProvider();filte
2021-05-31 10:21:17 2643
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人