自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(36)
  • 收藏
  • 关注

原创 Activiti学习心得

Activiti is the leading lightweight, java-centric open-source BPMN engine supporting real-world process automation needs.翻译:Activiti是领先的轻量级、以 Java 为中心的开源 BPMN 引擎。

2021-12-08 15:30:43 424

原创 Activiti7

Activiti7概念使用步骤部署activiti:引入activiti,把业务系统和activiti集成到一起。定义流程:建模工具定义业务流程.bpmn文件。部署流程:保存业务流程。activici是通过数据库将流程持久化的。启动流程实例:开始一次业务流程。用户查询待办任务:所有业务流程都交由activiti管理,使用activiti提供的api方法可以查询当前流程执行到哪一步了。用户处理待办任务:用户处理完待办任务后,activiti会自动推进工作流。流程结束:待办任务处理完成,且没

2021-12-07 16:58:31 435

原创 java web项目部署在linux系统出现第一次登录高延迟的问题

今天记录一下之前遇到的问题:项目部署在window登录能很快完成,部署到linux后,第一次登录过程变得很慢。通过查看系统日志,发现时间主要消耗在了创建session,并且定位到是SecureRandom的初始化问题,继续查看,发现session的id创建方式为uuid,到这里,熟悉linux的人就会明白问题在哪了。Java的UUID依赖于SecureRandom.nextBytes方法,而SecureRandom又依赖于操作系统提供的随机数源。在Linux系统下,它的默认依赖是/dev/random,

2021-11-03 22:32:10 237

原创 并发线程池

并发线程池常用线程池执行器JDK四个内置线程池线程池参数拒绝策略常用线程池执行器JDK自带线程池执行器(ThreadPoolExecutor)spring封装的线程池执行器(ThreadPoolTaskExecutor)后者其实是对前者的一个封装JDK四个内置线程池如下,不过实际一般使用自定义的线程池,视服务器情况而定。newFixedThreadPool:创建一个定长线程池,超出的任务会在队列中等待。newCachedThreadPool:创建一个可缓存线程池,空闲了可以回收,少了可以创

2021-04-16 17:28:39 93

原创 踩坑记录

springboot使用踩坑记录自定义shiro过滤器被spring抢占导致无限拦截原因解决自定义shiro过滤器被spring抢占导致无限拦截自定义shiro过滤器时,不能使用@Bean自动注入,使用@Bean就交给spring管理了,而我们本意是将过滤器交给shiro管理。 /** * 自定义过滤器不要使用@Bean自动注入,应该手动调用方法创建logoutCustomFilter()。 * 使用自动注入就交给spring管理了,而我们本意是交给shiro管理 * @

2021-04-16 11:53:21 82

原创 堆内存变量的使用和volatile关键字

工作线程使用对象时通过对象引用地址找到堆内存中的变量后,并不是直接操作堆内存中的对象,而是拷贝一份到自己的私有内存中,完成操作后再把值写回到堆内存。volatile关键字可以让工作线程每次使用对象时都去堆内存获取最新的值(每一步的原子操作都去堆内存操作),但是注意效率会降低。...

2021-04-16 09:43:18 149

原创 Shiro安全框架口述理解

Shiro安全框架shiro核心组件subjectSecurityManagerRealm认证和授权流程认证授权内置过滤器shiro核心组件subject包含了身份和凭证两个信息SecurityManager安全管理器,shiro所有操作都在安全管理器的保护之下Realm可以理解为是shiro的数据源,主要用于获取认证凭证和权限信息。可以配置多个Realm。认证和授权流程认证登录请求过来后,调用主题(subject)中的login方法,然后到安全管理器(SecurityManager)调

2021-04-15 15:22:47 66

原创 JDK1.8新特性

JDK1.8新特性Stream 流式运算Lambda表达式函数式接口方法引用日期时间 APIStream 流式运算Stream流式思想可以理解为车间的生产线,Stream不是一种数据结构,不会保存数据,而是对数据进行加工处理。不会改变数据源。中间方法是懒加载,如果没有结束方法是不会执行中间方法的。Stream是一次性操作,当结束方法执行完成后,代表加工完成了,Stream就无法再进行其他操作了。**parallelStream(并行流)**也就是有多条生产线的车间,他的效率比Stream(串行流)高,但

2021-04-14 17:19:01 57

原创 数据库事务四大特征

数据库事务四大特征原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability)原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。一致性(Consistency)假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。隔离

2021-04-12 16:08:20 76

原创 SpringCloud组件

SpringCloud组件EurekaRibbonFeignHystrixZuulEureka各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里Ribbon服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台Feign基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求Hystrix发起请求是通过H

2021-04-12 15:58:19 51

原创 TCP概述

HTTP、TCPHTTPTCP三次握手第一次第二次第三次:为什么需要三次半连接队列和全连接队列SYN攻击(洪泛攻击)四次挥手第一次第二次第三次第四次为什么需要四次HTTPHTTP又名超文本传输协议,采用了请求/响应模型。一个HTTP请求报文由请求行、请求头部、空行和请求数据4个部分组成。响应由三个部分组成,分别是:状态行、消息报头、响应正文。HTTP的连接很简单,是无状态的;而HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比HTTP协议安全。TCPTCP是一种面向

2021-04-12 15:44:28 246

原创 GC垃圾回收

GC垃圾回收垃圾判断引用计数算法可达性分析算法垃圾回收标记清除算法复制算法标记整理算法分代收集算法垃圾判断引用计数算法给对象加一个引用计数器,有一个地方引用时就+1,引用释放就-1,为0时代表可回收。但是因为无法解决循环引用问题,java虚拟机并没有采用这种方式。可达性分析算法通过GC Root对象作为起点,根据对象引用关系,向下搜索,所走过的路径称为引用链,当一个对象到GC Root没有任何引用链相连,证明对象是可回收的。可作为GC Root的对象:虚拟机栈(栈帧中的本地变量表)中引用的对

2021-04-09 16:28:57 66

原创 JVM内存模型

程序计数器每个线程私有,记录程序执行到哪一步。通过这个计数器的值来选取下一条需要执行的字节码指令。因为所存的只是下一条指令的地址,就算死循环也不会让内存溢出,所以不存在OutOfMemoryError(内存溢出) 异常。虚拟机栈每个线程私有,每个 Java 方法执行的时候都会创建一个方法栈帧,并从虚拟机栈的顶部入栈(压栈),执行完成后从虚拟机栈出栈(弹栈)。会抛出 StackOverflowError(堆栈溢出,线程请求的栈深度大于虚拟机所允许的深度) 和 OutOfMemoryError(内存溢出.

2021-04-09 14:56:23 62

原创 数据库索引

数据库索引索引就相当于目录,它们包含着对数据表里所有记录的引用指针。优点:可以大大加快数据的检索速度。缺点:时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率;空间方面:索引需要占物理空间。SQL查询优化索引优化,通过添加索引提高检索速度SQL语句优化Explain 用来分析 SELECT 查询语句,开发人员可以通过分析结果来优化查询语句。只返回必要的列:最好不要使用 SELECT * 语句。只返回必要的

2021-04-08 17:35:39 58

原创 数据库三范式

开发中应严格遵循数据库三范式第一范式:每个列都不可以再拆分。第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。...

2021-04-08 17:26:40 73

原创 分布式锁

锁的条件以及错误场景互斥性:在任意时刻,只有一个客户端能持有锁。也就是说加锁的过程要保证原子性。不会发生死锁:如果一个客户端在拿到锁后执行业务代码时崩溃,就可能会发生死锁。可以给锁加上过期时间,但是依然要满足原子性。解铃还须系铃人:一个客户端在拿到锁后执行业务代码时间超过了锁的过期时间,但是没有出现业务异常,其他线程去竞争锁的时候发现锁过期了,就把锁删除了。务必保证加锁和解锁是同一个客户端,客户端自己不能把别人加的锁给解了。redisson有一个看门狗可以给锁续期,相当于一个保护线程。...

2021-04-08 15:36:24 55

原创 Redis为什么这么快

redis为什么这么快Redis 将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度极快。I/O多路复用模型由于采用I/O多路复用,所以单线程得以实现,因而不存在多线程切换的消耗,也不存在加锁和释放锁的性能消耗。I/O多路复用“多路”指的是多个网络连接,“复用”指的是复用同一个线程。采用I/O多路复用技术可以让单个线程高效的处理多个连接请求,尽量减少网络 IO 的时间消耗。...

2021-04-08 14:40:24 57

原创 缓存雪崩,缓存击穿,缓存穿透

缓存雪崩同一时间缓存大面积过期,所有原本应该访问缓存的请求都去查询数据库了。解决方法:加锁,若缓存中没有,则所有进程去竞争锁,若抢到锁,则去查数据库并添加缓存;没有抢到锁的其他线程休眠一段时间后再去缓存中取,没有取到则继续竞争锁。将缓存失效时间分散开来,避免大面积过期。缓存击穿某个热点缓存过期,同一时刻大量请求直接去查询数据库,数据库压力增大。解决方法:加锁,若缓存中没有,则所有进程去竞争锁,若抢到锁,则去查数据库并添加缓存;没有抢到锁的其他线程休眠一段时间后再去缓存中取,没有取到则继

2021-04-08 12:03:52 61

原创 Redis数据类型

2021-04-08 11:56:26 52

原创 Redis持久化

RDB是Redis默认的持久化方式。按照配置周期性的把内存的数据以快照的形式保存到硬盘的二进制文件中,直接拿文件内容重建。不会占用太大的磁盘空间,性能较好,但是无法保证数据一致性,只能将数据恢复到上次保存快照的时候。AOFRedis会将每一个收到的写命令都以追加的方式添加到一个日志文件中。当Redis宕机重构时会按顺序执行日志文件中的命令来重构整个数据库。无法保证数据完全一致性,但可以大幅提高数据一致性,但是追加的命令日志会越来越大,并且重构起来效率较低。实际应用RDB+AOF实际应用中,可以隔一

2021-04-08 11:52:19 51

原创 Redis事务

redis事务Pipelining(管道):客户端行为,服务器不感知,目的是提高效率,不具备原子性。能够让Redis在一次交互中处理多条命令。MULTI和EXEC(redis事务):服务端支持的功能,具有原子性。一个事务中的一组命令是绝对连续执行的,在这些命令执行完成之前,绝对不会有来自于其他连接的其他命令插进去执行。Redis在接收到MULTI命令后便会开启一个事务,这之后的所有读写命令都会保存在队列中但并不执行,直到接收到EXEC命令后,Redis会把队列中的所有命令连续顺序执行,并以数组形式返回每

2021-04-08 11:28:20 37

原创 Redis集群

redis集群搭建分为三种:第一种主从模式(master/slave):主从模式提高了高可用性,主库进行读写操作,当数据发生变化时自动同步给所有从库;从库进行读操作,并接受主库同步过来的数据;主库挂掉后redis将不再提供写服务,但可以保证读服务。第二种哨兵模式(Sentinel):哨兵模式在主从模式基础上,进一步提高了可用性,增加了对主库的监控,如果主库挂了,哨兵会在从库中选取一个修改其配置文件,替代主库,先前的主库恢复后会作为从库提供读服务。值得一提的是哨兵也是可能挂掉的,所以哨兵也可以搭建成集群模式,

2021-04-07 18:19:56 110 1

原创 kafka集群的口述理解

kafka集群搭建时,从服务器角度说:每个kafka服务器(broker)启动时会注册到集群管理器(zookeeper)上,其中一个会被选举为控制器(controller),控制器的主要作用是管理分区(partition)的主从副本(leader,follower),主副本挂掉后要从其他节点上的从副本中选举一个替代主副本;从客户端角度说:消费者(consumer)在连接服务器时,也会将消费者注册信息保存到集群管理器上,这样消费者就可以通过集群管理器来获取他所要消费的分区在哪个broker上,并和该分区建立s

2021-04-07 17:05:07 75

原创 kafka组件概念

组件概念broker(kafka实例,节点):1.kafka应用实例,包含多个topic2.无副本机制,宕机就无法使用3.kafka集群由多个broker组成4.接受生产者的消息,为消息设置偏移量,并提交消息到磁盘保护5.为消费者服务,对读取分区的请求作出响应,返回已经提交到磁盘上的消息topic(主题):1.不同消息可以通过主题来区分2.topic可以分布在不同的broker上partition(分区):1.一个topic可以有多个分区2.一个分区就是一个消息队列,当有且仅有一

2021-04-07 16:04:02 106

原创 Spring事务管理之@Transactional注解

在应用系统调用声明@Transactional 的目标方法时,Spring Framework 默认使用 AOP 代理,在代码运行时生成一个代理对象,根据@Transactional 的属性配置信息,这个代理对象决定该声明@Transactional 的目标方法是否由拦截器来使用拦截,在拦截时,会在目标方法开始执行之前创建并加入事务,并执行目标方法的逻辑, 最后根据执行情况是否出现异常,利用抽象事务管理器操作数据源提交或回滚事务@Transactional注解使用注意传播特性(propagation

2021-03-08 17:55:34 161

原创 Redis基础

Redis基础-目录Redis持久化机制Redis为什么这么快Redis的数据类型什么样的数据该设置缓存缓存雪崩,缓存击穿,缓存穿透缓存预热,缓存更新,缓存降级Redis持久化机制RDB:是Redis默认的持久化方式。按照配置周期性的把内存的数据以快照的形式保存到硬盘的二进制文件中。直接拿文件内容重建。AOF:Redis会将每一个收到的写命令都以日志的形式记录下来。当Redis重启时会通过按顺序执行文件中保存的写命令来在内存中重建整个数据库的内容。说明:当两种方式同时开启时,数据恢复Redis会优先

2021-03-08 15:03:45 53

原创 XML&SQL细节

if标签的test属性用单引号包裹,内部比较如果是字符串,就用双引号like查询:SELECT * FROM SYS_USER WHERE NAME LIKE CONCAT('%',#{name},'%')

2021-03-03 17:04:33 148 1

原创 JDK和CGlib动态代理

JDK和CGlib动态代理java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP如果目标对象实现了接口,可以强制使用CGLIB实现AOP如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换如何强制使用CGLI

2021-01-31 17:06:16 54

原创 Kafka

消息中间件消息队列(消息中间件)好处:解耦:生产者和消费者实现间接对接,生产者不用等待消费者,消费者也不用放弃手中的事情而先去消费。异步:生产者将消息放入消息队列后可以去做别的事情。提高了工作效率。削峰:假如一个时间段内消息量暴增,比如在批量处理一些数据的时候,这时消费者可能不能瞬间处理这些消息,所以我们可以把消息暂存在消息队列中,依次处理,同时生产者那边也可以不用等待。ActiveMQActiveMQ采用push模式。kafkaKafka采用的是:主动pull,即Produ

2021-01-06 18:45:56 75

原创 数据库基础

MySQL数据库三范式:第一范式:每个列都不可以再拆分。第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。什么是数据库索引:索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。

2021-01-06 18:43:55 114

原创 HTTP相关

httpget与post区别get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式;在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式POST 请求仅比 GET 请求略安全一点,它的数据不在 URL 中,但依然以明文的形式存放于 HTTP 的请求头中。常见的服务器响应码200:请求被正常处理204:请求被受理但没有资源可以返回206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Con

2021-01-06 18:43:23 38

原创 Mapper.xml中的#{}和${}

MyBatis 是支持普通SQL查询,存储过程和高级映射的优秀持久层du框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。1. 代码量大大减少,开发效率高2. MyBatis相当灵活,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统 一管理和优化,并可重用3. 运行效率高Configuration:MyBatis所有的配置信息都保存在Configuration对象之中,配置文件的大部分配置都会存储到该类中SqlSession:作为MyBatis工作

2021-01-06 18:42:52 1101 4

原创 数据库事务的隔离级别

事务的隔离级别以下级别从低到高Read Uncommitted(读未提交,会出现脏读)Read Committed(读已提交,大部分数据库默认的级别,会出现不可重复度)Repeatable Read(可重复读,mysql的默认级别,会出现幻读)Serializable(所有的事务操作都必须依次顺序执行,可以避免其他隔离级别遇到的所有问题,是最为安全的隔离级别,但并发量下降,吞吐量上不去。通常情况下,我们会使用其他隔离级别加上相应的并发锁的机制来控制对数据的访问,这样既保证了系统性能不会损失太大,

2021-01-06 18:38:42 48

原创 Spring系列

Spring是一个分层的一站式轻量级框架;spring属于低侵入式设计,代码的污染极低;spring的DI(依赖注入)机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。spring对于主流的应用框架提供了集成支持。涉及到的注解:声明bean的注解@Controller 在展现层使用,控制器的声明(控制层)@Service 在业务逻辑层使用(service层)@Re

2021-01-06 18:36:12 272 1

原创 JavaSE(扩展学习,面试可能问到)

Java跨平台原理java提供了对应不同操作系统,不同位数的java虚拟机(JVM),屏蔽java程序在各种不同的硬件和操作系统中对内存的访问的差异,而保证对外统一的接口(java Api)。这样对于开发人员来说,只要按照JavaApi开发即可。如果需要部署到不同环境,只需要在该环境上安装对应版本的虚拟机即可。Java内存模型PC寄存器/程序计数器:每个线程私有,用于记录当前线程执行到哪一步,意外中断后用于恢复。Java栈 Java Stack:Java栈总是与线程关联在一起的,每当创建一个线

2021-01-06 18:34:21 93

原创 AOP实现操作日志

创建注解(也可以不创建,作用是定义切面)package com.fccy.gallery.sys.log;import java.lang.annotation.*;@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface LogAnnotation { String obj() default ""; String type() default

2020-12-21 10:26:28 139

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除