自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Mac下通过nvm管理node

本地有两个项目,老项目需要用到node 14,新项目需要用node 16,所以只能通过nvm来管理node了。

2023-10-12 18:08:32 661

原创 Mac下docker安装MySQL8.0.34

学习并记录一下如何用docker部署MySQL

2023-10-05 23:30:11 1157

原创 PreparedStatement批量插入/更新数据优化——setObject与set具体类型的效率差异

使用做数据更新时,尽可能不要使用setObject方法,数据库中字段是什么类型,就set什么。还是不要太省事儿了。-_-||

2022-10-08 23:38:48 1328 1

原创 程序员常用linux命令

程序员常用linux命令ssh 远程服务器登陆scp 文件上传下载文件上传文件下载tar解压ssh 远程服务器登陆可以用来实现远程服务器登陆,具体的命令如下ssh 用户名@ip,输入命令后,再输入密码即可scp 文件上传下载文件上传文件上传命令:scp 文件路径 远程服务器用户名@远程服务器ip:远程服务器目录比如我从本地的Windows机器将下载好的nacos压缩包上传文件到linux服务器,可以执行下面这个命令scp c:\Users\用户\Downloads\nacos-server-2

2022-09-20 17:36:45 868

原创 tomcat以服务方式启动后,jps、jstat等命令失效问题排查

将Tomcat注册成服务后,通过命令查找不到进程,但是在windows资源管理器中可以看到进程,同时使用命令提示not fount,但是命令正常,如下图:Tomcat启动系统访问正常Windows资源管理器中可以看到进程信息通过jsp命令找不到进程命令提示命令正常的工作原理其实也不复杂,jvm启动后,会在C:\Users\用户\AppData\Local\Temp\hsperfdata_用户下成文件,读的就这这个目录下的文件。现在这个目录是空的,所以查询后,也查不到信息。当我启动idea(i

2022-07-13 10:30:49 1605

原创 从零安装Redis

如果想安装具体的版本,那么可以到这里查看所有稳定版的下载链接https://github.com/redis/redis-hashes我这里安装的Redis 6.x的最后一个版本下载好后,执行解压命令切换到redis-6.2.7下,执行如果出现报错,则可能是gcc没有安装安装gcc 安装完成后,再次执行,如果出现下面的错误,改成如果成功,那么我们应该可以在src目录下找到redis-server和redis-cli这两个文件到此为止,我们已经可以使用redis-server来启动rR

2022-07-05 23:36:47 256

原创 zsh: command not found: ftp

网上很多资料都说要要配置环境变量什么的,其实都不对。真正的原因是ftp被移除了,但是我们可以使用brew重新安装。安装成功后,我们就可以执行ftp 命令了如果在安装过程中出现,那么需要执行一下这时git会提示brew的目录不受信任,需要执行语句,然后我们根据提示执行命令即可。...

2022-06-04 00:38:50 1780 2

原创 for example: not eligible for auto-proxying问题排查

最近项目上搭了一个demo,整合了。但是奇怪的是,服务起来之后在SpringBootAdmin中可以看到demo服务,但是无法监控到demo服务的jvm信息。查看源码后发现jvm相关的监控信息是由这个Bean处理的,再查看日志,在应用服务的日志中我们可以找到如下信息问题探究那么到底是个什么问题呢?这个问题就要从Spring的启动流程说起了。在Spring实例化Bean之前会先实例化所有的正常来说,所有的BeanPostProcessor都应该在所有的Bean实例化前实例化好,但是,BeanPostP

2022-06-03 18:26:32 18620

原创 深入理解网络通信与TCP/IP协议

深入理解网络通信与TCP/IP协议计算机网络体系结构OSI 七层模型TCP/IP 五层模型数据如何通过网络5层模型传输的计算机网络体系结构OSI 七层模型参考模型解释应用层为应用程序提供服务表示层数据格式转化、数据加密会话层建立、维护和管理会话传输层建立、管理和维护端到端的连接网络层IP选址及路由选择数据链路层提供介质访问和链路管理物理层物理层TCP/IP 五层模型TCP/IP的五层模型将OSI七层模型的上三层(应用层、表示

2022-05-07 22:17:54 670

原创 基于redis实现分布式锁的几种方式与问题

基于redis的分布式锁的演化与探究

2022-04-18 22:54:15 635

原创 如何解决应用系统数据库与缓存一致性问题

随着互联网应用的普及,内容信息越来越复杂,用户数和访问量越来越大,我们的应用需要支持更多的并发量,同时我们的应用服务与数据库服务器所做的计算也越来越多。但是我们的应用服务器的资源是有限的,很多时候性能的瓶颈会出现在各种IO上面。此时,就需要我们引入缓存机制,减少IO,减少计算,提高响应速度,优化用户体验。

2022-04-18 22:50:02 572

原创 tomcat从零开始配置https

从零开始配置https生成证书创建证书导出证书导入证书查看密钥库条目tomcat配置https生成证书使用https需要生成证书,我们可以使用jdk自带的keytool来生成证书在cmd中执行keytool就可以看到keytool支持的命令:如果提示keytool不是内部或外部命令,要么配置jdk环境变量,要么cd切到jdk的bin目录下创建证书创建证书主要使用genkeypair命令,如下:生成一个名为casserver_test的密钥对keytool -genkeypair -

2022-04-07 18:05:46 3633 3

原创 备忘录模式与编辑器

通过编辑器的例子了解备忘录模式备忘录模式编辑器三级目录备忘录模式备忘录模式是一种行为设计模式,允许在不暴露对象细节的情况下保存和恢复对象之前的状态编辑器备忘录就是典型的存读档模式。存档,保存当前游戏进度以及人物信息等;读档,恢复游戏进度和人物信息等操作。三级目录...

2022-04-04 22:48:32 266

原创 使用@Lazy解决循环依赖问题

使用@Lazy解决循环依赖问题现象问题探索循环依赖产生的原因破除循环依赖@Lazy解决循环依赖的方式总结现象现在有两个Bean,一个叫beanA,一个叫beanB,beanA通过构造器依赖beanB,beanB通过 @Autowrited依赖beanA:BeanA.java@Componentpublic class BeanA { private final BeanB beanB; public BeanA(BeanB beanB) { this.beanB

2022-04-01 20:45:49 9621 4

原创 CGLIB代理Controller后导致空指针异常

Cglib代理Controller后导致空指针异常原始程序加入切面问题排查问题解决引申首先我们看下没有使用CGLIB对Controller进行代理时代码的样子原始程序@SpringBootApplicationpublic class CglibProxyProblemMain { public static void main(String[] args) { SpringApplication.run(CglibProxyProblemMain.class, args);

2022-03-28 23:41:24 1240

原创 原型模式与深拷贝浅拷贝

原型模式与深拷贝浅拷贝原型模式Java中的原型模式简单的例子浅拷贝深拷贝效率比较原型模式用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。使用这种方式创建对象非常高效,根本无需知道对象创建的细节。这让我想到了docker的镜像Java中的原型模式Java自带了原型模式clone()方法,但是使用clone()方法有两个条件重写父类(Object类)的clone方法,将clone设置为public的实现标记性接口Cloneable简单的例子publi

2022-03-24 22:44:57 507

原创 点菜系统中的命令模式

点菜系统中的命令模式现实生活中的命令模式命令模式三级目录现实生活中的命令模式首先我们来回顾一下去饭店吃饭是如何点菜的:服务员来给我们看下菜单我们告诉服务员我要什么菜服务员告诉厨师要做什么菜上菜在整个流程中,实际做菜的厨师并没有与我们进行交互,取而代之的是服务员。服务员与我们沟通后,将沟通的结果告诉厨师,厨师做菜,服务员上菜。这样做有什么好处呢?好处是专人专责。厨师只负责做菜做菜做菜,其他的工作由服务员来做,这样就提高了厨师的工作效率,使厨师可以专注于做菜这一件事儿。命令模式命令模式是一

2022-03-17 23:07:42 817

原创 Java性能优化心得

性能优化心得傻瓜式优化傻瓜一式傻瓜二式深入优化分享一下最近做的一次性能调优这是篇总纲性的性能优化心得,并不涉及具体的技术手段傻瓜式优化我把程序优化的初级阶段称为傻瓜式优化。傻瓜式的好处在于简单、明了、见效快。缺点就是这样的优化存在优化瓶颈,可能无法达到我们预期的性能指标。在程序性能调优过程中最常见的就是这种傻瓜式的优化。傻瓜一式当项目上出现性能问题,如果是针对特定操作的性能问题,那可以通过jstack pid来看线程dump,从线程dump中大概率可以看到比较明显的问题。然后我们进行针对性的调

2022-02-17 11:52:07 347

原创 灯的演化与桥接模式

灯的演化与桥接模式灯桥接模式实践ILightTube 灯管AbstractLight 抽象的灯灯在功能方面的扩展灯在材料方面的扩展BridgeMain运行结果总结灯在了解桥接模式之前,我们先来看看灯。从材料的角度看,灯管是灯的核心从功能和使用场景看,单纯的灯又能分为台灯、吊灯等这样一组合,仅仅是按照上面的图中的场景算,也有6种组合了。针对上面这种业务场景,我们在程序中应该如何应对呢?桥接模式桥接模式将抽象部分与它的实现部分分离开来,使他们都可以独立变化。桥接模式将类之间静态的继承关系转化

2022-01-30 22:33:29 1082

原创 基于linux的定时任务实现tomcat服务的定时重启

基于linux的定时任务实现tomcat服务的定时重启分析实现自动启停脚本定时任务总结这两天项目有个需求说希望可以定时重启tomcat,然后临时研究了一下,在这里记录一下吧分析首先,我觉得要实现定时自动启停tomcat要分四步:找到tomcat的pid停止现在正在跑的tomcat实例启动tomcat实例用定时任务定期跑上面的逻辑实现自动启停脚本自动启停脚本test.sh,具体内容如下:#!/bin/sh. /etc/profile# 根据jps-v命令和关键字查询到具体的应用,

2022-01-27 17:07:29 2181

原创 使用适配器模式将异构系统同构化

使用适配器模式将异构系统同构化

2022-01-26 23:28:33 484

原创 做晚饭与建造者模式

做晚饭与建造者模式建造者模式做晚饭SimpleBuilder反思可复用的建造者抽象的建造者 BaseMealBuilder具体的建造者 FatherMealBuilder & MotherMealBuilder指挥者 Baby使用总结建造者模式是一个相对比较简单的设计模式,我们都知道建造者模式是用来创建对象的。接下来我们用做晚饭的例子来全面的了解一下建造者模式。建造者模式建造者设计模式可以使一个复杂对象的构造与它的表示分离,让同样的构造过程可以创建不同的表示。它将一个复杂的对象分解为多个简单的

2022-01-21 23:33:41 479

原创 使用访问者模式给抽象语法树打印逆波兰式和彩虹括号

使用访问者模式给抽象语法树整活访问者模式需求程序改造定义访问者接口对节点进行少量的改造实现Rainbow Brackets实现逆波兰式打印Main运行结果思考在上一篇文章中,为了给访问者模式做铺垫,我从零开始撸一个抽象语法树出来,今天我们用访问者模式给语法树整点活。访问者模式访问者模式是一种行为设计模式,它将算法与其所作用的对象隔离开来。通过这种方式,元素的执行算法可以随着访问者的改变而改变。对于Java而言,访问者模式为我们提供了双重分派的功能。需求访问者模式的概念说起来有点绕,我们先看看这次改

2022-01-19 22:41:59 509

原创 如何搞一个支持自定义函数和变量的四则运算的抽象语法树出来

从零开始撸一个抽象语法树出来楔子需求思考BNF范式BNF范式应用回顾实现公共的Node节点表达式节点 Expression静态变量节点 StaticNode数据节点 DataNode函数节点 FunctionNode操作符节点 Operator加法处理节点 Add减法处理节点 Minus乘法处理节点 Multiply除法处理节点 Divide自定义函数扩展函数接口 IFunction函数参数说明 FunctionParam自定义函数 Max自定义函数 Plus100入口测试测试样例测试结果总结楔子本来最

2022-01-18 16:44:17 667

原创 容器遍历新姿势,迭代器模式

容器遍历新姿势,迭代器模式迭代器模式理解一个图书馆的例子迭代器接口图书馆对象main执行结果思考迭代器模式提供一种方法,顺序访问集合中的各种元素,而又不暴露该对象的内部表示。理解迭代器的精髓就是,我是一个容器,但是我不告诉你我具体是用什么实现的容器,同时,我给你一个对象,你可以用这个对象来遍历我这个容器。迭代器模式很好的体现了封装和面向接口的编程思想。一个图书馆的例子我们都知道图书馆里会有很多本书。那么图书馆也算是一种容器,接下来我们用图书馆的例子来看看迭代器模式。迭代器接口首先我们定义一

2022-01-14 22:35:32 308

原创 从JavaApi的角度一次搞懂五种IO模型~附服务端和客户端代码

一次搞懂五种IO模型操作系统层面的IOSocket Read的过程思考五大IO模型同步阻塞IOBIOServerBIOClient运行结果同步非阻塞IO在说IO模型之前,我们得先知道java程序发起read请求时,操作系统到底干了什么?操作系统层面的IO在linux上基于安全的考虑,用户态的CPU只能访问用户空间,内核态的CPU可以访问整个进程空间。并且,只有内核态下可以直接访问各种硬件资源,比如磁盘和网卡。当CPU处于Ring3时为用户态,处于Ring0时为内核态。当我们的程序发起阻塞rea

2022-01-11 23:25:26 375

原创 使用代理模式手写简单的数据库连接池

使用代理模式手写简单的数据库连接池JDBC直连数据库思考改造ConnectionProxyConnectionPoolProxyMain运行结果代理模式与装饰器的区别JDBC直连数据库我们都知道要连接数据库需要使用JDBC,所以我们先看个简单的demo。下面这个例子单纯的使用JDBC连接数据库并查询其中的数据/** * 代理 * @author skyline */public class JDBCMain { private static final Logger logger =

2022-01-08 15:58:29 995

原创 内存优化利器,享元模式

内存优化利器,享元模式需求子弹的抽象规格各种具体的规格子弹与子弹工厂生产子弹问题思考改造享元模式字符串常量池总结在了解什么是享元模式之前,我们先来看个问题。需求我们需要创建一个兵工厂,这个兵工厂复制生产各种型号的子弹。每个子弹都需要型号说明和自己独一无二的标识。然后我用下面的代码实现了一份出来。子弹的抽象规格/** * 子弹规格,抽象对象 */public abstract class BulletSpecification { /** * 口径,mm * @r

2022-01-01 21:29:24 383 5

原创 在gradle工程使用jmh并集成SpringBoot

在gradle工程使用jmh测试spring什么是JMH我们为什么需要JMHgradle依赖String效率基本参数概念@BenchmarkMode@State@OutputTimeunit@Warmup@Measurement@Fork@Thread@Param实战一、Random与ThreadLocalRandom二、写热点三、同步队列性能测试+SpringBoot集成参考链接什么是JMHJMH,Java Microbenchmark Harness,是专门用于代码微基准测试的工具套件。jmh官网

2021-12-29 14:38:42 635 4

原创 订单与组合模式

订单与组合模式订单组合模式代码定义顶层接口一些具体的商品苹果笔记本牛奶茶叶订单main总结订单订单在我们的日常生活中非常常见。有时候一个订单中会包含其他的订单,就像下面这样:在order订单中包含了两个子订单和一瓶牛奶,两个子订单又分别有自己的内容。这样就形成了一个订单树,具体的商品是叶子节点,订单是非叶子节点。就像下面这样:那么我们应该怎么处理这种树形结构呢?答案就是使用组合模式组合模式组合模式是一种结构型设计模式,你可以使用它将对象组合成树状结构,并且能够像使用独立对象一样使用它们,所以

2021-12-25 23:07:56 622

原创 过滤器与责任链模式

过滤器与责任链模式Filter责任链模式通过责任链对消息进行处理源码结果反思与思考Servlet中的Filter模拟Servlet中Filter的处理模式demo效果Filter说起Filter大家应该都不陌生。Filter一般用于Servlet处理之前做一些前置的校验。如果校验通过,那么调用chain.doFilter(request, response)就可以让下一个filter继续执行逻辑。Filter是责任链模式的一种应用。接下来我们将探索、模拟Filter的实现逻辑。责任链模式责任链模式是

2021-12-23 21:50:46 1805

原创 事件中心与观察者模式

事件中心与观察者模式楔子观察者模式事件中心demo被观察者具体的事件观察者具体事件的具体观察者主题具体的主题—>事件中心验证事件中心总结楔子event一种我们在代码中经常使用的对象。我们通过一定的方式创建出一个event,然后调用上下文将event发送出去。对应的listener就会收到消息并执行响应的逻辑。我们都知道这种基于“事件”的开发中,用到设计模式就是观察者模式(也叫发布订阅模式),那么什么是观察者模式呢?观察者模式观察者模式是一种行为设计模式,允许你定义一种订阅机制,可在对象时间发

2021-12-15 22:58:58 1087

原创 咖啡馆与装饰模式

咖啡馆与装饰模式需求思考装饰模式的定义代码样例原材料基类然后扩展一些我们会用到的原材料最后,我们来生产咖啡吧总结需求楼下的咖啡馆要开业了,我们看看他们主营的产品有哪些:热牛奶高乐高摩卡卡布奇诺…然后,咖啡馆的需求就来了:产品不同,售价也不同。同时作为咖啡馆,经常需要推出新品。思考看到这个需求,第一反应是通过继承来解决这些问题。解决思路如下:我们先定义一个饮料的基类扩展这个基类,生成热牛奶、高乐高、摩卡等子类通过工厂的方式返回这些子类(也就是生成饮料)。这也算是一种中规中矩

2021-12-13 22:52:03 434

原创 log4j2核弹级漏洞原理和分析

log4j2漏洞原理和分析起因漏洞问题重现依赖常规的日志写法lookupsJndi Lookup漏洞补救漏洞解决起因这两天被log4j2的漏洞给刷屏了,就像下面这样但是很少有人提及这个漏洞到底是怎么回事儿。log4j2最为非常顶尖的日志框架,怎么会出现这种级别的漏洞呢?了解过漏洞的原理之后我发现,这应该算是一种低级漏洞了。原理就是JNDI代码注入。不过我也是先刷到了大都督的视频才了解了原因的Log4j高危漏洞!具体原因解析!全网第一!,不得不说,大都督还是叼。漏洞问题重现依赖首先,先码一下依赖

2021-12-11 20:41:34 21310 11

原创 红绿灯与调停者模式

红绿灯与调停者模式生活中的例子调停者说明代码样例总结生活中的例子        我们每天都会过马路,当十字路口有红绿灯时,我们只需要等绿灯亮就可以安心的走了。但是如果没有红绿灯,我们在过马路时就需要仔细多了。我们需要不停的观察路上行驶的车辆,小心谨慎的走,直到穿过马路。        将上面的例子类比到代码的世界里,不管是人还是车辆都可以算作是

2021-12-03 21:50:41 361

原创 从新生入学流程的例子看门面模式

应对复杂第三方系统的利器——门面模式门面模式说明优点缺点例子定义门面提供具体的实现类与具体的逻辑使用门面结果总结常见的门面模式门面模式说明门面模式是一种构造型设计模式,能为程序库、框架或其他复杂类提供一个简单接口优点你可以让自己代码独立于复杂的子系统缺点外观类可能会成为程序中与所有类都耦合的上帝对象如果设计不当,当子系统新增功能时,可能会需要修改门面类,这样就违背了开闭原则例子接下来我们通过这个新生入学流程的例子来体会一下门面模式的有点与缺点定义门面我们定义一个学校的门面,这个

2021-11-30 22:10:40 284

原创 从餐具的生产说到抽象工厂

从餐具的生产说到抽象工厂什么是抽象工厂理解餐具工厂总结与工厂方法的对比在上一篇文章中我们探索和了解了什么是工厂模式,接下来我们继续深入到抽象工厂什么是抽象工厂抽象工厂模式是一种创建型设计模式,它能创建一系列相关的对象,而无需指定其具体类理解我对抽象工厂模式的理解是为了创建一套一套的产品而存在的工厂模式。比如:网页风格可以使用抽象工厂模式,一键换肤,朋克画风、Q版画风、极简画风等。游戏中的地图风格也可以使用抽象工厂模式,熔岩地图、冰雪地图、沙漠地图等。餐具生产厂商也可以使用抽象工厂模式,生产

2021-11-26 22:27:31 340

原创 从筷子的生产说到工厂方法

从筷子的生产说工厂方法理解筷子生产线定义产品接口定义工厂接口定义具体的工厂和产品竹筷子工厂和竹筷子木筷子工厂和木筷子使用工厂工厂方法工厂方法是一种创建型生产模式。在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型。理解按照我的理解,工厂方法主要的意图是隐藏new方法,封装对象的创建方法,让使用者更关注对象本身,而不是如何创建这个对象。接下来我们用筷子生产线的例子来感受一下工厂方法。筷子生产线定义产品接口首先我们定义一下产品的接口,也就是筷子/** * @author wangx

2021-11-25 22:29:42 335

原创 ReentrantReadWriteLock使用场景思考及验证

ReentrantReadWriteLock使用场景思考CachedDataRWDictionary思考和验证最近一直在琢磨ReentrantReadWriteLock的使用场景是什么,后来突然就想明白了,其实就是读读并发、读写互斥、写写互斥而已。如果一个对象并发读的场景大于并发写的场景,那就可以使用ReentrantReadWriteLock来达到保证线程安全的前提下提高并发效率。首先,我们先了解一下Doug Lea为我们准备的两个demo。CachedData一个缓存对象的使用案例,缓存对象在使用

2021-11-21 21:34:07 2471 16

原创 HikariPool-1 - Connection is not available, request timed out after 6000ms

Connection is not available, request timed out after 6000ms问题排查论证通过demo重现问题总结问题今天项目上频繁出现了大量的这样的报错Caused by: java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 6000ms. at com.zaxxer.hikari.pool.

2021-11-11 22:16:57 15931

空空如也

空空如也

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

TA关注的人

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