使用arthas热加载 工作中经常有这种问题:线上有问题,需要排查,但是相关关键日志没有打印,不好定位问题,这个时候那就修改代码,再发布一次,然后排查问题,这样是可行的,但是不利于快速排查问题 之前一直使用阿里的arthas,偶然发现它具备热加载的功能,很好用,这里记录下(当然,也是从别人那里学习的) 我们要达到的效果是不需要发布,直接修改相关文件,然后热加载,做到线上动态更新相关文件功能 ...
数据库连接池设置----可能跟你想的不一样 看到一篇关于数据库连接池设置的文章,讲的很透彻,贴出来,共同学习译文:https://blog.csdn.net/zzzgd_666/article/details/82842839原文:https://github.com/brettwooldridge/HikariCP/wiki/About-Pool-Sizing...
jdbc流stream读取超大数据 这几天在做分库分表,涉及到数据迁移,然后设计的方案是使用mybatis将数据分批读取出来,每批大概40--50万条数据,然后将查询来的数据再insert进去,发现这个效率很低,程序有卡顿,而且客户端很容易OOM。找了一下原因就是jdbc默认的读取数据的时候,会将要查询的数据一次性读到内存中,再通过resultSet循环读取出来,这样子40--50万条数据很容易就撑爆内存,然后调研了下发现,其实...
mysql事务隔离级别另类解释 MySQL事务隔离级别老生常谈,老是理解不到位,今天以特定的角度理解一下1.前提:MySQL为了多用户同时操作数据时避免相互干扰所以产生了事物的隔离级别2.有这么几种:read-uncommitted(读未提交) 、read-committed(读已提交)、read-repeated(可重复读)、serializable(串读)我们这么理解:将前三种种拆成两部分,每一部分表示一个事...
还记得java getResource和getResourceAsStream吗 首先说一个概念,classpath,指的是编译后的class文件、xml、properties等配置文件所在的目录。比如,如果是maven项目,classpath为“项目名/target/classes”,如果是普通项目,可能是”项目名/bin”,或者”项目名/build/classes”等等java读取文件时,有getResource和getResourceAsStream可以用,具体怎么用...
java之异步回调 异步回调我的理解:1.使用了委托模式,调用方(ServiceA)持有被调用方(ServiceB)的引用,然后调用被调用方(ServiceB)的方法,被调用方方法(ServiceB)完成后,调用调用方(ServiceA)的回调函数做一些事情2.异步回调多是一些耗时的操作,在新线程中去调用被调用方(ServiceB)方法3.异步回调可以大大提高IO效率,这是当前开发的主流,比如Netty、...
Java之Type 先推荐两篇文章(分为上下两篇),讲的比较好https://www.jianshu.com/p/7649f86614d3https://www.jianshu.com/p/e8eeff12c306下边是写的例子,保留下ParameterizedType:public class ParameterizedTypeTest<E, R> { private Ma...
基于注解的可校验泛型的参数校验工具 基于注解的校验工具很多,但有些不是很符合自己的场景,自己写了一个,亲测可用可以校验入参中的单个参数、列表、带泛型的列表(List<String>),但是嵌套的泛型(List<List<String>>)不能校验:注解类:package com.mhc.gw.sti.api.jd.util;import java.lang.annotation....
策略模式之策略枚举 在使用策略模式时,我们要创建相应的策略,然后根据不同的场景使用不同的策略,这是可以的,但毕竟那是一堆的策略类,使用起来代码的可读性、扩展性也就一般,这种情况下我们可以使用策略模式的升级版---策略枚举来解决上边的问题枚举类:public enum StrategyEnum { ADD("+") { @Override public int exec...
Linux脚本git提交代码 习惯于命令行手动提交代码,但每次都要输出同样的命令,索性写个脚本:#!/bin/bashgit statusread -r -p "是否继续提交? [Y/n] " inputcase $input in [yY][eE][sS]|[yY]) echo "继续提交" git add -A git commit -m $1 git push origin $2...
linux 相关命令杂谈 1.在单词之间跳转,使用Ctrl+左右键。Ctrl+a跳到本行的行首,Ctrl+e则跳到页尾。Ctrl+u删除当前光标前面的文字 ctrl+k-删除当前光标后面的文字Ctrl+w和Alt+d-对于当前的单词进行删除操作,w删除光标前面的单词的字符,d则删除后面的字符Alt+Backsapce-删除当前光标后面的单词,如果删除错误,使用Ctrl+y进行恢复Ctrl+L进行清屏操作2.grep显示...
数据拆分小工具 有时候,我们会有将列表进行拆分处理的需求,比如一个100容量的列表,拆成20个单个容量是5的小列表进行处理,下边是一个实现:public class DataUtil{ /** * 此方法用来对数据按照一定块大小进行切分,适合需要将数据先进行切分再进行依次处理的场景 * 参数: * 1.waitToSplitData:待切分数据 * 2.需...
基于ThreadLocal的Rpc调用计时工具 最近写了一个基于ThreadLocal的计时小工具,先看看代码:public class TimeRecordUtil { private static final ThreadLocal<Long> START_TIME = new ThreadLocal<>(); /** * (第一步调用)开始调用 */ public...
Guava小工具之Interners 大家都知道,String是final的,每次对它的操作都会产生新的String,这很大程度上是安全性的考虑,但是产生大量的String也是会有一些问题的,1.大量的String会对gc产生影响;2.两次 new String(“aa”)操作,产生的String不一样,如果用这两个去做synchronized(String)操作就达不到想要的效果,因为synchronized必须是对同一个对象...
Guava小工具之Supplier 最近在看Guava的源码,Supplier这个小工具比较有意思,今天聊一聊。 Supplier是一个接口,里面只有一个get方法,然后Suppliers类里面有两个内部类实现了这个接口,ExpiringMemoizingSupplier和MemoizingSupplier,它们主要是为了延迟获取在get方法中创建的对象,一个有超时时间,一个没有,其实也可以理解为将需要使用的东西做了一个懒...
ThreadPoolExecutor使用实例 使用场景:需要同时创建多个线程去访问某一接口,并将返回数据进行组装1. 创建ThreadPoolExecutor,切记创建在类的方法之外,这样就不会调用一次方法,创建一个ThreadPoolExecutorprivate final static ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 30, 2000, TimeUnit....
unix编程艺术读书笔记 1.设计中,应该将代码的复杂度转移到数据结构中,以求达到程序的逻辑质朴而健壮,如c语言中的指针所实现的功能,在其他语言中就需要更加复杂的代码实现才能完成2.程序要具有透明性(看一眼就大概知道做的什么事情)和显见性(程序自带监视和显示内部状态的功能)3.先求运行、再求正确、最后求快(过早优化是万恶之源)4.宁愿抛弃、重建代码,也不要老是修补那些蹩脚的代码,让代码可维护,从而来吸引未来的维
Java类加载机制ClassLoader之ContextClassLoader 1.java的classLoader加载机制大家都比较清楚,就是委托机制,如下这种机制就是,加载一个类的时候,会一直向上委托,如果BootStrapClassLoader加载不到,然后再依次往下加载,如果最后SystemClassLoader也加载不到,则会抛出classNotFoundException。2.现在我们来说说其他的,说之前先说说两个概念,这个是转述别人的(http:
logback.xml---日志配置 INFO ${LOG_PATH}/log-info.log ${LOG_PATH}/complete-log-%d{yyyy-MM-dd_HH}.log.%i 100MB
InheritableThreadLocal-- 特殊的ThreadLocal ThreadLocal允许我们在线程中保存一些变量,但是做不到父子线程数据的共享public class InheritThreadLocal { public static ThreadLocal threadLocal = new ThreadLocal();// public static ThreadLocal threadLocal = new Inherita