自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 springboot接入flowable

当执行流程时,引擎会保存许多数据(可配置),例如流程实例启动时间、谁在执行哪个任务、完成任务花费的事件、每个流程实例的执行路径,等等。两个都是基于bpmn的工作流框架,区别是先有的acivity,然后开发团队独立出来基于activity开发的flowable,相对来说扩展性更好,开箱即用。流程变量是流程实例中的数据,可以在流程的许多地方使用(例如排他网关经常使用流程变量判断流程下一步要走的路径)。:用于启动流程定义的新流程实例。模板部署后,可以根据模板来启动实例,一个模板启动多个实例,各实例间互不影响。

2023-07-17 10:54:47 440

原创 mysql执行计划各个字段的含义,如果用到的key是possible中的慢key怎么处理?

key_len的长度由字段定义计算而来,并非数据的实际长度。查询中如果使用了覆盖索引,则该索引仅出现在key列表中。查询列所涉及的列上的索引都会被列出来,但不一定会被使用。表示msql通过索引的统计信息,估算的所需读取的行数。rows值的大小时个统计抽样的结果,并不十分的准确。实际使用的索引,如果为NULL,则没有使用索引。表示返回的结果的行数占需要读取行数的百分比。表示那些列或常量被用于查找索引列上的值。Filtered列的值依赖的说统计信息。常用的比如id 越大越先执行。表示索引字段的最大的可能长度。

2023-05-16 22:06:45 191

原创 项目中如何处理高并发的

进入系统之后涉及到限流的相关,可以针对不同应用的维度进行并发的管控。数据库层面的话实际上就是分库,分表。增加数据库的主从配置。不管是硬件的f5或者软件的ngix都是比较成熟的解决方案。针对读多写少的场景可以使用redis集群增加吞吐量。写多读少的可以使用mq进行解耦。

2023-05-16 21:53:11 176

原创 193.缓冲池的管理

其实对缓冲池进行管理的关键部分是如何安排进池的数据并且按照一定的策略淘汰池中的数据,保证池中的数据不“溢出”,同时还能保证常用数据留在池子中。列表前端,而最少使用页在LRU列表后端。当缓冲池不能存放新读取到的页时,将首先释放LRU列表中末端的页。,最近最少使用)算法来进行管理的。但会带来的问题包括预读失效 缓冲池污染等。通常来说,缓冲池是通过。

2023-05-16 21:51:41 120

原创 预读失效预读失效

假如加载了 20、21 相邻的两个数据页,如果只有页号为 20 的缓存页被访问了,而另一个缓存页却没有被访问。此时两个缓存页都在链表的头部,但是为了加载这两个缓存页却淘汰了末尾的缓存页,而被淘汰的缓存页却是经常被访问的。这种情况就是预读失效,被预先加载进缓冲池的页,并没有被访问到,这种情况是不是很不合理。还有一种情况是当执行一条 SQL 语句时,如果扫描了大量数据或是进行了全表扫描,此时缓冲池中就会加载大量的数据页,从而将缓冲池中已存在的所有页替换出去,这种情况同样是不合理的。

2023-05-16 21:48:46 79

原创 mysql的预读机制

磁盘读写的时,是按照页的方式来读取的(你可以理解为固定大小的数据,例如一页数据为 16K),每次至少读入一页的数据,如果下次读取的数据就在页中,就不用再去磁盘上读取了,从而减少了磁盘 I/O,比如可能会提前缓存接下来可能会用到的相邻的数据页,这里涉及两种预读算法来提高IO性能:线性预读(linear read-ahead)和随机预读(randomread-ahead)。为了区分这两种预读的方式,我们可以把线性预读放到以extent为单位,而随机预读放到以extent中的page为单位。

2023-05-15 21:39:01 301

原创 mysql的缓存机制 bufferpool

简单来说缓冲池就是一块内存区域,它存在的原因之一是为了避免每次都去访问磁盘,把最常访问的数据放在缓存里,提高数据的访问速度。在数据库当中读取页的操作,首先将从磁盘读到的页存放在缓存池中。下一次再读相同的页时,首先判断该页是不是在缓冲池中。否则,读取磁盘上的页。我们知道,内存的读写速度远比磁盘IO读写速度要快,而MYSQL的数据及索引都存储在具有B+树结构的文件磁盘上,所以为了有效提高MySQL的读写速度,会把最常访问的数据放在缓存(cache)里,避免每次都去访问数据库,这里我们引入了缓冲池的概念。

2023-05-15 21:36:45 129

原创 hashmap是无序的

如果想要有序的hashmap就要使用linkedhashmap或者使用treemap中的比较器来自定义排序。

2023-05-15 21:35:32 124

原创 .字节流和字符流的区别

FileWriter FileReader 一个字符等于2个字节。可以传输音频,视频,图片,文本等,传输数据的基本单位为字节。1、字节流 :字节读写, 字节流(ASCII)处理二进制文件。2、字符流:快读写 ,字符流(Unicode)处理文本文件。只能传输纯文本, 传输数据的基本单位为字符。

2023-05-15 21:35:17 33

原创 Mysql查询text中的数据是否包含某个字的方法

2.使用全文索引 match against ,需要简历索引时使用with ngrm,instr可以替代like 效率更高。

2023-05-15 21:33:28 289

原创 Mysql查询大量数据 比如100万数据 如何一次性查出来

isOpen():用于在取数据之前判断Cursor对象是否是打开状态只有当打开时Cursor才能取数据;使用流式查询,则要保持对产生结果集的语句所引用的表的并发访问,因为其 查询会独占连接,所以必须尽快处理。首先是进行分页查询,但是如果有些情况不适合分页查询 则可以使用mybatis框架提供的流式接口查询。、 getCurrentIndex():返回已经获取了多少条数据;、 isConsumed():用于判断查询结果是否全部取完;、 Cursor是可关闭的;、 Cursor是可遍历的;

2023-05-15 21:33:08 1986

原创 ioc容器初始化过程 源码层面

实际上BeanDefinition就是POJO对象在容器的抽象,通过BeanDefinition来定义的数据结构,像是世间万物在java中的抽象,java的对象又在容器中的抽象就是BeanDefinition。Resource定位指beanDefinition的资源定位,由ResourceLoader通过统一的Resource接口来完成,这个Resource对各种形式的BeanDefinition的使用都提供了统一的接口。这个过程类似于容器寻找数据的过程。相当于这是注册的过程 registry方法。

2023-05-15 21:30:39 44

原创 单例bean为什么是线程安全的

有状态 的bean就是多个线程对其中某个状态值修改的情况下的话,那么就是线程不安全的。无状态的bean,则是线程安全的。准确来说并不是线程安全的。

2023-05-15 21:30:35 72

原创 频繁装箱拆箱的问题

一个就是对于堆的操作效率比较低;另一个就是对于堆上分配的内存资源,需要GC来回收,从而降低程序效率。

2023-05-15 21:28:26 61

原创 mysql的缓存机制

Mysql判断缓存命中的方法很简单:缓存存放在一个引用表中,通过一个哈希值引用,这个哈希值包括如下因素,即查询本身、当前要查询的数据库、客户端协议的版本等一些都有可能影响返回结果信息。在事务提交前该表的查询都无法被缓存,只能在事务提交后才能被缓存。查询缓存系统会跟踪查询中涉及的每个表,如果这些表发生变化,那么和这个表相关的所有数据都将失效。的查询缓存在很多时候可以提升查询性能,在使用的时候,有一些问题需要特别注意。若发现查询缓存中没有这个查询,会将其结果存入查询缓存,这会带来额外的系统开销。

2023-05-15 21:28:18 114

原创 http和https的区别

SSL 协议可分为两层:SSL 记录协议(SSL Record Protocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。3、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。2、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。

2023-05-14 10:54:50 47

原创 线程池的核心线程数是怎么确定的

和cpu核数有关 一版不会设置过大。可以分为计算密集型和io密集型。计算密集型就是cpu核数+1。Io密集型就是cpu核数*2。

2023-05-14 10:46:22 88

原创 栈和本地方法栈的区别

本地方法栈执行的是native方法。Java 正常执行就是依赖栈。

2023-05-14 10:39:55 78

原创 finalizefinalize

假定你的对象(并非使用new方法)获得了一块“特殊”的内存区域,由于垃圾回收器只知道那些显示地经由new分配的内存空间,所以它不知道该如何释放这块“特殊”的内存区域,那么这个时候Java允许在类中定义一个finalize()方法。但在没有明确释放资源的情况下,Java提供了缺省机制来终止该对象以释放资源,这个方法就是finalize()。一旦垃圾回收器准备好释放对象占用的存储空间,首先会去调用finalize()方法进行一些必要的清理工作。在finalize()方法返回之后,对象消失,垃圾收集开始执行。

2023-05-14 10:38:22 48

原创 string不可变的原因

2.用来缓存hashcode,因为string的hashcode方法经常被调用,但因为string不变,所以hashcode也不会变,所以可以放心进行缓存。3.为了安全性,就是有很多地方都是用string 比如url等 作为参数,如果可以变动那么会有不安全的风险。

2023-05-14 10:30:53 53

原创 Redis真的是单线程的吗?

redis6.0在网络IO处理方面引入了多线程,如网络数据的读写和协议解析等,需要注意的是,执行命令的核心模块还是单线程的。redis内部使用了基于epoll的多路服用,也可以多部署几个redis服务器解决单线程的问题;内存好说,加内存条就行了,而网络才是大麻烦,所以redis6内存好说,加内存条就行了;Redis6.0之前是单线程的,Redis6.0之后开始支持多线程;而网络才是大麻烦,所以redis6.0引入了多线程的概念,redis主要的性能瓶颈是内存和网络;

2023-05-14 10:28:34 74

原创 VM的类加载机制是什么?

缓存机制保证所有加载过的class都会被缓存,当程序中需要某个class时,先从缓存区中搜索,如果不存在,才会读取该类对应的二进制数据,并将其转换成class对象,存入缓存区中。类加载器加载某个class时,该class所依赖的和引用其它的class也由该类加载器载入。这就是为什么修改了class后,必须重启JVM,程序所做的修改才会生效的原因。先让父加载器加载该class,父加载器无法加载时才考虑自己加载。

2023-05-14 10:25:50 68

原创 float和double有什么区别:

double : 双精度浮点数。单精度浮点数在机内存占4个字节。双精度浮点数在机内存占8个字节。float : 单精度浮点数。01.在内存中占有的字节数不同。

2023-05-14 10:22:59 56

原创 mybatis延迟加载默认

级联查询的时候,如果设置了延迟加载,则会在需要数据的时候才会进行查询,否则只会加载主对象的查询。

2023-05-14 10:21:20 69

原创 @Required注解应用于

bean属性的setter方法,它表明影响的bean属性在配置时需要指定值。否则在启动时就会报初始化错误。

2023-05-14 10:20:47 84

原创 静态工厂、简单工厂和抽象工厂的区别

简单工厂类似蛋糕店,说要什么蛋糕就行了,不需要关心蛋糕是怎么出来的,每个人都直接来买就行。抽象工厂是工厂的工厂,定义公共接口后,子类去单独实现独特的逻辑。

2023-05-13 20:27:12 28

原创 .tcp和udp的主要区别

tcp传输数据稳定可靠,适用于对网络通讯质量要求较高的场景,需要准确无误的传输给对方,比如,传输文件,发送邮件,浏览网页等等,udp的优点是速度快,但是可能产生丢包,所以适用于对实时性要求较高但是对少量丢包并没有太大要求的场景。比如:域名查询,语音通话,视屏直播等。udp还有一个非常重要的应用场景就是隧道网络,比如:vpn,VXLAN.

2023-05-13 20:26:41 27

原创 什么是上下文切换?

多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。上下文切换通常是计算密集型的。也就是说,它需要相当可观的处理器时间,在每秒几十上百次的切换中,每次切换都需要纳秒量级的时间。概括来说就是:当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。

2023-05-13 20:26:00 38

原创 怎么确保一个集合不能被修改?

不能用final 和string一样,仍然可以通过一些方法改变内容。调用后返回的集合是不可修改的,修改后会报错。

2023-05-13 20:25:26 29

原创 抽象类和接口如何选择

那么在开发,何时选用接口?的行为,又要为子类提供公共的功能时,应该选择抽象类。既然接口是一种特殊的。

2023-05-13 20:23:25 182

原创 .ioc创建 BeanFactoryPostProcessor

ApplicationContext 接口是 BeanFactory 的子接口,也被称为 Spring 上下文,与 BeanFactory 一样,可以加载配置文件中定义的 bean,并进行管理。它还加强了企业所需要的功能,如从属性文件中解析文本信息和将事件传递给所有指定的监视器,下图是 ApplicationContext 接口的继承关系。可以修改 Spring 上下文中 BeanDefinition 信息。配置文件解析器,如将配置文件中的 bean 信息解析成对应的。

2023-05-13 20:22:48 24

原创 .IOC和DI的关系

在spring项目中,将对象理解为Bean,也可以叫bean对象,这个bean和容器之间有个依赖关系,bean对象的创建是依赖容器的,就好像孩子依赖父母一样,孩子不能自己生出自己,需要父母的合作才能出生,这里的孩子就是bean,父母就是容器;:在以前,对象的创建和销毁都是由用户控制的,用了ioc之后,对象的创建和销毁就都交给容器来控制了,用户就不用管这些,只关注业务需求就好了;:通过容器注入了bean对象,而且这个过程是自动化的,也就是说容器会自动找到和bean对象匹配的类型实例注入到对象中。

2023-05-13 20:22:17 219

原创 什么是IoC 和 DI

全称为:Inverse of Control .将对在自身对象中的一个内置对象的控制反转,反转后不再由自己本身的对象进行控制这个内置对象的创建,而是由第三方系统去控制这个内置对象的创建。简单来说就是把本来在类内部控制的对象,反转到类外部进行创建后注入,不在由类本身镜像控制,这就是IOC的本质。而ioc就是指,当我们初始化,轮胎 车架 底盘的时候 我需要写很多的new,去查看其中的构造函数来进行初始化,但其实我只需要一个最外层的类,这时候ioc容器就会将初始化的这部分包起来,只返回我们 需要的对象。

2023-05-13 20:20:25 88

原创 .foreach与正常for循环效率对比

循环采用下标访问,对于数组结构的数据来说,采用下标访问比较好。循环,这种做法很糟糕,数据量大的时候有可能会导致系统崩溃。需要循环链表结构的数据时,一定不要使用普通。需要循环数组结构的数据时,建议使用普通。

2023-05-13 20:19:54 52

原创 Java(OOP)面向对象的三个特征与含义

封装是指将某事物的属性和行为包装到对象中,这个对象只对外公布需要公开的属性和行为,而这个公布也是可以有选择性的公布给其它对象。1、方法的重载:重载是指同一类中有多个同名的方法,但这些方法有着不同的参数。2、方法的重写:子类可以覆盖父类的方法,因此同样的方法会在父类中与子类中有着不同的表现形式。继承是子对象可以继承父对象的属性和行为,亦即父对象拥有的属性和行为,其子对象也就拥有了这些属性和行为。多态是指父对象中的同一个行为能在其多个子对象中有不同的表现。有两种多态的机制:编译时多态、运行时多态。

2023-05-13 20:19:15 37

原创 为什么事务非public会失效

非 public 修饰的方法上,即使加了 @Transactional 事务依然不会生效,原因是因为 @Transactional 使用的是 Spring AOP 实现的,而 Spring AOP 是通过动态代理实现的,而 @Transactional 在生成代理时会判断,如果方法为非 public 修饰的方法,则不生成代理对象,这样也就没办法自动执行事务了。

2023-05-11 22:38:21 378

原创 equals和==的区别以及hashCode方法的解释以及map集合中是怎样做到元素不重复的?

但是如果重写了equals方法,那么两个对象调用equals方法比较的时候,就不是根据地址比较了,而是根据对象的内容进行比较,但是这个时候hashCode方法仍是根据对象的地址生成一个数值,所以这个时候会出现一个问题,就是两个对象用equals方法比较的是相同的,但是这两个对象调用hashCode方法之后的返回值却是不相同的,这样的话就不满足两个对象如果用equals方法比较的结果相等,那么这两个对象调用hashCode方法的返回值也相同了。对象中如果重写了equals方法,那么比较的是内容;

2023-05-11 22:32:15 35

原创 static和final的区别

简单说 抽象方法是没有具体方法内容的,不能实例化的,存在的意义就是为了被继承然后重写所有方法后提供使用。final修饰变量:如果修饰的是基本类型的变量,那么在编译之前就必须要为这个变量赋值,以后这个变量就相当于是一个常量,它的值就不能更改了;static修饰变量:静态变量随着类加载时完成初始化,内存中只有一个,且JVM只会为它分配一次内存,所有对象共享静态变量。如果修饰的是对象类型,那么这个对象的引用地址不能变,但是对象在堆内存中的内容可以变。不能改变方法内容,修饰了之后这个方法就变成毫无用处的空方法了。

2023-05-11 22:30:07 39

原创 动装箱与自动装箱何时发生

而 i5 和 i6 不是自动装箱,属于手动装箱,所以不遵守自动装箱规范,也是两个对象,所以为 false。自动装箱规范要求 boolean、byte、char <= 127,介于 -128 ~ 127 之间的 short 和 int 被包装到固定的对象中。由于自动装箱和自动拆箱,使我们觉得对象包装器对象之间的比较,好像使用 == 运算符也可以,== 运算符运用在对象之间,// 此处发生自动装箱:相当于 list.add(Integer.valueOf(3))对象包装器对象之间的比较。

2023-05-11 22:27:25 46

原创 装箱和拆箱

基本类型比如 int 自动的转化为包装器类型比如 Integer 称为自动装箱(autoboxing)。相反的,将包装器类型比如 Integer 自动转化为 int 类型,称为自动拆箱(autounboxing)一旦构造了包装器(比如Intenger),不允许更改包装器中的值。对象包装器类不能定义子类。比如使用集合时,是无法将 int 这种基本类型放进去的,为了方便开发,Java 针对每个基本类型设计了对应的对象包装器(wrapper)。Java 有八种基本类型,可以简单地进行数据处理。

2023-05-11 22:26:47 20

空空如也

空空如也

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

TA关注的人

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