Spring
未读🚀StopWatch 使用教程🤔 什么是StopWatch?Hey 大家好,我是 Shio👋。今天我们来学习一个Spring框架中的工具类StopWatch,StopWatch是一个简单的停止看门狗计时器,它可以帮助开发者测量代码的执行时间。这对于性能调优和监控应用性能非常有用。想象一下,你有一个复杂的业务逻辑,你想知道每一步操作需要多长时间来执行,StopWatch就是你的瑞士军刀。
首先我们要了解为什么我们会使用StopWatch? 我总结为两点:
方便易用的API
纳秒级别的准确性
当然除了API, 我还想讲一讲StopWatch准确性实现所用到的 System.nanoTime()方法, 以及为什么不用System.currentTimeMillis()
📏StopWatch准确性如何保障?StopWatch 类在Spring框架中用于精确测量时间间隔,它之所以能够提供高精度的时间测量,很大程度上归功于其内部使用的 System.nanoTime() 方法。下面我们来详细探讨 System.nanoTime() 以及 StopWatch 为何因此而更准确。
Sy ...
【从零构建Spring|第一节】 构建简单Bean容器前言每每谈到 Spring 框架,大家总会涉及一些高大上的名词,比如 IOC 控制反转、DI 依赖注入、AOP 面向切面等等,但却忘记了最基本的一点。 Spring 的本质是一个 Bean 工厂(beanFactory)或者说 Bean 容器
它按照我们的要求,生产我们需要的各种各样的bean,提供给我们使用。只是在生产bean的过程中,需要解决bean之间的依赖问题,才引入了依赖注入(DI)这种技术。也就是说依赖注入是beanFactory生产bean时为了解决bean之间的依赖的一种技术而已。
为什么需要Spring框架来给我们提供这个 beanFactory 的功能呢?原因是一般我们认为是,可以将原来硬编码的依赖,通过 Spring 这个 beanFactory 这个工厂来注入依赖,也就是说原来只有依赖方和被依赖方,现在我们引入了第三方—— Spring 这个 beanFactory,由它来解决bean之间的依赖问题,达到了松耦合的效果;
这个只是原因之一,还有一个更加重要的原因:在没有 Spring 这个 beanFact ...
MySQL系列之 MySQL的系统架构大家好,我是MySQL,虽然在关系型数据库的排行榜上,我常被称作“万年老二”,Oracle总是站在我的前面,但我深信,总有那么一天,我会全面超越,成为行业的领头羊。我的使命,就是默默地服务于每一位程序员,管理他们那些复杂多变的数据。为了更好地与程序员沟通,我进化出了“连接模块”,它就像是我的门卫,负责接待所有想要访问我的客户端。
程序员们通过使用“客户端连接驱动”,如JDBC或ODBC,来敲响我的大门,与我建立连接。一旦连接成功,我将开放我的数据宝藏,允许他们执行各种操作。然而,频繁的连接与断开,对于我这样精巧的系统而言,曾是一大负担。因此,我发展出了“连接池”这一机制,它像一座桥梁,能够保持连接的持久性,避免不必要的创建和销毁,从而提高资源的利用率。
连接池不仅是我与外部世界的门户,它还具备自我保护的能力,设置了一系列参数,如max_connections用于限制同时建立的连接数,max_allowed_packet则控制着数据包的最大尺寸。程序员通过合理配置这些参数,可以确保我运行得更为高效。
解决了连接的烦恼后,我的主要任务便是协助程序员执行 ...
MySQL
未读MySQL中的枚举字段, 该用什么类型定义呢?问题简述在项目数据库表设计阶段, 我们常常会用到枚举字段
例如 性别, 状态等数量有限在业务有特殊含义的字段
在建表时常用的字段有如下三种:
tinyint
varchar
enum
当然也有创建Reference table利用外键来管理枚举类型, 本节暂不讨论
其中 tinyint用的最多, varchar其次
enum由于一些比较严重的缺陷所以用的最少
下面我们将简述三种类型各自的特点以及应用场景
类型特点分析TINYINT特点
容量小:tinyint 只占用 1 字节的存储空间,可以存储范围为 -128 到 127 的整数值。因此,在数量有限的枚举字段中,使用 tinyint 可以有效地节省存储空间。
整数表示:tinyint 存储的是整数值,而不是直接存储含义明确的字符或字符串。这样可以在查询和索引时更高效地处理,因为比较整数值的速度通常比比较字符或字符串值的速度更快
优点:
节省存储空间:相比于字符串类型的枚举,使用 tinyint 类型可以节省存储空间,特别是在包含大量枚举字段的表中,可以显著减少数据占用。
查询和索引 ...
MySQL
未读MYSQL语句执行顺序// 先复制一篇, 明天来改
一、sql执行顺序
from
join (内连接inner join = join,左外连接left outer join = left join 右外连接 right outer join = right join )
on
where
group by(开始使用select中的别名,后面的语句中都可以使用)
avg,sum….
having
select
distinct
order by
limit
从这个顺序中我们不难发现,所有的 查询语句都是从from开始执行的,在执行过程中,每个步骤都会为下一个步骤生成一个虚拟表,这个虚拟表将作为下一个执行步骤的输入。
第一步:首先对from子句中的前两个表执行一个笛卡尔乘积,此时生成虚拟表 vt1(选择相对小的表做基础表)。第二步:接下来便是应用on筛选器,on 中的逻辑表达式将应用到 vt1 中的各个行,筛选出满足on逻辑表达式的行,生成虚拟表 vt2 。第三步:如果是outer join 那么这一步就将添加外部行,left oute ...
🌱JVM系列 之 详解JVM 内存分区(线程不安全篇)🚧🚧🚧 暂待施工🚧🚧🚧
堆
方法区
Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。
Java 世界中“几乎”所有的对象都在堆中分配,但是,随着 JIT 编译器的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。从 JDK 1.7 开始已经默认开启逃逸分析,如果某些方法中的对象引用没有被返回或者未被外面使用(也就是未逃逸出去),那么对象可以直接在栈上分配内存
Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC 堆(Garbage Collected Heap)。从垃圾回收的角度,由于现在收集器基本都采用分代垃圾收集算法,所以 Java 堆还可以细分为:新生代和老年代;再细致一点有:Eden、Survivor、Old 等空间。进一步划分的目的是更好地回收内存,或者更快地分配内存
🌱JVM系列 之 详解JVM内存分区(线程安全篇)引言👋 大家好,我是Shio!今天我们要深入探索Java虚拟机(JVM)如何通过内存区域划分和管理来支撑庞大的Java生态并简化开发流程。我们将聚焦于JVM的内存区域、线程间共享与隔离机制以及各个内存区域的具体功能。
一、 JVM内存区域概述1️⃣ 内存区域与内存模型的区别首先区分两个概念:内存区域是JVM对物理内存的实际划分;而内存模型更关注数据的可见性和一致性问题。JVM内存区域主要包括五大块:程序计数器、虚拟机栈、本地方法栈、堆和方法区。
2️⃣ 线程共享与线程独占
🔄 线程共享内存区域:堆和方法区存放所有线程都能访问的数据(如对象实例和类信息),在这些区域操作时要考虑线程安全。
👤 线程独占内存区域:程序计数器、虚拟机栈和本地方法栈为每个线程单独分配,用于保存当前执行路径和局部变量等信息,无需关心线程安全问题。
今天我们着重讲解线程安全的内存区域, 线程不安全的堆和方法区因为内容比较多, 我们放在下一节进行讲解
二、 JVM内存区域详细解析1️⃣ 程序计数器💻
程序计数器(Program Counter Reg ...
♻️JVM系列 之 垃圾回收梳理(终章)🚧🚧🚧 暂待施工🚧🚧🚧
Docker实用篇初识Docker
Docker概念
安装Docker
# 1、yum 包更新到最新 yum update# 2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 yum install -y yum-utils device-mapper-persistent-data lvm2# 3、 设置yum源yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 4、 安装docker,出现输入的界面都按 y yum install -y docker-ce# 5、 查看docker版本,验证是否验证成功docker -v
当发生如下报错
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirror ...
RabbitMQ初体验🚧🚧🚧 暂待施工🚧🚧🚧
初识MQ同步调用的优缺点同步通讯与异步通讯
同步调用的时效性高
同步调用的问题
总结
同步调用的优点
实时性好, 时效性高
同步调用的缺点
耦合高, 系统需求更改导致维护, 更改困难
性能吞吐量下降, 线性调用, 每次调用都要阻塞等待服务方响应, 导致性能下降
资源浪费, 调用链每个服务都要等待响应过程, 无法释放请求占用的资源
级联失败, 服务提供方出问题,所有调用方都会出问题, 多米诺骨牌
异步调用的优缺点异步调用方案
优势一 服务解耦
采用发布订阅模式, 支付服务只负责发布事件至Broker, 而其他服务只负责订阅相应的Broker
实现了, 服务调用方和提供方的解耦
假如, 需求发生变化, 需要在支付成功事件后添加其他服务, 只需要添加相应的服务, 并让该服务订阅相应的事件(支付成功事件)
假如, 需求又发生变化, 需要在支付成功事件后取消短信服务, 只需要让该服务(短信服务)取消订阅相应的事件即可
优势二 : 性能提升, 吞吐量提高
采用 同步调用方案 最后耗时将会 ...