- 博客(305)
- 资源 (3)
- 收藏
- 关注
原创 JDBC编程的六个步骤以及使用示例(详细)
2.获取数据库连接:Java进程和Mysql进程之间的通道开启了。1.注册驱动:通知Java程序我们要连接的是哪个品牌的数据库。5.处理查询结果集:如果第四步有select语句才有这一步。4.执行SQL语句:对数据库进行CRUD(增删改查)操作。3.获取数据库操作对象:这个对象是用来执行sql语句的。6.释放资源:关闭所有资源。
2022-09-18 22:56:49
3123
3
原创 JDK1.8新特性CompletableFuture
JDK1.8 中提供的 CompletableFuture 提供了异步函数式编程。可以帮助我们简化异步编程的复杂性,通过回调的方式处理计算结果,并且提供了转换和组合的方法。CompletableFuture是JDK1.8版本新引入的类,使用completionStage接口去支持完成时触发的函数和操作。一个completetableFuture就代表了一个任务。他能用Future的方法。还能做一些之前说的executorService配合futures做不了的。
2022-09-04 23:46:18
990
1
原创 Arthas 快速入门
如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。清除当前窗口的所有命令cls查看当前运行线程thread查看某个线程的栈信息thread线程号。下载arthas-boot.jar,然后用java-jar的方式启动。thread1会打印线程ID1的栈,通常是main函数的线程。如果想完全退出arthas,可以执行stop命令,相当于结束整个会话。输入q,或者ctrlC退出来。......
2022-07-17 21:55:01
828
4
原创 Spring AOP 面向切面编程
面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来。主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等。主要意图:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑代码。AOP特点:采用横向抽取机制,取代了传统纵向继承体系重复性代码。 aop全称Aspect Oriented Programming,面向切面,AOP主要实现的
2022-07-10 22:49:50
661
3
原创 Mybatis执行插入语句后并返回主键ID
我们知道JDBC可以实现插入语句后返回主键Id,那mybatis可以实现吗?答案是肯定的。(1)这里设置的MySQL的主键是自增的,SELECT LAST_INSERT_ID()返回的是最后一个ID值的意思。(2)传入的参数必须为对象,不能为string,int之类的单个参数(3)order属性,取值范围BEFORE/ AFTER,指定是在insert语句前还是后执行selectKey操作。AFTER一般用于MySQL自增的情况下,BEFORE一般用于自定义的ID的获取。(4)keyProperty属
2022-06-26 22:03:19
6196
2
原创 公平锁与非公平锁
首先先解释公平和非公平这样一个概念,所谓公平是说,竞争锁资源的一个线程严格按照请求的顺序来分配锁;而非公平是说,竞争锁资源的一个线程允许插队来抢占锁资源。ReentrantLock默认采用了非公平锁的策略来去实现锁的一个竞争,其次ReentrantLock内部使用了AQS来实现锁资源的一个竞争,没有竞争到锁资源的线程会加入到一个AQS的同步队列里边,这个队列是一个FIFO的双向链表,公平的实现方式就是线程在竞争锁资源的时候会判断AQS队列里边有没有等待线程,如果有就加入到队列的尾部进行等待,而非公平锁的实现
2022-06-19 21:24:11
344
原创 jvm配置+OmitStackTraceInFastThrow 导致不打印日志具体信息
排查测试环境日志时,发现订单有映射处理异常没有被抓到,但是打印的异常信息居然是空的,没有具体的原因。异常信息打印不全,只有java.lang.NullPointerException,查询到的日志信息只有这么一点,但是又发现有的其他异常信息是正常的有完整的具体信息通过查询资料了解到:JVM默认是启用:-XX:+OmitStackTraceInFastThrow,当打印同样的错误日志到一定次数就会被JVM默认优化掉。JDK5以后JVM做了一个优化,当同样的错误日志频繁打印,JIT会重新编译抛出没有堆栈的信息异
2022-06-05 22:06:52
942
原创 Gateway
1. 什么是 API 网关(API Gateway)在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管理。这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,这就要求必须使用一种语言和平 台无关的服务协议作为各个单元间的通讯方式。(1)API 网关的定义网关的角色是作为一个 API 架构,用来保护、增强和控制对于 API 服务的访问。API 网关是一个处于应用程序或服务(提供 REST API 接口..
2022-04-25 23:35:01
394
原创 无锁环形缓存器RingBuffer的原理
背景在多线程环境下为了保证线程安全,往往需要加锁,例如读写锁可以保证读写互斥,读读不互斥。有没有一种数据结构能够实现无锁的线程安全呢?答案就是使用RingBuffer循环队列。在Disruptor项目中就运用到了RingBuffer。RingBuffer基本原理在RingBuffer中设置了两个指针,head和tail。head指向下一次读的位置,tail指向的是下一次写的位置。RingBuffer可用一个数组进行存储,数组内元素的内存地址是连续的,这是对CPU缓存友好的----也就是说,在硬件
2022-04-17 21:36:20
3858
原创 RateLimiter限流
限流背景在早期的计算机领域,限流技术(time limiting)被用做控制网络接口收发通信数据的速率。可以用来优化性能,减少延迟和提高带宽等。现在在互联网领域,也借鉴了这个概念,用来为服务控制请求的速率,如双十一的限流,12306的抢票等。即使在细粒度的软件架构中,也有类似的概念。系统在使用下游资源时,需要考虑下游对资源受限,处理能力,在下游资源无法或者短时间内无法提升处理性能的情况下,可以使用限流器或者类似保护机制,避免下游服务崩溃造成整体服务的不可用。限流相关概念在介绍限流之前先介绍几
2022-03-27 22:33:47
8477
原创 Java与PHP语言实现RC4加解密
RC4加解密简介RC4不是对明文进行分组处理,而是字节流的方式依次加密明文中的每一个字节,解密的时候也是依次对密文中的每一个字节进行解密。算法简单,运行速度快,而且密钥长度是可变的,可变范围为1~256字节(8-2048比特)密钥流:RC4算法的关键是根据明文和密钥生成相应的密钥流,密钥流的长度和明文的长度是对应的,也就是说明文的长度是500字节,那么密钥流也是500字节。当然,加密生成的密文也是500字节,因为密文第i字节=明文第i字节^密钥流第i字节 状态向量S:长度为256,S[0],S
2022-03-20 15:34:06
941
原创 spring-retry 重试框架
前言有些场景需要我们对一些异常情况下面的任务进行重试,比如:调用远程的RPC服务,可能由于网络抖动出现第一次调用失败,尝试几次就可以恢复正常。spring-retry是spring提供的一个基于spring的重试框架,非常好用。官网地址:GitHub - spring-projects/spring-retry使用说明1、引入maven依赖<dependency> <groupId>org.springframework.retry</group.
2021-12-26 21:28:36
1190
3
原创 RocketMQ--架构原理
目录一、RocketMQ专业术语二、流程图三、详解Broker四 Consumer (消费者)五、 Producer(生产者)参考RocketMQ是阿里开源的分布式消息中间件,跟其它中间件相比,RocketMQ的特点是纯JAVA实现;集群和HA实现相对简单;在发生宕机和其它故障时消息丢失率更低。一、RocketMQ专业术语先讲专业术语的含义,后面会画流程图来更好的去理解它们。Producer消息生产者,位于用户的进程内,Producer通过NameServer获取
2021-12-12 22:05:44
373
1
原创 SpringBoot集成Redis | 使用注解动态切换Redis库
【摘要】 SpringBoot集成Redis | 使用注解动态切换Redis库由于工作中不同的数据信息缓存在不同的redis的16个库中,当某个地方需要用到的时候,切换redis库不方便,下面讲解的即可简便操作,可直接集成于common包中本人已将项目打包到github,有需要的可以直接去拿项目地址-github:https://github.com/Linsider/redis大家看完可以导入项目跑...由于工作中不同的数据信息缓存在不同的redis的16个库中,当某个地方需要用到的时候,切换re.
2021-11-28 21:23:08
1017
原创 自定义注解之运行时注解(RetentionPolicy.RUNTIME)
<div id="article_content" class="article_content clearfix"> <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-1a85854398.css"> <div id="content_views" class=...
2021-11-28 21:09:30
676
转载 Java8新特性 stream流常用方法
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。元素流在管道中经过中间操作(intermediate operation)
2021-11-21 21:44:10
363
原创 Prometheus+Grafana 搭建全方位的监控告警系统
一、Prometheus介绍Prometheus是一个最初在SoundCloud上构建的监控系统。自2012年成为社区开源项目,拥有非常活跃的开发人员和用户社区。为强调开源及独立维护,Prometheus于2016年加入云原生云计算基金会(CNCF),成为继Kubernetes之后的第二个托管项目。Prometheus是一个非常优秀的监控工具,准确的说,更是一套监控方案。Prometheus提供了监控数据收集,存储,处理可视化和告警的一套完整的监控解决方案。二、特点Prometheus由Go..
2021-11-14 22:19:19
3409
原创 RestTemplate使用详解
一、什么是RestTemplateRestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。RestTemplate 继承自 InterceptingHttpAccessor 并且实现了 RestOperations 接口,其中 RestOperations 接口定义了基本的 RESTf...
2021-11-07 21:39:35
59827
原创 如何动态改变日志级别
前言 关于日志级别,大部分项目可能都设置为info级别,当然也可能有一些追求性能或者说包含很多敏感信息的项目直接将级别设置为warn或者error;这时候如果项目中出现一些未知异常,需要用到很详细的日志信息,此时如果项目中没有动态改变日志级别的机制,排查问题将很棘手。 日志系统 我们常用的一些日志系统包括:Log4j2、Logback、Java Util Logging;我们想动态改变日志的级别,前提是这些日志系统都支持我们直接设置日志等级,当然这些系统提供了很简单的接口; Log4j2 Logg
2021-10-25 21:49:32
2495
1
原创 RedisTemplate increment 错误:ERR value is not an integer or out of range解决
环境:springboot+Redis: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version> </parent>
2021-09-07 16:14:02
3414
2
原创 Thymeleaf 一篇文章让你快速搞懂基本用法与功能
前言Thymeleaf介绍SpringBoot与Thymeleaf的集成Thymeleaf常用语法变量1.1、变量案例1.2、动静结合1.3、ognl表达式的语法糖1.4、自定义变量方法2.1、ognl表达式支持方法调用2.2、Thymeleaf内置对象2.3、字面值2.4、拼接运算循环逻辑判断分支控制switchJS模板前言因工作需要,闲来无事整理了一篇关于thymeleaf的快速入门教程,有些前端基础的童鞋应该一看就懂了,使用和Vue类似但是又有些许差别,不过话说回来语言都是相通的,以不变应万变。.
2020-12-27 22:57:22
1677
1
原创 JSONPath表达式
前言JSONPath是一种简单的方法来提取给定JSON文档的部分内容。JSONPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容。JSONPath表达式语法1、操作符?:问号,标记表达式的开头。使用的语法 [?(表达)]例如:[?(Expression)]@:在符号处表示正在处理的当前节点。语法使用$.books[?@.price>100]注意:使用JSONPath的[]操作符操作一个对象或者数组,索引是从0开始。
2020-10-30 15:17:12
2104
原创 fastJSON应用:String,JSONObject,JSONArray相互转换
前言fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。下面对常用到的关于String,JSONObject,JSONArray的相互转换。package TEST;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import com.alibaba.fastjso
2020-10-24 12:11:59
1178
1
转载 Mysql-5.6.35 win10x64安装步骤
添加环境变量(个人认为只需要添加到用户变量就好,系统变量尽量不要去修改) 变量名:MYSQL_HOME 变量值:D:\Program Files\MySQL 即为mysql的自定义解压目录。 再在Path中添加 %MYSQL_HOME%\bin 注册windows系统服务 将mysql注册为windows系统服务 操作如下: 1)鼠标右键开始菜单选择”命令提示符(管理员)” 2)输入服
2020-10-09 21:54:33
316
原创 Linux中的grep和管道符
找出文件夹下包含 “aaa” 同时不包含 “bbb”的文件,然后把他们重新生成一下。要求只能用一行命令。我对Linux 是个白痴,工作了之后才开始接触的,会用的命令只有那几个常用的。这个问题对我来说就有点难度,我只是大概知道查找文件用 grep ,其他的就不知道了。不过没关系,用Google ,查找到 grep 的完整用法:1、grep -l ‘boss’ * 显示所有包含boss的文件名。2、grep -n ‘boss’ file在匹配行之前加行号。3、grep -i ‘boss’ file显示匹
2020-09-15 21:33:46
1100
1
原创 Mybatis的优缺点
优点1、简单易学mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个SQL映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。2、灵活mybatis不会对应用程序或者数据库的现有设计强加任何影响。SQL写在XML里,便于统一管理和优化。通过SQL基本上可以实现我们不使用数据访问框架可以实现的所有功能,或许更多。3、解除SQL与程序代码的耦合通过提供DAL层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测
2020-09-15 21:12:50
1522
转载 Spring事务管理嵌套事务详解 : 同一个类中,一个方法调用另外一个有事务的方法
Spring 事务机制回顾 Spring事务一个被讹传很广说法是:一个事务方法不应该调用另一个事务方法,否则将产生两个事务. 结果造成开发人员在设计事务方法时束手束脚,生怕一不小心就踩到地雷。 其实这是不认识Spring事务传播机制而造成...
2020-09-13 21:13:58
5646
原创 JVM调优
调优命令Sun JDK 监控和故障处理命令 jps jstat jmap jhat jstack jinfojps:JVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程jstat:JVM statistic Monitoring 是用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载,内存,垃圾收集,JIT编译等运行数据jmap:JVM Memory Map命令用于生成 heap dump 文件jhat:JVM Heap Analysis
2020-09-03 13:14:49
365
原创 JAVA中的几种基本数据类型是什么,各自占用多少字节
测试代码: public static void main(String[] args) { System.out.println (new StringBuilder ().append ("Byte-->>").append ("字节数:").append (Byte.BYTES).append (";位数:"). append (Byte.SIZE).append ("; 最小值-->最大值:").append (Byte.MIN_.
2020-09-03 12:47:44
412
原创 Java中的 IO 流 你了解多少
前言IO(Input And Output)在编程中是一个很常见的需求,IO即意味着我们的Java程序需要和“外部”进行通信,这个“外部”可以是很多介质。1、本地磁盘文件,远程磁盘文件2、数据库连接3、TCP,UDP,HTTP 网络通信4、进程间通信5、硬件设备(键盘,串口等)Java中的流按照处理数据类型分类:1、字符流2、字节流程序中需要根据待传输数据的不同特性而使用不同的流。按照数据流向分类:1、输入流:对输入流只能进行读操作2、输出流:对输出流只能进行写操作推荐阅
2020-09-03 11:31:53
344
原创 Dubbo通信协议,序列化协议,Hessian数据结构以及PB效率为什么最高
前言关于Dubbo,你必须要掌握的有dubbo的工作原理,至少要知道dubbo分成哪些层,然后平时怎么发起RPC请求的,注册,发现,调用,这些都是基本的,接着还需要对底层有一定的了解,需要知道序列化协议有哪些,平时RPC是怎么走的,支持哪些通信协议,Hessian的数据结构,PB的了解,以及为什么PB的效率是最高的?下面我对上述这些问题逐个做了整理总结dubbo支持哪些通信协议1、dubbo协议默认就是走 dubbo 协议,单一长连接,进行的是 NIO 异步通信,基于 hessian 作为序列化协
2020-09-03 08:52:44
2043
原创 Java创建线程的三种方式 以及区别
前言Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。Java可以用三种方式来创建线程:1、继承Thread类创建线程2、实现Runnable接口创建线程3、使用Callable和Future创建线程1、继承Thread类创建线程通过继承Thread类来创建并启动多线程的一般步骤如下1、定义Thread类的子类,并重写该类的run()方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程执行体2、创建Thread子类的实例,也就是创建了线
2020-09-02 11:27:38
1223
原创 一篇文章帮你搞懂 Spring 事务的七种传播行为
前言什么叫事务传播行为?既然是传播,那么至少有两个东西,才可以发生传播。单体不存在传播这个行为。事务传播行为(Propagation behavior)指的是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。例如:method A事务方法调用method B事务方法时,method B是继续在调用者method A的事务中运行呢,还是为自己开启一个新事务运行,这就是由method B 的事务传播行为决定的。事务传播行为Spring 定义了七种事务传播行为,可以分为三大类:(1)支持
2020-09-01 18:10:17
1017
原创 CMS和G1的区别
CMSCMS:以获取最短回收停顿时间为目标的收集器,基于并发“标记清理”实现(1)过程1、初始标记:独占CPU,仅标记GCRoots能直接关联的对象2、 并发标记:可以和用户线程并行执行,标记所有可达对象3、 重新标记:独占CPU(STW),对并发标记阶段用户线程运行产生的垃圾对象进行标记修正4、 并发清理:可以和用户线程并行执行,清理垃圾(2)优点并发,低停顿(3)缺点对CPU非常敏感:在并发阶段虽然不会导致用户线程停顿,但是会因为占用了一部分线程使应用程序变慢无法处理浮动垃圾:在
2020-08-31 11:47:48
655
原创 Spring MVC工作原理解析
SpringMVC工作原理客户端(浏览器)发送请求,直接请求到 DispatcherServletDispatcherServlet 根据请求信息调用 HandlerMapping ,解析请求对应的 Handler解析到对应的 Handler(也就是我们平常说的Controller控制器)后,开始由HandlerAdapter 适配器处理HandlerAdapter 会根据 Handler 来调用真正的处理器开始处理请求,并处理相应的业务逻辑。处理器处理完业务后,会返回一个ModelAndVi
2020-08-31 08:49:38
442
原创 单例模式的五种写法
前言设计模式(Design Pattern),提供了在软件开发过程中面临的一些问题的最佳解决方案,是Java开发者必修的一门课程。主要分创建型模式,结构型模式和行为型模式。接下来介绍的单例模式属于创建型模式。单例模式单例模式,也就是只有一个实例,并且是自己负责创建自己的对象,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。1、懒汉式懒汉式,就是实例在用到的时候才去创建,“比较懒”,用的时候才去检查有没有实例,如果有则返回,没有则新建。有线程安全和线程不安全两种写法,区
2020-08-30 14:20:44
458
原创 Tomcat调优技巧
前言Tomcat调优技巧可以从两方面考虑优化,一个是Tomcat的自身调优,另一个就是调优JVM内存。下面介绍调优手段,更多详细的原理和实现以后用到的时候再来补充记录。一、Tomcat的自身调优采用动静分离节约Tomcat的性能调整Tomcat的线程池调整Tomcat的连接器修改Tomcat的运行模式禁用AJP连接器二、 JVM调优调优JVM内存Tomcat自身调优1、采用动静分离静态资源如果让Tomcat处理的话,Tomcat的性能会被损耗很多,所以我们一般采用:Nginx
2020-08-30 09:43:50
410
原创 (5分钟速成)Centos7 搭建 MySQL 5.7 教程
亲测有效,五分钟搭建完毕,好文值得分享!!????转载 https://www.cnblogs.com/lzhdonald/p/12511998.html
2020-08-28 18:43:49
378
原创 快速搞懂Redis五种基本数据类型的内部编码
前言Redis最基本的五种数据类型有:String(字符串),Hash(哈希),List(列表),Set(集合),ZSet(有序集合)。还有一些高级数据类型有:HyperLogLog,bitMap,GeoHash,BloomFilter。type 命令可以查看当前键的数据结构类型。可以通过 object encoding 命令查询内部编码。实际上每种数据结构都有两种以上的内部编码实现,有些内部编码可以作为多种外部数据结构的内部实现,例如ziplist 就是hash,list和zset共有的内部编码。R
2020-08-27 22:30:52
512
原创 Java线程池如何合理配置核心线程数?
配置核心线程数Java线程池如何合理配置核心线程数?分下面两个步骤分析:第一步:先看下机器的CPU核数,然后再设定具体参数CPU核数=Runtime.getRuntime().availableProcessors()System.out.println(Runtime.getRuntime().availableProcessors());第二步:分析下线程池处理的程序是CPU密集型,还是IO密集型CPU 密集型:核心线程数 = CPU核数 + 1IO 密集型:核心线程数 = CPU核数
2020-08-26 10:46:52
3462
1
10-Redis高级功能.docx
2020-03-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人