![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 72
yzgu
一个没有故事的码农,喜欢学习新的技术,如果你有技术上的问题,欢迎私信咨询我。
展开
-
seata前置环境
官网:https://github.com/seata/seata中文网:Seataseata mysql 语句https://github.com/seata/seata/blob/develop/script/server/db/mysql.sql-- -------------------------------- The script used when storeMode is 'db' ---------------------------------- the...原创 2022-04-06 12:18:12 · 1092 阅读 · 0 评论 -
使用aop,基于注解记录日志
背景:最近项目有个需求就是需要记录访问指定方法(可能是CRUD中任意一个方法)的日志思路: 我最先想到的是 基于mybatis 的拦截执行器 来实现,参考上篇文章。但是我需要传递各个方法的一些信息,这个貌似不容易做到于是基于 aop aspectj ,可以完成对日志操作的记录步骤一: 导入依赖这里碰到了一个坑,就是 aspectware版本不能太低, 不然启动会报以下错误invalid byte tag in constant pool: 18我是1.8的j.原创 2021-12-30 10:25:06 · 259 阅读 · 0 评论 -
mybatis针对各种CRUD 操作拦截处理,方便日志处理
核心思路就是添加一个mybatis的拦截器,由Invocation invocation 拿到需要的参数信息注意导入的包import org.apache.ibatis.executor.Executor;import org.apache.ibatis.mapping.MappedStatement;import org.apache.ibatis.plugin.*;import org.springframework.stereotype.Component;import..原创 2021-12-29 14:34:24 · 479 阅读 · 0 评论 -
swagger 后端错误信息展示
swagger bug 修复原创 2021-12-29 11:08:25 · 998 阅读 · 0 评论 -
JVM调优技巧
jvm调优技巧前言:学习JVM调优前,你需要了解到jvm内存结构,目前大部分企业都是使用jdk8. 大家可以好好去看看jdk8内存结构的知识。如果你还知道 JMM内存模型,那 ----- 你比较优秀!工具目前常用的工具 有JConsole 和 VisualVmidea 直接在命令行使用:jconsole或者:jvisualVm附上几张效果图有了上面的信息,就可以分析了步骤1.监控GC的状态使用上面的JVM工具,查看当前日志,分析当前JVM参数设置,并且分析当前堆内存快照和g原创 2021-07-06 15:22:41 · 268 阅读 · 1 评论 -
类加载过程
当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现这个类进行初始化。1.加载加载,是指Java虚拟机查找字节流(查找.class文件),并且根据字节流创建java.lang.Class对象的过程。这个过程,将类的.class文件中的二进制数据读入内存,放在运行时区域的方法区内。然后在堆中创建java.lang.Class对象,用来封装类在方法区的数据结构。类加载阶段:(1)Java虚拟机将.class文件读入内存,并为之创建一个Class对象。...原创 2021-05-31 09:40:30 · 73 阅读 · 0 评论 -
线程池详解
思维导图前言在实际开发场景中,我们经常要使用多线程开发应用,比如实现异步操作,或者为了提高程序的效率等等。但是以前我见过有实习生在使用的时候是直接new Runable(),然后start()。没有使用线程池,可能很多初学者对线程池在多线程开发中没有足够的认识,所以我写一篇文章讲讲线程池,希望对大家有所启发。一、什么是线程池线程池借鉴了"池化"技术的思想,线程池能够对线程的生命周期进行管理,对线程重复利用,并且能够以一种简单的方式将任务的提交与执行相解耦。举个例子来说,线程就像是某个原创 2021-04-28 15:42:40 · 182 阅读 · 0 评论 -
Explain在mysql使用技巧
前言在MySQL中,我们知道加索引能提高查询效率,这基本上算是常识了。但是有时候,我们加了索引还是觉得SQL查询效率低下,我想看看有没有使用到索引,扫描了多少行,表的加载顺序等等,怎么查看呢?其实MySQL自带的SQL分析神器Explain执行计划就能完成以上的事情!Explain有哪些信息先确认一下试验的MySQL版本,这里使用的是5.7.31版本。只需要在SQL语句前加上explain关键字就可以查看执行计划,执行计划包括以下信息:id、select_type、table、parti原创 2021-04-15 15:11:00 · 130 阅读 · 0 评论 -
about shiro 在springboot中集成
Shiro 是一个强大、简单易用的 Java 安全框架,主要用来更便捷的认证,授权,加密,会话管等等,可 为任何应用提供安全保障。本课程主要来介绍 Shiro 的认证和授权功能。1. Shiro 三大核心组件Shiro 有三大核心的组件: Subject 、 SecurityManager 和 Realm 。先来看一下它们之间的关系。1. Subject:认证主体。它包含两个信息:Principals 和 Credentials。看一下这两个信息具体是什 么。Principals:身份原创 2021-03-29 16:36:26 · 116 阅读 · 0 评论 -
springboot-aop详解
1. 什么是AOPAOP:Aspect Oriented Programming 的缩写,意为:面向切面编程。面向切面编程的目标就是分离 关注点。什么是关注点呢?就是关注点,就是你要做的事情。假如你是一位公子哥,没啥人生目标,每 天衣来伸手,饭来张口,整天只知道一件事:玩(这就是你的关注点,你只要做这一件事)!但是有个 问题,你在玩之前,你还需要起床、穿衣服、穿鞋子、叠被子、做早饭等等等等,但是这些事情你不想 关注,也不用关注,你只想想玩,那么怎么办呢? 对!这些事情通通交给下人去干。你有一个专门的仆人原创 2021-03-25 17:25:38 · 849 阅读 · 0 评论 -
后端响应值及异常拦截规范
1:定义返回的统一 json 结构前端或者其他服务请求本服务的接口时,该接口需要返回对应的 json 数据,一般该服务只需要返回请 求着需要的参数即可,但是在实际项目中,我们需要封装更多的信息,比如状态码 code、相关信息 msg 等等,这一方面是在项目中可以有个统一的返回结构,整个项目组都适用,另一方面是方便结合全 局异常处理信息,因为异常处理信息中一般我们需要把状态码和异常内容反馈给调用方。编写java beanpublic class JsonResult {/...原创 2021-03-25 12:27:50 · 747 阅读 · 0 评论 -
ThreadLocal比较详细的讲解
ThreadLocalthreadlocal使用方法很简单static final ThreadLocal<T> sThreadLocal = new ThreadLocal<T>();sThreadLocal.set()sThreadLocal.get()threadlocal而是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据,官方解释如下。/** * This class provides thr..原创 2021-03-11 17:42:51 · 139 阅读 · 2 评论 -
分布式缓存十大灵魂点
“今天无聊来撩一下分布式缓存,希望你们喜欢~目录前言目前工作中用到的分布式缓存技术有redis和memcached两种,缓存的目的是为了在高并发系统中有效降低DB的压力,但是在使用的时候可能会因为缓存结构设计不当造成一些问题,这里会把可能遇到的坑整理出来,方便日后查找。一. 常用的两种缓存技术的服务端特点1. Memcache服务端Memcache(下面简称mc)服务端是没有集群概念的,所有的存储分发全部交由mc client去做,我这里使用的是xmemcached,这.原创 2021-03-09 09:57:41 · 88 阅读 · 0 评论 -
分布式事务的多种解决方案
什么是分布式事务分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器「分别位于不同的分布式系统的不同节点之上」。一个大的操作由N多的小的操作共同完成。而这些小的操作又分布在不同的服务上。针对于这些操作,「要么全部成功执行,要么全部不执行」。为什么会有分布式事务?举个例子:转账是最经典的分布式事务场景,假设用户 A 使用银行 app 发起一笔跨行转账给用户 B,银行系统首先扣掉用户 A 的钱,然后增加用户 B 账户中的余额。如果其中某个步骤失败,此时就有可能会出现原创 2021-03-03 17:20:16 · 237 阅读 · 3 评论 -
SpringBoot 中实现跨域的5种方式
一、为什么会出现跨域问题出于浏览器的同源策略限制。同源策略(Sameoriginpolicy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。同源策略会阻止一个域的javascript脚本和另外一个域的内容进行交互。所谓同源(即指在同一个域)就是两个页面具有相同的协议(protocol),主机(host)和端口号(port)二、什么是跨域当一个请求url的协议、域原创 2021-02-23 08:53:32 · 140 阅读 · 0 评论 -
如何保障消息100%投递成功、消息幂等性?
一、前言我们小伙伴应该都听说够消息中间件MQ,如:RabbitMQ,RocketMQ,Kafka等。引入中间件的好处可以起到抗高并发,削峰,业务解耦的作用。如上图:(1)订单服务投递消息给MQ中间件(2)物流服务监听MQ中间件消息,从而进行消费我们这篇文章讨论一下,如何保障订单服务把消息成功投递给MQ中间件,以RabbitMQ举例。二、分析问题小伙伴们对此会有些疑问,订单服务发起消息服务,返回成功不就成功了吗?如下面的伪代码:上面代码中,一般发送消息就是...原创 2021-02-22 10:29:22 · 208 阅读 · 0 评论 -
聊一聊 高可用
本文采用“高可用是什么,为什么要高可用,怎么做高可用,为什么这么做,软件风险又在哪里”的逻辑来介绍。一 高可用是一种控制风险的能力高可用是一种面向风险设计,使系统具备控制风险,提供更高的可用性的能力。二 为什么要高可用对于一个公司而言,“为什么要高可用”可以完整理解为“公司为什么要(做系统)高可用”。以公司为对象,从内看包括:人,软件(物),硬件(物);从外看包括:客户,股东,社会;从自身看包括:公司。高可用的大前提:所有事物都不是100%可靠...原创 2021-02-22 09:06:32 · 351 阅读 · 2 评论 -
设计模式 之 单例模式-02
最简单的 设计模式,还是先列出来吧。 写法多样,你知道几种呢???单例模式单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他...原创 2021-02-09 16:24:06 · 101 阅读 · 0 评论 -
设计模式 之 装饰者模式
背景: 临近放假,手上的活没那么多了, 积累了一些设计模式经验 分享给大家今天说的 是 装饰者模式装饰器模式装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。直接干货 示例demo如下:package com.yzgu.up.disignpattern.deco...原创 2021-02-09 16:08:37 · 129 阅读 · 0 评论 -
HttpClient 的实现原理
一、背景HTTP是一个传输内容有可读性的公开协议,客户端与服务器端的数据完全通过明文传输。在这个背景之下,整个依赖于Http协议的互联网数据都是透明的,这带来了很大的数据安全隐患。想要解决这个问题有两个思路: C/S端各自负责,即客户端与服务端使用协商好的加密内容在Http上通信 C/S端不负责加解密,加解密交给通信协议本身解决 第一种在现实中的应用范围其实比想象中的要广泛一些。双方线下交换密钥,客户端在发送的数据采用的已经是密文了,这个密文通过透明的Http协议在互联网上.原创 2021-02-08 11:19:15 · 972 阅读 · 0 评论 -
参数校验,干货小技巧
项目的参数校验,往往是让人头疼的。 今天教大家一个简单的 参数校验技巧。 抛开 那 看着不爽 if 校验, 或者 你们觉得 优雅一点的 拦截(抛出异常,自定义拦截器处理) 校验。直接使用 spring boot 的validation 吧, 优点: 一般的web项目不需要 你单独引入依赖,有 web-starter 依赖就好 如下: <dependency> <groupId>org.s...原创 2021-02-05 15:43:01 · 345 阅读 · 0 评论 -
写代码的好习惯,减少80%非业务的bug
每一个好习惯都是一笔财富,本文整理了写代码的多个好习惯,每个都很经典,养成这些习惯,可以规避多数非业务的bug!希望对大家有帮助~1. 修改完代码,记得自测一下「改完代码,自测一下」是每位程序员必备的基本素养。尤其不要抱有这种「侥幸心理:我只是改了一个变量或者我只改了一行配置代码,不用自测了」。改完代码,尽量要求自己都去测试一下哈,可以规避很多不必要bug的。2. 方法入参尽量都检验入参校验也是每个程序员必备的基本素养。你的方法处理,「必须先校验参数」。比如入参是否允许为空...原创 2021-02-04 09:42:58 · 385 阅读 · 0 评论 -
Oracle 优化小技巧01
背景: 项目有个表 数据 目前大概就 五百多万。但是还是在不停的新增,没有分区,没有分库分表解决方案: 同事们,马不停蹄的加索引 ,出现如下我同事问我,怎么有个条件加了索引,永远不走索引呢, 被我一眼识破,如上图,这可是 生产环境哦。 各位老哥们还是要细心点啊。。。干货:查询慢, 先不要慌先看看 当前表的 索引有哪些-- 查询表所有的索引select t.*, i.index_type from user_ind_columns t, u...原创 2021-02-02 12:16:28 · 79 阅读 · 0 评论 -
rocketmq 安装、集成、使用
安装rocketmq基于Java编写,首先需要jdk环境1:可以下载source,编译。https://mirror.bit.edu.cn/apache/rocketmq/4.7.1/rocketmq-all-4.7.1-source-release.zip// 也可以直接下载bin文件https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.7.1/rocketmq-all-4.7.1-bin-release.zip2:window原创 2021-01-28 16:14:06 · 555 阅读 · 0 评论 -
拦截器使用技巧
背景: 最近跟一个其他平台接口交互,有个接口鉴权的问题,一个拦截器搞定。我们调用三方多个接口都需要加上token参数,本身就springboot来说, 拿到的request 只能获取 header ,设置header 一般都是属于 客户端操作。比如 使用 postman 可以手动设置请求头 header如果你是使用 httpclient 的话,那么也是很容易解决这个问题的。可以私信我因为我们项目是基于 feign调用。所以我想到的 是统一处理。代码如下新建一个m...原创 2021-01-18 10:53:08 · 363 阅读 · 3 评论 -
新版springboot2.x websocket实现
网上有很多关于WebSocket用法的文章,但是有一些内容错误或者代码不全的,这里来个全的,方便自己记忆。前言:WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocketAPI也被W3C定为标准。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直..原创 2021-01-14 11:47:34 · 243 阅读 · 0 评论 -
双亲委派
来看看你能回答上来多少个:1、什么是双亲委派?2、为什么需要双亲委派,不委派有什么问题?3、"父加载器"和"子加载器"之间的关系是继承的吗?4、双亲委派是怎么实现的?5、我能不能主动破坏这种双亲委派机制?怎么破坏?6、为什么重写loadClass方法可以破坏双亲委派,这个方法和findClass()、defineClass()区别是什么?7、说一说你知道的双亲委派被破坏的例子吧8、为什么JNDI、JDBC等需要破坏双亲委派?9、为什么TOMCAT要破坏双亲...原创 2021-01-11 12:49:31 · 256 阅读 · 0 评论 -
tomcat 异步使用
对于异步处理来说,主要包括异步的开启,异步的执行,异步的结束,异步的超时以及整个异步处理的状态流转,本文我们主要介绍tomcat 异步的开启。异步的开启:对于异步的使用,我们一般有如下代码:public void testAsync(HttpServletRequest request, HttpServletResponse response) { try{ AsyncContext context = request.startAsync(); co.原创 2021-01-11 11:09:56 · 1195 阅读 · 0 评论 -
Netty服务添加https支持,jdk 证书
1、使用JDK自带的keytool生成一个keystore,这个keystore是服务端使用的,直接在bin目录下执行keytool -genkey -alias netty -keypass 123456 -keyalg RSA -keysize 1024 -validity 365 -keystore D:/test/netty.keystore -storepass 1234562、新建一个安全工具类,用于返回一个SSLEngineimport org.slf4j.Logger;i原创 2021-01-08 15:52:07 · 778 阅读 · 1 评论 -
@Validated和@Valid区别:Spring validation验证框架对入参实体进行嵌套验证必须在相应属性(字段)加上@Valid而不是@Validated
Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果。其中对于字段的特定验证注解比如@NotNull等网上到处都有,这里不详述在检验Controller的入参是否符合规范时,使用@Validated或者@Valid在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不原创 2021-01-08 08:40:00 · 520 阅读 · 0 评论 -
spring 强大的钩子函数总结
Spring是我们经常使用的一个框架,它功能之一是提供了我们管理bean对象的手段,而且它提供了很多钩子方法给我们使用。什么是钩子方法呢?钩子方法就是:在bean的生命周期之中,经历了一系列的过程之中,Spring留给我们的一个后门,让我们能在Spring的生命周期之中执行我们想要的方法,从而实现我们想要的功能。接下来我们介绍一下生命周期,然后一个一个介绍我见过的样例或者我自己写的样例。Spring生命周期的各种AwareSpring的生命周期(我们撇开网络上很多资料,因为我觉得网络上很多资料要.原创 2021-01-07 16:00:32 · 1739 阅读 · 1 评论 -
oracle 大数据量表迁移,备份
原表数据 table1 , 177万需要迁移 并备份 到 table2首先创建原始表 table2,保证字段跟 table1 一致依次执行以下sql , 关闭 日志create table OA.CRM_DL_DELIVERY_TMP as select * from OA.CRM_DL_DELIVERY where 1=2;alter table table2nologging;insert into table2select * from table1;...原创 2021-01-04 13:54:23 · 1783 阅读 · 0 评论 -
springboot-cache,缓存使用
适用于同一入参的缓存: <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.4.0</version>原创 2020-12-30 10:22:05 · 202 阅读 · 2 评论 -
row_number() over(partition by 列名1 order by 列名2 desc)的使用
表示根据列名1分组,然后在分组内部根据列名2排序,而此函数计算的值就表示每组内部排序后的顺序编号,可以用于去重复值与rownum的区别在于:使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序,而此函数在包含排序从句后是先排序再计算行号码.---查询所有姓名,如果同名,则按年龄降序SELECTname,age,detail,ROW_NUMBER()OVER(PARTITIONBYnameORDERBYageDESC)FROMTEST_Y...原创 2020-12-28 10:42:19 · 264 阅读 · 0 评论 -
hadoop 下载慢的解决方案
Hadoop国内镜像下载地址:极速下载地址:北京信息学院镜像http://mirror.bit.edu.cn/apache/hadoop/common/版本信息比较全,速度很快请叫我雷锋!原创 2020-12-27 16:58:01 · 4133 阅读 · 4 评论 -
超详细的Redis介绍
redis缓存1、为什么使用redis2、使用redis有什么缺点3、单线程的redis为什么这么快4、redis的数据类型,以及每种数据类型的使用场景5、redis的过期策略以及内存淘汰机制6、redis和数据库双写一致性问题7、如何应对缓存穿透和缓存雪崩问题8、如何解决redis的并发竞争问题正文1、为什么使用redis分析:博主觉得在项目中使用redis,主要是从两个角度去考虑:性能和并发。当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布原创 2020-12-26 19:45:10 · 249 阅读 · 0 评论 -
idea快捷键
Ctrl快捷键 介绍 Ctrl + F 在当前文件进行文本查找 (必备) Ctrl + F 在当前文件进行文本查找 (必备) Ctrl + R 在当前文件进行文本替换 (必备) Ctrl + Z 撤销 (必备) Ctrl + Y 删除光标所在行 或 删除选中的行 (必备) Ctrl + X 剪切光标所在行 或 剪切选择内容 ...原创 2019-02-27 16:45:15 · 127 阅读 · 0 评论 -
基于Java连接opc,总结。
公司电脑 win10 ×64位的,网上说Win10 连不上,纯属扯犊子...步骤:1、首先在自己电脑上安装一个OPCserver,网上有两种可以选择,我本地安装的如下,具体安装教程网上都有。 参考 连接:https://www.cnblogs.com/ioufev/p/9928971.html2、其次,也是很重要的一步,你需要修改DCOM的一些配置,这个不弄,基本上...原创 2019-02-28 11:02:47 · 3823 阅读 · 0 评论 -
SpringBoot:多数据源配置
排除自动配置springboot会自动读取配置文件,由于我们需要配置多数据源,所以要排除自动配置,在启动入口添加如下注解@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})配置数据源在application.yml中配置两个数据源spring: datasource: fir...原创 2019-02-26 15:52:20 · 177 阅读 · 0 评论 -
SpringBoot:文件上传
单一文件上传@PostMapping("uploadOne") public String uploadOne(@RequestParam("file") MultipartFile file, RedirectAttributes redirectAttributes){ if(file.isEmpty()){ redirectAttribu...原创 2019-02-27 09:41:46 · 167 阅读 · 0 评论