![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA
文章平均质量分 55
DDF_YiChen
世上人才千千万,我在垃圾堆里站
展开
-
不要用占位符去打印异常堆栈信息
简单粗暴,看一下下面几种常见的错误写法,当然这个错误的前提是确实是想打印异常堆栈信息为前提首先来看下error方法的接口定义分析一下上面三种写法的后果异常会被当做参数传递解析成异常的类名入参,所以最终只会打印异常的类名这个写法不标准, 异常要打印,不需要占位符,但是如果只有一个参数的话不会有影响这个其实和1是一样的概念, 如果确实不想打印异常堆栈,这种写法没有问题, 如果想打印异常堆栈, 则应该只需要一个占位符, 然后传递业务参数,最后传异常类总结// 只打印异常堆栈log.erro原创 2021-06-02 14:52:58 · 1500 阅读 · 1 评论 -
使用ForkJoin批量插入造大量数据
事出有因很多时候为了测试一些接口或者大量数据迁移等测试方面相关的时候,就会需要大量的数据,而这块数据本身的质量其实是不关心的。当然为了这个需求直接写Java代码看起来是有点成本较高的,不过谁让咱只会写Java呢。模拟开搞首先,插入数据需要两部分,一个是要执行的sql, 一个是数据源,这个看自己情况决定使用哪个,我这里为了简单,直接使用JdbcTemplate, 可以按照实际情况自行决定。新建一个fork-join的拆分后执行的子任务/** * <p>任务数据源</p &原创 2021-04-30 18:49:44 · 1095 阅读 · 1 评论 -
使用垃圾方法写一个不知道有没有鸟用的按profile来决定是否执行的@JsonIgnore
我们知道对一个对象进行JSON序列化的时候,如果某个字段不想要序列化返回,那么可以在字段上添加一个注解JsonIgnore,那么最终就会在序列化的时候忽略这个字段。但是如果在springboot项目中,想要根据不同的profile来决定要不要输出呢?工具使用的是Jackson这个需求可能没什么鸟用,这次用到也是因为项目内容定义了很多错误码以及错误原因。但是某个接口是对外提供服务的,然后本身接口也会返回错误码和错误原因,但是输出给调用方的只是一些与参数或者数据相关的错误,而系统内部相关的错误是不输出给外原创 2020-09-01 10:18:39 · 154 阅读 · 0 评论 -
guava cache 的refreshAfterWrite模式存在无效key的问题记录
问题暴露某个缓存key和对应的value被缓存到guava后,一段时间后该key对应的记录在数据库中被删除;当这个key再次被获取的时候,到达refreshAfterWrite设置时间触发refresh方法, 然后委托给我们自己实现的reload方法,我们的reload方法又调用了load方法来重新刷新该key对应的最新值。那么这个时候问题来了。因为我们知道,如果一个key曾经没有存在过,触发load方法的时候,我们return null,最终guava不会去增加一个key来保存这一对无效键值对。但是原创 2020-08-27 17:14:55 · 2492 阅读 · 0 评论 -
记录一下ReentrantLock加锁和释放锁的核心代码
文章目录前言类关系AQS的核心设计代码分析加锁释放锁公平锁与非公平锁到底区别在哪前言本文主要是在记录AQS相关知识点的时候,想起来一直消化的都是别人的文章,但是从来没有系统的看过源码分析,也没有自己去看到相关源码,于是就简单去看了下加锁和释放锁的核心实现,这里仅供记录,毕竟只看了半天,大佬轻喷。类关系public class ReentrantLock implements Lock, java.io.Serializable { private static final long seri原创 2020-08-04 15:49:58 · 291 阅读 · 0 评论 -
jps/jmap/jstat使用记录总结
jps获取Java进程号进程号很重要,后面的命令都必须用这个进程id# 一般在Linux中我们会使用通用命令来查询对应应用的pidps -ef | grep java# 但其实安装了java后可以使用java自带的命令jpsjmap查询堆内存使用情况语法帮助./jmap -h Usage:jmap [option] <pid> (to connect to running process)jmap [option] <executable <co原创 2020-07-31 19:40:00 · 513 阅读 · 0 评论 -
java byte表示范围的疑惑
来算一笔账byte类型占用一个字节(byte),一个字节等于8位(bit),。那么如果我们考虑无符号的话,8位11111111能表示的最大数则为2的8次方-1即255,为什么-1,因为0也是其中一个数。八位二进制可以表示最大范围为0000 0000 ~ 1111 11111,一共256个数,也就是每个位如果都是1,那么最多可以表示2的8次方即256个数,然后0占一位,所以考虑无符号则表示的的最大数字为255 。但是我们知道数字是存在负数的,如果我们要存负数怎么办?一共就能表示256个数字,都让你正数占原创 2020-07-27 19:24:07 · 280 阅读 · 0 评论 -
聊一聊个人认识的HashMap初始化大小指定容量的思考
本文基于的前提是自己的一个疑惑,我们都知道如果我们在创建HashMap的时候如果明确知道自己要放入的元素数量的话,最好指定一下容量,避免进行多次扩容,而浪费性能。那么我们也知道一个事情,HashMap是通过对key的hash来快速查找对象的,为了解决hash冲突的问题,就必须在容量和元素数量之间做一个取舍,因此有了loadFactor的概念,即虽然我用来存放链表的数组大小是16, 但是你却放不了16个元素,你只能放12个元素,那么问题来了,当我要放16个元素的时候,我写如下代码是不是就放不了16个元素呢?原创 2020-06-09 17:03:02 · 932 阅读 · 0 评论 -
关于cron表达式的固定频率执行的疑惑
一直以来对于cron表达式用的最多的一个是任务时间要求比较及时的,可能每三五分钟执行一次,然后就是一些备份性质的定时可能会在固定的半夜某个时刻去执行,这种定时都不会有较多疑问写起来也比较没有问题,最近由于业务的问题,要写一个每小时执行一次的定时,写出来的测试结果却让人大跌眼镜比如如下表达式0 0 0/1 * * ?只要是搜索每小时执行一次的定时都会出来这么个玩意,但经过自己测试发觉似乎并没有真正意义上的固定频率的一小时,所谓的固定频率的一小时是指带上我当前的时间,然后一个小时后执行,其实是做不到这种效果原创 2020-05-21 11:32:02 · 3676 阅读 · 10 评论 -
对多台服务器上的同一个文件进行分片下载
前言闲聊一下大文件的分片下载,制约大文件的下载的速度到底与哪些因素有关?最近接了个任务,有点颠覆常识,本人之前没有做过相关任务,但一般而言,第一反应差不多多是对一个服务器上的资源进行本地多线程分片下载,每个线程各下载一部分的数据;有几点结论或者疑惑总结下如果是本地文件,这种IO密集型任务,如果能最大程度的发挥CPU,让尽量多的CPU参与文件读写,应当是速度比较快的;通常而言,我们更多的应该...原创 2019-06-25 17:58:27 · 1292 阅读 · 0 评论 -
spring注解驱动第九节之Spring+SpringMVC注解版整合
五、注解版整合Spring+SpringMVC1. 可行性与整合思路研究1.1 ServletContainerInitializer与SpringServletContainerInitializer依赖于Servlet3.0的ServletContainerInitializer特性,在Servlet3.0章节中,已经说过ServletContainerInitialize...原创 2018-09-08 17:40:18 · 395 阅读 · 0 评论 -
spring注解驱动第一节之配置类初体验
从本章开始,总结一下之前看到的关于spring-annotation的相关知识点,从最基本的入门到后面与mvc的整合,全部使用注解版来实现,从此告别繁杂的配置文件,该系列总结会为后面理解spring-boot提供一定的帮助AnnotationConfigApplicationContext现在开始创建一个maven工程,使用main函数来读取配置类,创建Spring的容器,基于注解的App...原创 2018-09-08 15:57:03 · 478 阅读 · 0 评论 -
spring注解驱动第二节之Bean的导入
写在前面上一节对配置类和注入Bean的方式有一个最基本的认识,从这里开始讲解,想要往IOC容器中添加我们自定义的类的方式一共有哪些2. Bean的导入2.1 @ComponentScan包扫描该注解需要配合@Configuration标识的配置类上使用才会生效,它的作用是指定spring的扫描包,则在扫描路径下的被特定注解标识的类就会被自动纳入到IOC中,如我们熟知的@Reposi...原创 2018-09-08 15:57:17 · 285 阅读 · 0 评论 -
spring注解驱动第三节之Bean的生命周期
3. Bean的生命周期 bean的生命周期指的是bean创建—初始化—-销毁的过程 我们可以自定义初始化和销毁方法;容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法 构造(对象创建) 单实例:在容器启动的时候创建对象 多实例:容器不会管理这个bean;容器不会调用销毁方法;3.1 @Bean指定初始化方法和销毁方法修改之前创...原创 2018-09-08 15:57:34 · 140 阅读 · 0 评论 -
spring注解驱动第四节之Bean的属性赋值
4. Bean的属性赋值4.1 @Value与@PropertySource4. Bean的属性赋值4.1 @Value与@PropertySource @Value可以标注在类的字段上,以表示该该字段赋值,可以直接使用目标值,支持SPEl,也支持外部配置文件加载 @PropertySource可以标注在类上,value可以指定一个资源文件,则...原创 2018-09-08 15:57:49 · 507 阅读 · 0 评论 -
spring注解驱动第五节之Bean的依赖注入
5. Bean的依赖注入5.1 @Autowired5.2 @Resource和@Inject5.3 综合演示测试结果5. Bean的依赖注入 如何将一个组件自动注入到另外一个组件中呢?5.1 @Autowired @Autowired可以可以标注在构造器,方法,参数,字段上,默认按照Bean的类型去IOC容器中去寻找组件,如果有且一...原创 2018-09-08 15:58:00 · 225 阅读 · 0 评论 -
spring注解驱动第六节之@Profile根据环境注入Bean
6. @Profile根据环境注入Bean @Profile注解,Spring为我们提供的可以根据当前环境,动态的激活和切换一系列组件的功能,加了环境标识的bean,只有这个环境被激活的时候才能注册到容器中。默认是default环境,写在配置类上,只有是指定的环境的时候,整个配置类里面的所有配置才能开始生效,没有标注环境标识的bean在,任何环境下都是加载的;演示场景: 加...原创 2018-09-08 16:22:49 · 1733 阅读 · 0 评论 -
spring注解驱动第七节之AOP
二、AOP1. @Aspect自定义切面2. 事务控制2.1 配置数据源与事务支持2.2 测试与总结二、AOP 这一章节开始讲述有关AOP相关的注解内容,即面向切面变成,AOP可以很方便的在某个方法某个业务逻辑前后,无侵入式的加入逻辑代码或者日志或者权限等1. @Aspect自定义切面 该注解可以用来标注一个类,则该类会被识别成一个A...原创 2018-09-08 16:41:59 · 157 阅读 · 0 评论 -
spring注解驱动第八节之Servlet3.0
四、Servlet3.01. 创建一个Servlet工程,勾选Web Application,取名servlet-annotation2. 创建基于注解的Servlet,对于Servlet提供直接的注解支持WebServlet3. 编写待注册的Servlet组件,不使用WebServlet注解4. 编写Filter5. 编写Listener6. 编写注册三大组件的配置类,实现Se...原创 2018-09-08 17:05:27 · 175 阅读 · 0 评论 -
利用SpringMVC+log4j 1.2 实现自定义异常抛出给前台处理和对异常文件的单独记录
这个是外包一个公司的时候,用到了一个不太成熟的框架来写代码,后来发现,框架几乎没有对异常进行处理的代码,所以花了一些时间,来解决这个问题,所以有很多不成熟的东西在里面,个人经验,大神勿喷。 先上成果图,感兴趣的可以看一下,不感兴趣的也可以不用在这浪费时间。 先说一下,以下步骤完成了哪些功能通过在后端抛出一个自定义异常类,可以把异常消息通过json返回给...原创 2019-03-07 17:58:06 · 936 阅读 · 0 评论