
Java
Java相关
王富贵儿。
纵使疾风起,人生不言弃。
展开
-
【Java】获取服务器IP地址
背景之前搞了一个告警邮件,在某些业务场景下,程序执行失败要发告警邮件给开发人员。因为同一环境有多台服务器,为了快速排查问题希望在邮件标题上增加机器的IP。实现import lombok.extern.slf4j.Slf4j;import java.net.InetAddress;import java.net.NetworkInterface;import java.net.SocketException;import java.util.Enumeration;/** * 机原创 2021-01-05 16:02:34 · 649 阅读 · 0 评论 -
【Java】日期时间
背景平时操作日期、时间数据的时候,总会有各种转换、计算什么的,有时候有问题还要查一下,在此记录下。Java8之前日期时间转换// 字符串->日期时间Date date = new SimpleDateFormat("yyyy-MM-dd").parse("2005-06-09"); // 日期时间->字符串String now = new SimpleDateFormat("yyyy年MM月dd日").format(date);Java8Java8 日期时间原创 2021-01-05 15:33:32 · 130 阅读 · 0 评论 -
Java代码工匠之路【TBC】
参考如何解决代码中if…else 过多的问题Java8 日期处理的实践8 种最坑的 SQL 错误用法,你有没有踩过坑八点建议写出优雅的 Java 代码Java开发神器Lombok的使用与原理缓存关注点——先写DB还是「缓存」必会的55个Java性能优化细节!一网打尽!你写的代码,是别人的噩梦吗?Java 程序员排行前 10 的错误别死写代码,25条编程实用忠告身为Java程序员,这些开源工具你一定要学会...原创 2020-11-21 17:46:13 · 223 阅读 · 0 评论 -
【MySQL】JDBC连接配置
背景前一段时间总能遇到数据库连接超时的问题,把druid连接池配置改了又改,还是会出现。就又开始改jdbcUrl的配置,当然了,依然没用。最后DBA改了数据库配置(max_allowed_packet),据说有用。但是,生产环境表现良好,预发环境还是不怎么样......说回来jdbcUrl的配置,平时各个工程拷来拷去的,也没专门看过,在此记录一下。配置参数参数 说明 默认值 常用值 autoReconnect 自动连接 false true a原创 2020-11-18 18:57:15 · 806 阅读 · 0 评论 -
流水号自增实现
背景业务上有生成凭证编码的需求(根据一定的业务规则,生成业务上的唯一标识,一般都是“业务标记+流水号”的形式)。之前设计时考虑到数据量不大,用户也不多,就在数据库里搞了一张流水号的表,然后用乐观锁,保证每次读出来+1后再写回数据库。万万没想到,每秒30的并发,就有好多失败,认命之后只好屈服于redis。这个也是个经验教训,实现方式不能凭感觉猜,还是要有更多的考虑好一点。实现思路核心就是redis 的 INCR 命令。然后redis没有做持久化的话,会存在数据丢失的情况。怎么办呢,做法是根据.原创 2020-11-16 11:23:29 · 844 阅读 · 4 评论 -
Spring声明式事务@Transactional使用
背景作为一个后端开发,@Transactional一直在用,但总会碰到各种离奇的不生效的情况,每次都是到处查资料解决。就想写一篇文章整理一下,后面遇到就不用到处找了,有新情况也再补充。@Transactional声明式事务spring支持 编程式事务 和 声明式事务 两种。编程式事务也就是用代码手动控制事务的开始、提交或回滚,这样业务代码就变得不纯粹,功能代码和辅助代码杂糅到一起,并且会有许多重复代码。所以我们一般使用声明式事务。声明式事务一般有两种方式,一是基于tx和aop命名空间的xml原创 2020-11-10 10:30:55 · 870 阅读 · 1 评论 -
Spring循环依赖及@Lazy解决
背景之前写了一个用自定义注解+切面进行日志和日常统一处理的方案,但是遇到了一个问题就是,如果注解标记的方法A 被同一个类中另一个方法B调用,当B方法被外部调用时,注解将不生效,切面无法拦截。即外部调用B方法时,注解@RpcCheck不会生效。@RpcCheckpublic void A() {}public void B() { A();}当时查了一下解决原因,切面之所以会生效,是因为创建了代理对象,在调目标方法A之前,代理对象进行了增强处理(切面逻辑)。但是B调用A时,是类原创 2020-09-12 16:14:32 · 8264 阅读 · 0 评论 -
前端直接访问后端静态文件
背景有一些固定不变地文件,前端要访问。第一方案是放在文件中心,但是文件中心会有自动生成的文件名,前端直接访问无法将原始文件名替换。所以想到了另一方案,把文件放在工程目录下,让前端直接访问。实现在resource目录下,新建static目录,在static目录下新建file目录,然后前端可以直接访问file目录下的文件前端访问路径:localhost:8080/file/test.txt借鉴通过url访问文件(静态资源)...原创 2020-09-09 19:02:30 · 6321 阅读 · 0 评论 -
【Test】单元测试之Mockito
背景单元测试的重要性,怎么说呢,按照流程规范来讲,每次上线前应该把单元测试都跑一遍,确认通过率是100%才可以。否则我们对现有代码做过修改后,仅依靠测试同学回归验证的话,很容易有场景遗漏,或者隐含未被发现的问题,而且修改公共部分的时候,可能测试的回归量也是很大的。但是,现实情况一般都是,业务代码都写不过来,哪有时间写单测,更别提有质量的单测。实践借鉴Use Mockito to mock some methods but not othersMockito的方法Mockito模拟返回原创 2020-08-23 11:05:54 · 486 阅读 · 1 评论 -
接口多实现类动态切换实现
背景一直在做业务系统的开发,相同的业务操作可能会存在多个不同的场景。比如计算上班的交通花费,步行、自驾、打车、公共交通肯定花费不同,如果直接写 if-else 的话,代码可读性会很差,而且难以扩展,随着场景的增加和复杂度提升,使得代码更加难以维护。所以最好的方式是抽象出来一个接口,各个场景单独实现内部的业务逻辑,把差异单独开。那么问题来了,如何根据业务参数来实现不同业务场景的服务自动切换呢?实现在网上冲浪查了一下,基本上就是参考文章里写的那四种,个人比较倾向于最后一种,代码简洁性和扩展性都比较好原创 2020-08-01 18:04:57 · 1329 阅读 · 0 评论 -
Controller层接口参数校验统一处理
背景一般的controller层接口都要做参数校验的,最起码的空判断都是要做的。以前的写法就是一堆 if 判空堆在一起,空了就想改进一下,看看有没有什么更好的方法。然后就查到了有校验注解 @Validated ,在此记录使用方法。使用总结来说就是对非空字段用对应注解标记,然后在全局统一异常处理中对参数校验异常统一处理。POST请求 @PostMapping("/submit") @ApiOperation(value = "提交") public MyResult原创 2020-08-01 17:27:18 · 5235 阅读 · 1 评论 -
SpringBoot + MyBatisPlus多数据源配置
背景一季度的时候,要搞数据迁移,大家基本都用datax迁移。但是我这边业务太复杂了,纯SQL不太能支持,就选择用代码程序迁移。因为旧的数据在不同的库,就产生了要从多个数据源读数据,然后写入到2个新的数据库。之前工程的配置都是只有一个库,我就开始踩坑了。因为是两个同学一起开发的,另一个同学选择了mybatis的dynamic-datasource中间件,但是实践下来发现,无法做事务处理。然后就采用了我的方式,自己手动配置数据源。数据源配置主要依赖 <!--连接池-->原创 2020-07-18 12:06:26 · 1286 阅读 · 1 评论 -
java8 Stream流使用进阶【TBC】
背景java8的Stream类,在最初java8出来的时候,就学习了一版,然后随着时间的推移,全忘了,全忘了。。。。。。所以打算捡起来,把平时经常用到的做个记录。Stream原创 2020-07-13 00:29:16 · 388 阅读 · 0 评论 -
【异常解决】Establishing SSL connection without server‘s identity verification is not recommended
背景之前新搭建了一个工程,发现启动的时候有warn日志,信息如下:Wed May 06 14:19:07 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established b原创 2020-07-12 23:36:38 · 1459 阅读 · 1 评论 -
记一次复杂SQL引起MySQL死锁导致的一系列问题
7. MYSQL 死锁 互相等,才会死锁Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transactionhttps://www.wandouip.com/t5i370526/参考mysql 死锁日志查看【MySQL】如何阅读死.原创 2020-07-12 22:50:35 · 453 阅读 · 0 评论 -
【Java】使用AOP进行异常处理与日志记录
背景最近在读《代码精进之路 从码农到工匠》,书中有讲到异常规范和日志规范,大致是下面这几点:自定义BusinessException和SystemException,用于区分业务异常和系统异常,业务异常应该是warn级别,系统异常才可以记error 异常日志监控:error级别即时报警,warn级别单位时间内数量超过预设阀值也要报警。由于监控报警所以日志等级要按照规范使用 异常要使用AOP统一处理,而不应该使try-catch代码散落在项目中的各处。使得代码的可读性和简洁性降低感觉说得很有道理原创 2020-05-23 19:02:36 · 2972 阅读 · 0 评论 -
【Java基础】序列化与反序列化(一)
目录背景概念什么是序列化与反序列化?如何实现序列化?为什么要进行序列化与反序列化?serialVersionUID是什么?参考背景代码堆多了,基础反而都还给老师了。只是凭习惯,默认会给DO实体加上 implements Serializable ,又看到有的实体有人会加上。 private static final long serialVersionUID = ******;每周一记,这周来了解下序列化与反序列化基础,底层实现下期再会~(谁让我是一个小垃原创 2020-05-17 21:30:33 · 332 阅读 · 0 评论 -
【Exceptipn(一)】unchecked Exception 与 checked Exception
背景最近在读《代码精进之路 从码农到工匠》,在异常规范中有讲到,建议使用unchecked Exception,而不是checked Exception。名词看着很眼熟,完全忘记了含义,于是就查了查,以做记录。概念checked Exception继承自Error,在开发中是必须显式处理的异常,对于会抛出该异常的方法,调用方必须用try catch捕获该异常进行处理或者在方法签名上throws 该异常,向上传播。例如 FileNotFoundException。unchecked Exc原创 2020-05-12 19:42:02 · 385 阅读 · 0 评论 -
【Java反射(一)】获取及设置属性值
背景反射说起来还是上学时候刚学java基础的时候写过单测,之后就再也没用过了,全还给老师了。最近在项目里遇到了一个场景,需要对多各类的相同字段进行相同的逻辑处理,而这些类有些已经继承了其他父类了。略一思考,封装一个方法,入参是Objec,通过反射获取相同的字段,进行业务逻辑处理。听起来是个可行方案,然后我就踩坑了,over。获取属性值getDeclaredField(String name) 获取name字段,public和protected和private,不包括父类字段 getFi原创 2020-05-11 21:52:31 · 1207 阅读 · 0 评论 -
日志等级及使用
目录背景日志等级ERRORWARNINFODEBUG背景目前工程里的日志打印级别比较混乱,本人对日志等级的区分也不是很清晰。看了一些文章,正好最近在读《代码精进之路 从码农到工匠》,书里有讲日志规范的问题,把目前的理解记下来。日志等级ERROR表示不能自己恢复的错误,需要立即被关注并解决。对于error级别的日志,不仅要打印异常堆栈,还要打印上下文信息,...原创 2020-04-25 23:16:56 · 1681 阅读 · 0 评论 -
【异常解决记录】Cannot subclass final class class com.sun.proxy.$Proxy16
一、问题产生背景 时间久远,忘记了orz 【及时写博客记录是多么的重要!!!】 【严肃地说:文字记录是必须养成的习惯】二、解决方案 本人解决方案:升级Spring相关依赖版本参考:Cannot subclass final class class com.sun.proxy.$Proxy16...原创 2019-03-06 15:15:02 · 4796 阅读 · 0 评论 -
【异常解决记录】curl 401 unauthorized
参考:curl 401 unauthorized解决转载 2019-03-06 15:09:12 · 5914 阅读 · 0 评论 -
HTTP GET方式传递日期时间Date类型参数
一、背景 有个GET类型接口,需要传递日期类型的参数,开发自测,发现一直取到不到值。二、解决 1. 请求参数:endDate=2011/12/02 10:50:25 ,使用yyyy/mm/dd HH:mm:ss格式传递 2. 后端接口最好指定一下格式,时间不传默认是00:01@RequestParam("endDate") @DateTime...原创 2019-03-06 10:15:25 · 31240 阅读 · 3 评论 -
SpringBoot Druid Mysql数据库连接配置详记
SpringBoot Druid Mysql数据库连接配置详记背景配置(持续更新)配置说明官方文档背景最近程序在服务器上运行,总是出现数据库连接断开的问题,常见异常如下,所以专门来规范一下配置。2020-03-31 18:08:03.253 ERROR [DruidPooledStatement.java:357] CommunicationsException, druid version...原创 2020-04-04 11:40:20 · 2706 阅读 · 0 评论 -
Java泛型之<? extends E><? super E>
参考大佬:Java泛型中<? extends E>和<? super E>的区别Java泛型中的<? extends E><? super E>原创 2020-08-23 14:55:07 · 1019 阅读 · 1 评论 -
Java 方法签名
方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。注意,不包括返回值和访问修饰符。常见的问题应用:重载和重写。借鉴:https://blog.youkuaiyun.com/qq_27093465/article/details/54907833...原创 2018-07-09 16:59:50 · 926 阅读 · 0 评论 -
Java 内存模型
一:Java技术体系模块图二:JVM内存区域模型1.方法区也称"永久代” 、“非堆”, 它用于存储虚拟机加载的类信息、常量、静态变量、是各个线程共享的内存区域。默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小。运行时常量池:是方法区的一部分,Class文...转载 2018-04-26 16:58:54 · 153 阅读 · 0 评论 -
Java 垃圾回收
跟踪收集器跟踪收集器采用的为集中式的管理方式,全局记录对象之间的引用状态,执行时从一些列GC Roots的对象做为起点,从这些节点向下开始进行搜索所有的引用链,当一个对象到GC Roots 没有任何引用链时,则证明此对象是不可用的。下图中,对象Object6、Object7、Object8虽然互相引用,但他们的GC Roots是不可到达的,所以它们将会被判定为是可回收的对象。可作为GC Roo...转载 2018-04-26 16:13:35 · 219 阅读 · 0 评论 -
Java ClassLoader类加载器
类加载器类加载器(ClassLoader)用来加载 class字节码到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源文件在经过 Javac之后就被转换成 Java 字节码文件(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class 类的一个实例。每一个这样的实例用来表示一个 Java 类。实际的情况可能更加复...转载 2018-04-26 09:06:04 · 173 阅读 · 2 评论 -
Java中的进程 线程
一、进程1、进程:系统进行资源调度和分配的一个单位。当程序进入内存运行时,即为进程。2、进程的三大特点:(1)独立性:独立拥有资源,有独立的空间地址;(2)动态性:有自己的生命周期和状态;(3)并发性:某一时刻,只有一个命令在CPU执行。但是在某一段时间,多条命令轮换执行,宏观上看就像多个进程同时执行一样;二、线程:1、线程:进程的组成部分,是进程包含的多个顺序执行流。2、线程的特点:(1)每个进...原创 2018-04-01 14:37:09 · 186 阅读 · 0 评论 -
同步相关:volatile synchronized Lock ReentrantLock
零、基本概念1、并发编程中的三个概念:原子性:即一个操作或者多个操作要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。可见性:是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。有序性:即程序执行的顺序按照代码的先后顺序执行。要想并发程序正确地执行,必须要保证原子性、可见性以及有序...原创 2018-03-21 17:54:05 · 751 阅读 · 0 评论 -
String StringBuffer StringBuilder 相关
一、简要总结1、String 不可变字符序列StringBuffer 线程安全的可变字符序列StringBuilder 非线程安全的可变字符序列2、讨论String和StringBuffer可不可变。本质上是指对象中的value[]字符数组可不可变,而不是对象引用可不可变。3、在线程安全性方面,StringBuffer允许多线程进行字符操作。...原创 2018-03-21 16:40:20 · 165 阅读 · 0 评论 -
HashMap HashTable ConCurrentHashMap总结
一、HashMap和HashTable比较:浅析:1、继承的父类不同 Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。2、是否提供contains方法 HashMap把Hashtable的contains()方法去掉了,改成containsValue()和containsKey()...原创 2018-03-21 10:47:17 · 352 阅读 · 1 评论 -
Java8 集合新特性【TBC】
借鉴各位大佬:java8新特性之函数式接口、lambda表达式、接口的默认方法、方法和构造函数的引用lambda(替代匿名类)原创 2020-09-12 12:42:25 · 225 阅读 · 0 评论 -
Java8 日期时间
借鉴各位大佬:Java8中计算日期时间差LocalDateTime计算时间差localDate的相关方法Java 8 中 Date与LocalDateTime、LocalDate、LocalTime互转原创 2020-11-21 17:57:52 · 153 阅读 · 0 评论 -
jdbc
简单增删改查package Practice170829;import org.junit.Test;import java.sql.*;/** * Created by 8102 on 2017/8/29. */public class JDBC01 { @Test public void queryAll(){ //查询所有 Connectio原创 2017-08-29 17:31:43 · 283 阅读 · 0 评论