自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 理解装饰模式

可以这样写,但是已经侵入了已有的代码,我们就可以对看电影的接口进行装饰。新增一个食物类然后去实现看电影的接口。如果我想加带了好多零食去看电影。后面我还想加带了谁去看电影。新增一个类去继承食物类。新建一个看电影的接口。

2023-05-04 13:46:32 114

原创 @Async避坑

可以看到,异步任务使用了一个线程池,它的corePoolSize=8, 阻塞队列采用了无界队列LinkedBlockingQueue。一旦采用了这样的组合,最大线程数就会形同虚设,因为超出8个线程的任务,将全部会被放到无界队列里。这样的话,如果请求量一增加,整个操作系统的压力就会耗尽,最终所有的业务都无法响应。然后在用异步注解时指定名字,就可以避免,请求量一增加,整个操作系统的压力就会耗尽,最终所有的业务都无法响应。让我们看下原因,访问时,直接打个断点,即可获取执行异步线程的线程池。

2023-04-20 10:51:48 594

原创 CompletableFuture(异步任务编排)

CompletableFuture它可以完成复杂的异步任务编程功能,异步编程意味着在主线程之外创建一个独立的线程,与主线程分隔开,并在上面运行一个非阻塞的任务,然后通知主线程进展,成功或者失败。通过这种方式我们的主线程就不需要阻塞等待返回结果。必须要等异步任务完成才能继续执行主线程,不仅如此,当我们在碰到一下业务场景的时候,单纯使用Future接口或者FutureTask类并不能很好地完成以下我们所需的业务.加入我们的异步任务非常的耗时由于get方法会阻塞主线程就会导致程序的吞吐量下降。

2023-04-06 18:02:35 163

原创 mysql左连接多个字段使用concat函数索引失效

它和写多个and的区别还是有的,我现在这个场景还是都能使用,但是有个情况想要走索引只能建虚拟列,比如我sf表连接sfd表这个三个字段 client_no,`year`,`month`,只需要client_no的部分片段进行连接,这是只能通过虚拟列不能用and。我开始只在 client_no 字段加了索引,发现没有走索引后我把三个索引都加上,发现也不走索引,然后我又尝试加了个复合索引,还是不起作用,后面查了下知道,用了mysql的函数是不会走索引的,后面换了个写法。

2022-12-13 15:14:02 1961

原创 @Transactional与synchronized同时使用synchronized失效

起因,前端新增时,新增按钮没有加load,导致可以在弹框没有消失时可以点击很多次新增按钮从而出现很多重复数据,一开始数据表这个订单号没有加唯一索引,也才会出现这种情况 我一开始开发时给我service的方法加了事务和同步锁,以为没问题,后面发现并发测试时出现了重复数据,然后我才注意有问题,才深究首先这种情况 同步锁也许都不能生效。因为针对@Transactional标注的方法,Spring在AOP中实现,它会生成一个临时类,并用一个实现了开启和关闭事务的同名方法来覆写原本这个被标注的方法。大概类似这样

2022-12-07 17:15:29 876

原创 poi设置将所有列打印成一页失效

poi设置将所有列打印成一页失效

2022-10-17 11:59:29 1152

原创 Spring事务的隔离级别与传播行为

发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。比如,某个事务尝试插入记录 A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。READ:可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读),方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,否则开启新事务。自身不会开启事务,在事务范围内则使用相同事务,否则不使用事务。

2022-10-07 14:46:12 1664

原创 SpringBoot事务注解@transactional无法生效的七个场景

SpringBoot事务注解@transactional无法生效的七个场景Propagation.NOT_SUPPORTED: 表示不以事务运行,当前若存在事务则挂起,都主动不支持以事务方式运行了,那事务生效也是白搭。

2022-10-07 11:06:42 1294

原创 Redis安全控制

1,缓存穿透产生背景:缓存穿透是指使用不存在的key进行大量的高并发查询,导致缓存无法命中,每次请求都要都要穿透到后端数据库查询,使得数据库的压力非常大,甚至导致数据库服务压死;解决方案:(一)接口层实现api限流、用户授权、id检查等 黑名单和白名单;(二)从缓存和数据库都取不到数据的话,一样将数据库空值放入缓存中,设置30s有效期避免使用同一个id对数据库攻击压力大;(只适合单个相同key,不适合随机生成不同key)(三)使用布隆过滤器布隆过滤器适用于判断某个数据是否在集合中存在

2022-02-17 09:58:06 417

原创 Redis实现分布式锁

1,实现分布式锁思路主要是通过setnx的方法实现分布式锁2,实现原理多个jvm同时通过setnx()方法创建相同的一个key,只要谁能够创建成功 谁就能够获取到锁; 如果创建的时候,突然该key已经被其他jvm创建还未过时,则直接等待; 只要能够创建key成功,则开始进入到正常业务逻辑操作,其他没有获取锁进行等待; 正常业务逻辑流程执行完后,通过del删除这个可以来释放锁,从而是其他的请求开始进入到获取锁的资源。public class RedisLock { ...

2021-12-27 10:20:38 695

原创 Zookeeper实现分布式锁

1,实现分布式锁思路因为Zookeeper节点路径保持唯一,不允许重复 且有临时节点特性连接关闭后当前节点会自动消失,从而实现分布式锁。2,实现原理多请求同时创建相同的节点(lockPath),只要谁能够创建成功 谁就能够获取到锁; 如果创建节点的时候,突然该节点已经被其他请求创建的话则直接等待; 只要能够创建节点成功,则开始进入到正常业务逻辑操作,其他没有获取锁进行等待; 正常业务逻辑流程执行完后,调用zk关闭连接方式释放锁,从而是其他的请求开始进入到获取锁的资源。p...

2021-12-23 14:13:33 1000

原创 RabbitMQ死信队列与消息幂等问题

死信队列1,死信队列产生的背景RabbitMQ死信队列俗称,备胎队列;消息中间件因为某种原因拒收该消息后,可以转移到死信队列中存放,死信队列也可以有交换机和路由key等。2,产生死信队列的原因消息投递到MQ中存放 消息已经过期 消费者没有及时的获取到我们消息,消息如果存放到mq服务器中过期之后,会转移到备胎死信队列存放。 队列达到最大的长度 (队列容器已经满了) 消费者消费多次消息失败,就会转移存放到死信队列中3,死信队列的架构原理死信队列和普...

2021-12-22 11:27:18 1870

原创 RabbitMQ五种消息模式

1,简单模式工作的流程:当生产者生产消息后,将消息发往队列. 当队列中有消息时,消费者会实时的监听队列中的消息.如果有消息则会执行消息2,工作模式默认的传统队列是为均摊消费,存在不公平性;如果每个消费者速度不一样的情况下,均摊消费是不公平的,应该是能者多劳。采用工作队列在通道中只需要设置basicQos为1即可,表示MQ服务器每次只会给消费者推送1条消息必须手动ack确认之后才会继续发送。channel.basicQos(1);public class ...

2021-12-21 15:33:39 3375

原创 RabbitMQ如何保证消息不丢失

概述在RabbitMQ broker因为某些原因崩溃、重启时,可以确保消息不会丢失。但是我们发送完消息之后,并不知道消息有没有真的发到了RabbitMQ服务器上并存储完毕,如果因为网络闪断等原因导致消息没有发到服务器上,或者RabbitMQ服务器发生内部错误导致持久化失败,这样就会导致消息丢失。针对生产者发送消息的确认问题,RabbitMQ提供了如下两种方式(注意:事务机制跟confirm机制两者是互斥的,如果已经开启了其中一种,再去开启另外一种会报错的) ...

2021-12-21 14:00:06 1273

原创 线程与线程池的理解

1,什么是线程,线程和进程的区别是什么线程,程序执行流的最小执行单位,是行程中的实际运作单位,进程简单来说,一个应用程序的运行就可以被看做是一个进程,而线程,是运行中的实际的任务执行者,进程中包含了多个可以同时运行的线程。2,线程的生命周期(1)是用new Thread()的方法新建一个线程,在线程创建完成之后,线程就进入了就绪(Runnable)状态,此时创建出来的线程进入抢占CPU资源的状态,(2)当线程抢到了CPU的执行权之后,线程就进入了运行状态(Running),(3)当该线程的任务执

2021-09-28 11:44:20 282

原创 阻塞队列(BlockingQueue)

线程池、连接池、内存池、对象池jdbc的连接和关闭是非常1耗费资源了池化技术∶事先准备好一些资源,有人要用,就来我这里拿,用完之后还给我。线程池的好处1,降低了资源的消耗,提高响应的速度,方便管理...

2021-09-27 15:59:45 420

原创 JMM和Volatile

1,什么是JMMJMM即为JAVA 内存模型(java memory model)。因为在不同的硬件生产商和不同的操作系统下,内存的访问逻辑有一定的差异,结果就是当你的代码在某个系统环境下运行良好,并且线程安全,但是换了个系统就出现各种问题。Java内存模型,就是为了屏蔽系统和硬件的差异,让一套代码在不同平台下能到达相同的访问结果。简单的理解他是一种概念,约定是一种不存在的东西2,内存划分JMM规定了内存主要划分为主内存和工作内存两种。此处的主内存和工作内存跟JVM内存划分(堆、栈、方法区)是在

2021-09-22 17:17:11 177

原创 Java新特性Lambdab与四大函数式接口

java1.8的新特性 lambda表达式、链式编程、函数式接口、Stream流式计算1,函数式接口它有有个专门的注解,含有@FunctionalInterface注解的接口,就只有一个方法的接口,我们平时使用的Runable 接口就是一个函数式的接口。函数式的接口可以使用lambda 表达式来简编程。@FunctionalInterfacepublic interface Runnable { void run();}常见的函数式接口都在java.util.functi..

2021-09-17 15:42:44 115

原创 可重入锁(synchronized ,ReentrantLock ),读锁(共享锁),写锁(独占锁),公平锁,非公平锁与自旋锁(也称乐观锁,自己编写)

1,可重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。synchronized 和 ReentrantLock 都是可重入锁。可重入锁的意义之一在于防止死锁。//可重入锁public class ReentrantLockDemo{ public static void main(String[] args) { Phone phone = new Phone(); new Thread..

2021-09-16 20:05:20 703

原创 CAS与ABA问题

在JDK 5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁机制存在以下问题:(1)在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题。(2)一个线程持有锁会导致其它所有需要此锁的线程挂起。(3)如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险。volatile是不错的机制,但是volatile不能保证原子性。因此对于同步最终还是要回到锁机制上来。为了保证原子性操作就引出了CAS独占锁是一种悲观锁,syn

2021-09-15 14:43:04 198

原创 代理模式——两种动态代理

JDK动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。CGlib动态代理:利用ASM(开源的Java字节码编辑库,操作字节码)开源包,将代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。优点:都解决了静态代理多个实现类重复写的问题JDK动态代理 这里举的是一个房东租房的例子//租房public interface Rent { public void rent();}//房东 真实角色public cl

2021-09-04 15:28:45 69

原创 代理模式——静态代理(贴近业务)

静态代理概念:所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了举例理解:以结婚为例,当事人只需要处理自己的主要事儿即可,比如典礼、洞房,其他的杂事儿可以交给代理公司即可静态代理需要满足三点:1、需要有真实角色2、需要有一个代理角色3、这两个角色之间必须实现相同的接口静态代理类优缺点优点:1,可以使真实角色的操作更加纯粹!不用去关注一些公共的业务。2,公共也就交给代理角色!实现了业务的分工。3,公共业务发生扩展的时候,方便集中管理!缺点:

2021-09-04 10:22:31 156

原创 桥接模式的理解

以前我们我的多继承关系是这样子的如果我们电脑接口类要多个方法,其他实现都得改动,不符合开闭原则桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interfce)模式。他的场景分两个维度,两个维度的变化互不影响。一个维度的增加不用改变另一个维度的代码//品牌public interface Brand { void info();}public class Lenovo imple.

2021-08-27 14:43:39 264

原创 适配器模式——结构性

结构性:从程序的结构上实现松耦会,从而可以扩大整体的类结构,用来解决更大的问题。模式都来源于生活,举一个生活的列子//要被适配的类 网线public class Adatee { public void request(){ System.out.println("连接网线上网"); }}//接口转换器的抽象实现public interface NettoUsb { //作用:处理请求 能网的接口 public void handl

2021-08-26 16:19:26 73

原创 原型模式的理解

原型模式:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象!需要实现Cloneable接口重写clone()方法或实现Serializable 接口如果不实现Cloneable接口将会报不支持克隆的错误/** * 原型模式 实现Cloneable接口 */public class Demo implements Cloneable{ private String name ; private Date createtime; @Ove.

2021-08-26 15:50:15 69

原创 建造者模式的理解

定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示例子:工厂(建造者模式)∶负责制造汽车(组装过>程和细节在工厂内)汽车购买者(用户)︰你只需要说出你需要的>型号(对象的类型和内容),然后直接购买就可以使用了(不需要知道汽车是怎么组装的(车轮、车门、>发动机、方向盘等等))例子2:假设造房简化为如下步骤:(1)地基(2)钢筋工程(3)铺电线(4)粉刷;i“如果”要盖一座房子,首先要找一个建筑公司或工程承包商(指挥者)。承...

2021-08-21 16:06:04 83

原创 抽象工厂的理解

定义:抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定它们具体的类,围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。//手机产品接口public interface IPhoneProduct { void callup(); void sendSMS();}//路由器产品接口public interface IRouterProduct { void openwifi(); void setting();}p.

2021-08-21 14:53:30 168

原创 工厂模式的理解

1,静态工厂模式也称简单工厂模式public interface Car { void name();}public class TeSla implements Car{ @Override public void name() { System.out.println("特斯拉"); }}public class WuLing implements Car{ @Override public void .

2021-08-21 11:09:51 140

原创 基于JavaSDK调用FISCO BCOS 区块链

基于https://fisco-bcos-documentation.readthedocs.io1,需要将文件的sha256Hex哈希值存于搭建的FISCO BCOS 区块链中并验证文件的hash是否改变达到知晓文件是否改动的效果,并能查询出区块链的相关信息比如区块链的总高度,当前高度,区块链的hash值什么是FISCO BCOS 区块链FISCO BCOS是由国内企业主导研发、对外开源、安全可控的企业级金融联盟链底层平台,由金链盟开源工作组协作打造,并于2017年正式对外开源。社区以

2021-08-07 15:52:23 7724 3

原创 JavaJDK实现无钥签名根证书与沙箱安全机制

1,起因:接到项目经理的需求,项目有涉及文件的上传,需要把上传的文件进行数字签名,简称无钥签名,然后对签名后的文件进行无钥验证,判断文件签名后是否改变,对于从来没有听过无钥签名的我感觉很懵,后面就去上网查数字签名是java的那一块,得到以下结果:Java里其实有两大机制,第一是双亲委派机制,第二是沙箱安全机制,双亲委派机制相信大家学习jvm的类加载器时肯定都有做了解,那这个沙箱安全机制是什么呢什么是沙箱安全机制Java安全模型的核心就是Java沙箱(sandbox),什么是沙箱?...

2021-08-07 13:48:51 269

原创 jackson 包版本低导致java.lang.NoSuchMethodError

1,起因,本地window10项目运行无误,发布项目到正式环境Liunx系统后编译打包部署都没有问题,但是验证一个双因子认证功能时就报错2,我看到这个错误,就知道肯定是 Maven 依赖问题,要么是版本冲突(存在不同版本的 2 个相同依赖),要么是依赖版本不对(太高或者太低),但为了保险起见,我还是先检查了一下 svn的提交记录,看看有没有对 pom.xml 配置文件做相关改动。检查后发现,除了一些业务逻辑的变动,对于这个包没有人动过因为这个双因子认证的功能也添加了两个jar,但是报的错与...

2021-08-06 17:28:26 510

原创 columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by解决办法

一开始我数据库的添加数据时按照秘钥为'aaa'进行AES加密insert into test(id,name)values(32,HEX(AES_ENCRYPT('张三','aaa')))后面我进行AES解密group by分组查询时就报如下错误select COUNT(1) as ID,cast(AES_DECRYPT(UNHEX(name),'aaa')as char)name from test group by AES_DECRYPT(UNHEX(name),'aaa'

2021-08-06 16:01:50 3015

原创 HBase单机与分布式搭建

解压,重命名,环境变量 1. tar -zxvf2. mv 3. vi ~/.bash_profile export HBASE_HOME=/usr/local/src/hbase export PATH=$HBASE_HOME/bin:$PATH4. 刷新环境变量 source ~/.bash_profile 修改hbase-env.sh文件 单机1. cd hbase/conf 2. vi hbase-env.sh 修 export JA..

2021-08-06 15:23:22 83

原创 Flume搭建与Kafka分布式搭建

Flume搭建:解压,重命名,环境变量 1. tar -zxvf2. mv 3. vi ~/.bash_profile export FLUME_HOME=/usr/local/src/flume export PATH=$FLUME_HOME/bin:$PATH4. 刷新环境变量 source ~/.bash_profile 修改flume-env.sh文件 1. cd hive/conf 2. cp flume-env.sh.template flume..

2021-08-06 15:15:49 142

原创 Hadoop集群MySQL搭建

卸载本机自带的MySQL(mariadb) 1. rpm - qa|grep mariadb2. rpm -qa|grep java(补充:卸载本机自带的openjdk)3. rpm -e --nodeps ......... 安装commeon包 1. rpm -ivh --nodeps --force mysql-community-common-5.7.28-1.el7.x86_64.rpm2. rpm -ivh --nodeps --force mysql-comm..

2021-08-06 15:06:15 144

原创 Hadoop集群Sqoop组件的搭建

解压,重命名,环境变量 1. tar -zxvf2. mv 3. vi ~/.bash_profile export SQOOP_HOME=/usr/local/src/sqoop export PATH=$SQOOP_HOME/bin:$PATH4. source ~/.bash_profile 修改sqoop.env.sh 1. cd sqoop/conf2. vi sqoop.env.sh 修export HADOOP_COMMON_H..

2021-08-06 15:01:35 217

原创 Hadoop集群Hive组件搭建

说明,安装时一定是基于Hadoop集群 解压,重命名,环境变量 1. tar -zxvf2. mv 3. vi ~/.bash_profile export HIVE_HOME=/usr/local/src/hive export PATH=$HIVE_HOME/bin:$PATH 修改hive-env.sh文件 1. cd hive/conf 2. cp hive-env.sh.template hive-env.sh3. vi hive-env.

2021-08-06 14:48:17 173

原创 Centos7HadoopHA高可用搭建

参照Hadoop包里面的share的doc的离线文档说明:这里搭建HA时一并把分布式zookeeper分布式spark一并搭建了,以三台主机为主 master slave1slave2 解压 重命名 环境变量 1. tar -zxvf 解压包名(jdk的包,hadoop包,zookeeper包,spark包)2. mv 文件名 重命名3. vi /etc/profile(环境变量对所有用户有效)vi ~/.bash_profile(只对当前用户有效) export .

2021-08-06 14:24:39 100

原创 Centos7&Hadoop分布式

参照Hadoop包里面的share的doc的离线文档 解压 重命名 环境变量 1. tar -zxvf 解压包名(jdk的包,hadoop包)2. mv 文件名 重命名3. vi /etc/profile(环境变量对所有用户有效)vi ~/.bash_profile (只对当前用户有效) export JAVA_HOME=/usr/local/src/jdk export HADOOP_HOME=/usr/local/src/hadoop ex

2021-08-05 19:49:39 68

原创 Centos7Hadoop伪分布式

参照Hadoop包里面的share的doc的离线文档 解压 重命名 环境变量 1. tar -zxvf 解压包名(jdk的包,hadoop包)2. mv 文件名 重命名3. vi /etc/profile(环境变量对所有用户有效)vi ~/.bash_profile(只对当前用户有效) export JAVA_HOME=/usr/local/src/jdk export HADOOP_HOME=/usr/local/src/hadoop exp

2021-08-05 19:36:43 81

空空如也

空空如也

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

TA关注的人

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