java
文章平均质量分 90
maybe宸
在有限的时光里,多做有意义的事。
展开
-
mybatis plus 多种批处理方式对比测试
最近有个需求,一张主表4张子表,主表添加数据后,4张子表分表要批量新增多条记录。比如:Person insert一条记录;childOne,childTwo,childThree,childFour4张表分别添加10条记录。由此引发的批量操作的几种方式的性能测试。搭建一个测试spring boot2.4.4项目mybatis依赖<dependency> <groupId>com.baomidou</groupId>原创 2021-03-31 00:14:38 · 2252 阅读 · 1 评论 -
ignite分布式内存数据库在springboot中应用
ignite是一个分布式内存数据库,每一个ingite服务即一个节点。在ignite中不区分master、slave,节点间互相平等,支持横向扩展,只要有足够多的节点,支持PB级数据存储。数据支持内存、内存+原生持久化、内存+第三方DB持久化多种不同策略。作为缓存可用于关系型数据库的缓存层。缓存提供...原创 2021-03-26 16:28:39 · 2841 阅读 · 4 评论 -
数据结构 之 链表
概念在物理上不连续的、通过节点间的引用形成的数据结构。所以在内存里链表是零散分配的。并不是连续内存空间。链表又细分为单向链表和双向链表,主要区别在于Node节点,单向链表只持有后驱节点的引用;而双向链表持有前驱节点和后驱节点两个引用。链表操作的时间复杂度增由于链表是通过Node节点的前驱和后驱节点引用实现的,当添加一个新的元素,无论添加到第几位。都只需要在被添加位的前驱节点的next指针指向被添加Node,将原来的Node作为被添加Node的next节点即可。无需遍历整个..原创 2020-11-13 16:20:15 · 177 阅读 · 1 评论 -
数据结构 之 数组
概念有限个相同类型变量的有序集合使用一块连续的内存区域,进行顺序存储访问时通过下标进行访问数组的下标是什么即:偏移量offset如果数组的首元素为a,a[0]即偏移量为0的位置。为什么下标从0开始下标为偏移量,所以如果从1开始第一个元素的偏移量为0.依此类推每次都要进行一次-1的减法操作。从0开始减少一次减法操作,性能达到极致。数组操作的时间复杂度增尾部添加,那么只需要在最后一位添加上新的元素即可,所以时间复杂度为O(1)。 头部添加或中间添加...原创 2020-11-13 15:57:58 · 180 阅读 · 0 评论 -
JVM--偏向锁
定义在对象的对象头信息里。所以它也最轻。当线程获取对象的偏向锁时,对象头的Mark word中会记录当前偏向的线程,所以mark word里存在线程信息,偏向方式是没有竞争时取消当前线程的同步操作。但又不能因为偏向失去锁的意义,所以竞争时,重新偏向其他线程。所以偏向锁在竞争少时能提高性能,竞争多时偏向锁多线程间切换,起不到偏向的作用。书本解释偏向锁mark word格式23位偏向锁线程|2位偏向锁时间戳|4位对象年龄|1(偏向锁固定位)|01(表示可偏向/未锁定)核心思...原创 2020-08-03 16:46:55 · 630 阅读 · 0 评论 -
JVM--轻量级锁
当出现频繁竞争时,对象的偏向锁失效,JVM会尝试获取对象的轻量级锁。轻量级锁实现是一个biasedObjectLocking对象,对象内部有一个biasedlock对象和被锁的对象内存地址指针。而biaedlock内部又是存在一个字段,用来备份被锁的对象的mark word。这时候被锁对象的对象头mark word 格式:ptr ...00 locked最后两位00表示对象持有轻量级锁...原创 2020-08-03 16:46:46 · 317 阅读 · 0 评论 -
JVM--类加载
步骤加载-连接-初始化其中连接又分为验证-准备-解析三步加载类接收:通过全限定名获取二进制数据流,即通过文件系统读入一个class后缀的文件或解析jar、zip包归档文件得到class文件。还有一些奇葩方法例如将二进制数据放入db通过db读取,或者通过http接收。 解析:解析类的二进制数据流为方法区内的数据结构 创建:创建Class类实例类加载器ClassLoader分类BootStrap ClassLoader启动类加载器,由C实现并且在java中没有对象...原创 2020-08-03 16:46:39 · 99 阅读 · 0 评论 -
JVM--hotspot虚拟机
内存布局分3个部分:1.对象头第一部分是对象自身运行数据Mark Word(hashcode、GC分代年龄、锁状态)。这是一个非固定数据结构,以便在极小的空间储存尽量多的信息。 另一部分是类型指针Class MetaData Adress,指向类的元数据,确定类型。 如果是数组还有一个array length记录数组长度。2.实例数据储存真正信息,即代码中定义的各种类型的字段,包括继承来的父类属性。3.对齐填充hotspot要求对象的起始地址必须是8字节...原创 2020-08-03 16:46:27 · 200 阅读 · 0 评论 -
JAVA 反射原理
jvm在启动时,会加载classPtah下的所有class文件为二进制流,读取到jvm中每个class文件在通过加载 连接 初始化后,会在jvm的元数据区存入对应的类的元数据。java反射利用的正是这一点,通过获取当前执行线程的lcassloader一般也就是app classloader然后通过这个类加载器获取到传入了全限定名的类的元数据。包括属性方法等信息,在运行期间可以实现动态调用方法。...原创 2020-08-02 18:12:19 · 137 阅读 · 0 评论 -
JAVA 注解原理
注解是一种特殊的接口元注解@Target 注解的作用目标。如字段、类、方法、注解等。ElementType.TYPE:允许被修饰的注解作用在类、接口和枚举上 ElementType.FIELD:允许作用在属性字段上 ElementType.METHOD:允许作用在方法上 ElementType.PARAMETER:允许作用在方法参数上 ElementType.CONSTRUCTOR:允许作用在构造器上 ElementType.LOCAL_VARIABLE:允许作用在本地局部..原创 2020-08-02 18:12:12 · 254 阅读 · 0 评论 -
浅析tomcat调优
基础:每个进入到tomcat的请求,都会创建一个新线程来处理。几个关键参数max threads 最大线程数,指的是tomcat可以接受的最大请求数,默认200acceptcount 队列最大数,指当请求数达到max threads时,队列可以缓存的请求数,默认应该是100max connections 最大连接数,服务器想发送请求,必须先和tomcat建立socket链接,这个就是允许的最大连接数了。最大连接数应该大于最大线程数+队列最大数,默认应该是1000...原创 2020-05-21 21:31:48 · 303 阅读 · 0 评论 -
java之日志框架
java日志框架其实分两块内容:一是日志框架比如JDK的j.u.l(java.util.logging),apache的log4j ,logback以及log4j2 等,这类日志框架主要作用是配置日志输出到控制台,文件,发布到哪。二是日志门面日志门面其实就是java程序和日志框架的中间层。阿里巴巴开发规范中提到,禁止直接使用日志框架的api来直接记录日志。因为不同日志框架提供了不同的api...原创 2020-02-12 00:07:42 · 128 阅读 · 0 评论 -
来选择一个适合你的分布式ID生成方案吧
在我们的分布式架构中,我已经做了分布式ID生成器,使用的是redis方案.最近又了解了一下分布式ID的不同方案,这里记录一下UUIDUUID是我们很常见的一个ID方案,理论上唯一,生成方式简单。但ID本身无意义所以不适合做ID需要表示含义的内容,如需要像客户展示的订单号;而且总长36位过长,去除"-"后也有32位,存储到DB占用存储空间大。而且作为聚集索引的话,每次去比较转换添加新的索...原创 2020-04-24 22:47:42 · 387 阅读 · 0 评论 -
Java基础 之 HashMap源码分析和hashcode及equal的对比
让我们先看一下map接口public interface Map<K,V> { //返回map的大小 int size(); //判断是否为空 boolean isEmpty(); //是否存在key boolean containsKey(Object key); //是否存在value boolea...原创 2019-01-30 00:08:26 · 960 阅读 · 2 评论 -
Java基础 之 TreeSet源码分析
既然叫treeSet,那么顾名思义他是set接口的一个实现类。都说Set接口的实现都是具有排序和去重功能的。那么今天从源码分析I一下,TreeSet的去重和排序是如何做到的。我们再开看下这个类的定义和他的构造器。public class TreeSet<E> extends AbstractSet<E> implements NavigableSe...原创 2019-02-06 12:43:01 · 144 阅读 · 0 评论 -
Java基础 之 synchronized使用
synchronized关键字给对象加锁。当请求进入该方法时或者代码块时,先检查是否有其他线程占用,如果有则等待其执行完释放锁才能获得锁。修饰对象不同,效果也不同。当修饰的是普通方法或者普通代码块时,只有是使用同一实例时,才能有锁的效果。当是不同实例的时候,锁无效。当修饰的是静态方法或者静态代码块时,无论使用的实例是否相同,都会有加锁的效果。因为类初始化时,静态方法和静态代码块都会...原创 2019-02-09 11:31:15 · 173 阅读 · 2 评论 -
java代理模式的三种实现方式
代理模式含义即通过一个代理对象来扩展目标对象,实现在不改变目标对象的基础上,为目标对象添加新的功能。同时,还防止了修改原有代码造成的不必要的bug。 假如我们现在有一个接口(MyInterface)public interface MyInterface { void doSomeThing(); void saySomeThing(); String eat...原创 2019-02-12 13:28:17 · 981 阅读 · 0 评论 -
IDEA 关闭自动提示的大小写敏感
这回换了IDEA来工作,好久没搞了,今天IDEA安装好之后,一直无法使用智能提示,琢磨了好久才发现智能提示会有首字母大小写区分,之前也记得但是时间长就给忘了。之前用惯了eclipse了,坑了我一下午。还是记一下以便下次不要再被这里坑住了。...原创 2019-03-25 17:58:38 · 11685 阅读 · 4 评论 -
java 使用jxl读取excel
最近做了一个需求需要读取excel,我了解到可以使用POI做也可以用JXL做。试用了一下之后决定使用jxl,东西很简单,直接看一下代码。public class JxlTest { private final static Logger log = LoggerFactory.getLogger(JxlTest.class); //文件路径 private fin...原创 2019-04-11 15:15:29 · 544 阅读 · 2 评论 -
建造者模式构建javabean
今天写一个构建者模式,通常我们使用javaBean都是定义私有属性,生成getset方法。这种方式很常见,在属性较少的时候,可以很好地使用,但是一旦属性爆炸时,那么意味着我们会有无穷无尽的set代码要写。比如我们现在一个主表有50个字段左右,还有请求别人接口时,dto也有50多个属性字段要写。那么每次持久化之前或者发送之前的报文组装,都要set属性值。有时候写着写着自己就乱了。有可能存错值。或者在...原创 2019-06-05 11:32:11 · 1153 阅读 · 2 评论 -
分布式事务的几种方案
最近正在给公司做分布式事务解决方案。也看了不少资料,对分布式事务的几个方案也有了一些自己的理解。这里写个博客记录一下学习过程,再说说结合业务相关内容。CAP原则CAP原则指出三个原则:一致性,可用性,还有分区容错性。一致性:指分布式系统中的各节点的数据一致性。A中存储V=10,B中也要是V=10。才满足一致性原则。可用性:指分布式系统中每次访问,都有可用节点可以对请求进行响应。...原创 2019-05-31 17:37:43 · 1028 阅读 · 0 评论 -
使用fastjson实现对象的深复制
最近遇到一个坑,之前的代码将一个订单对象中的明细,一个list,进行了分组。然后这个list就改变了。再往后,他们认为这个list没变,又将这个list作为最终数据进行了发送。这就导致这个明细回传错误。查出问题后,我就想,将这个对象如果赋值一份的吧。应该就没问题了。这里,一定要实现深复制,不然只进行浅复制的话,list内的值还是使用的同一块内存中的。进行分组后,原参数还是会被改变。所以...原创 2019-06-05 14:14:25 · 8823 阅读 · 2 评论 -
JAVA基础 之 Thread源码浅析
好久没看源码了,上次写完一部分常见的集合类的源码分析之后,今天抽空看了看Thread的源码。今天也来记录分析一下。我们都知道创建线程,有两种方案。一个是继承Thread一个是实现runnable接口。具体的方法就不写了。我们直接从Thread类分析入手。先来看一下构造器这是Thread提供的构造器。我们看到有我们经常用到的一个空构造器,一个带入参为runnable的构造器。 ...原创 2019-06-12 15:21:27 · 254 阅读 · 0 评论 -
递归模式 实现java对象的复制
最近写了一个对象复制工具。用到了一个递归模式。复制功能是实现了,并且性能相较于BeanUtils高将近一倍。但是还是没有解决深复制问题。最近太忙了就没继续做。后续再看看能否解决深复制问题吧。@Slf4jpublic class MakePoUtils { /** * 递归获取字段,包含父类 * @param list * @param claz...原创 2019-07-03 16:35:45 · 1310 阅读 · 0 评论 -
spring 事务传播行为
参考资料:Spring事务传播机制&隔离级别Spring事务管理与传播机制详解以及使用实例一般,我们使用的都是spring提供的声明时事务。这里只做声明时事务的记录。写代码时,一个方法需要事务,那么我们会使用spring的注解@transactional来声明时的标注该方法需要事务。spring的事务传播行为是使用@transactional的propagation...原创 2019-07-24 17:52:48 · 227 阅读 · 0 评论 -
JAVA基础 之 Thread的6种状态
最近太忙,好久没更新了,上次写的是Tread源码分析,这次再补上一个关于线程的几种状态吧。线程状态在Thread的源码中有一个子枚举state。里面定义了6种状态:1,NEW当我们新建一个线程对象时,此时线程是属于这个状态的。2,Runnable有了线程对象,当调用该线程的start()时,线程就从new转变成runnable。表示该线程准备就绪,可以分配CP...原创 2019-08-28 14:51:31 · 549 阅读 · 0 评论 -
spring boot使用监听和拦截器实现用户单点登录
这两天突然想做一个功能,让用户在 一个地点登录之后,另一个地方再次登录之后,把之前的用户挤掉,也就是单点登录。项目spring boot,使用监听和拦截器写的。先说一下思路:1,用户1登录,创建session,将用户信息放入session,并以username和session作为键值对,放入一个map。以供后续比对。用户2再次登录,踢掉用户1.这里由于操作都是session,一个是session的...原创 2018-06-13 22:16:13 · 5901 阅读 · 3 评论 -
ThreadLocal 使用
什么是ThreadLocal 顾名思义,本地线程共享变量,他可以使静态变量在每个线程中有一个镜像,互不干扰。使多线程开发时线程安全。实际实现是一个map,key是当前线程,value是你要存储的值。 简单看一下源码threadlocal对外暴露的方法中,常用的有get(),set(),remove()三个。 public void set(T valu...原创 2019-01-23 16:17:09 · 262 阅读 · 1 评论 -
Java基础 之 运算符
运算符分类算术运算符 +:加法 - :减法 * :乘法 / :除法 %:余数 ++: 自加。这个如果放在左边,先自加1再运算;放右边先运算再自加1。 -- :自减。同上。 赋值运算符比较简单就不多说了,赋个贴图看一下就好了。 ...原创 2019-01-28 23:36:02 · 142 阅读 · 0 评论 -
Java基础 之 hashSet源码分析
说道set大家都知道无重复。那么到底是如何做到无重复的呢今天来看下Set接口的一个具体实现,hashSet的源码分析,因为并不难,所以简短说了。hashSetpublic class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Ser...原创 2019-02-03 11:25:55 · 160 阅读 · 0 评论 -
spring boot2 redis使用
pom依赖<!-- json解析框架:fastjson依赖 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <v...转载 2018-10-10 20:29:07 · 217 阅读 · 0 评论 -
IDEA 搭建一个spring boot2 webflux项目
最近考完PMP研究了点新东西,前面写的spring boot1.5.2+JPA的项目会接着写并且升级到springboot2;还有一个spring boot1+mybatis的项目,应该也会陆续的写进来并升级。 这次写的spring boot2 webflux+mongodb。也在逐渐掌握中。最近又发布了JDK11,要学的东西真的挺多的。同时也转战了IDEA,刚开...原创 2018-09-27 15:34:29 · 4490 阅读 · 2 评论 -
lombok的安装与使用
最近去考了一个PMP,一直没更新。今天写个实用的工具吧,lombok。lombok是什么?我我理解,lombok就是使用注解来帮助你减少写那些重复性比较强的代码,提高开发效率的一款插件。比如替代get、set方法的@Getter @Setter。这样,当你写一个entity时,只要对该属性使用了这两个注解,他们就会再编译时,自动为你生成get、set方法。但有一个问题出现了,那么在写代...原创 2018-09-27 14:13:49 · 2004 阅读 · 1 评论 -
spring boot2 webflux风格开发示例
话不多说 开搞。项目接上回搭建的webflux项目。传送门:IDEA 搭建一个spring boot2 webflux项目项目为jdk10+ spring boot2 +mongodb1,配置mongodb 1,修改配置文件名 springboot项目创建好之后默认的resources里面的文件名为:application.properties ...原创 2018-09-30 20:43:29 · 2362 阅读 · 1 评论 -
spring data jpa 实现多条件复杂查询及多表联查
最近发现JPA在处理单表时,很方便,但多表就比较复杂了。今天写一下端午这两天琢磨的多条件查询,还有多表联查。maven依赖啊,配置,继承写法等知识点不展开说了,之前写过一篇文章: spring boot 配置及使用 spring data jpa这里说一下更新的地方:JPA的配置#########################################################sp...原创 2018-06-19 16:32:29 · 36255 阅读 · 14 评论 -
spring boot + druid来进行数据库加密及sql性能统计
springboot项目就不多说了。druid也不多说了,网上一搜就有介绍。我理解简单说:druid替换了spring boot的c3p0和DBCP连接池。druid提供了可视化界面进行sql性能等相关统计。druid提供了数据库密码加密处理。如何使用:1,引入依赖: <dependency> <groupId>com.alibaba</groupId>...原创 2018-06-08 15:30:27 · 3180 阅读 · 1 评论 -
spring boot 的多文件上传
这个个人觉得就比较简单了。首先前台页面: <div> <form action="/fileUpload.do" enctype="multipart/form-data" method="post" id="fileUploadForm"> <input type="file" name="file&原创 2018-06-11 15:41:10 · 5752 阅读 · 0 评论 -
spring boot dubbo zookeeper的分布式简单示例
之前学习了一阵spring cloud,一直没想着写博客,这两天看了看dubbo+zk,先写一下这个相关的内容吧。才疏学浅,有错误请指正。首先需要安装zookeeper下载地址:https://zookeeper.apache.org/releases.html找到download,进行下载即可。下载后,解压到自己想要解压的某个地方。以我的windows系统为例,我解压到:E:\zookeeper...原创 2018-04-26 16:46:31 · 542 阅读 · 1 评论 -
spring boot 定时任务
好久没写了。今天搞一下spring boot 的定时任务。定时任务顾名思义,就是定时执行。如何使用定时任务?使用spring boot 定时任务需要:1、开启定时任务:在启动类添加@EnableScheduling注解。2、创建一个被spring 管理的bean组件。在定时任务的方法上添加注解@Scheduled。例如:@Componentpublic class MailTask { @Sc...原创 2018-04-16 15:23:39 · 490 阅读 · 0 评论 -
session存放数据过大导致频繁GC影响服务器性能以及高并发问题解决
刚过完年,就一直比较忙,一直也没空更新。先是客户要求紧急上线,足足加了一个礼拜的班,紧赶慢赶做了一套订票系统出来。妈的。。。需求还没给,就提了上线申请。简直日了狗。(吐槽。。。。还一个傻逼业务,跟着客户一块烦我。)然后问题随之而来。哎,果然紧急上线的东西问题频出。直接记录问题吧。1,开发购票时,因为任务紧急,简单设计,直接把从EPM查出来的航班全部信息(EPM返回数据很庞大,并且控制权不在我们手里...原创 2018-03-22 11:31:44 · 6022 阅读 · 1 评论