- 博客(95)
- 收藏
- 关注
原创 springboot jar 转换成war
Spring Boot是支持发布jar包和war的,但它推荐的是使用jar形式发布。使用jar包比较方便,但如果是频繁修改更新的项目,需要打补丁包,那这么大的jar包上传都是问题。所以,jar包不一定合适适用所有的场景,如war包更合适,你可以尝试转为传统的war包,这样打补丁包可能更方便。1.修改Spring Boot启动类启动类继承 SpringBootServletInitializer类,并覆盖 configure方法。public class XXXApplicationWar extend
2020-07-23 13:44:29
363
转载 spring事务的传播机制及原因分析
PROPAGATION_REQUIRED – 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。PROPAGATION_SUPPORTS – 支持当前事务,如果当前没有事务,就以非事务方式执行。PROPAGATION_MANDATORY – 支持当前事务,如果当前没有事务,就抛出异常。PROPAGATION_REQUIRES_NEW – 新建事务,如果当前存在事务,把当前事务挂起。PROPAGATION_NOT_SUPPORTED – 以非事务方式执行操作,如果当前存在事务,就把当前
2020-07-14 17:08:39
255
原创 微信公众号域名验证路径正则表达式
@Controller@RequestMapping("/")@PropertySource(value = “classpath:application_mp_verify.properties”)@ConfigurationProperties(prefix = “mp”)public class WxMpVerifyConfigController {private Map<String, String> verify = new HashMap<>();priva
2020-07-13 16:48:59
626
转载 微服务与单体服务的拆分原则
单体架构的优势:1、便于开发2、易于测试3、易于部署单体架构的不足:1、复杂性高2、交付效率低:构建和部署耗时长3、伸缩性差:只能按整体横向扩展,无法分模块垂直扩展,IO密集型模块和CPU密集型模块无法独立升级和扩容4、可靠性差:一个BUG可能引起整个项目的运行5、阻碍技术创新微服务架构的优势:1、易于开发和维护2、独立部署3、伸缩性强4、与组织结构相匹配5、技术异构性微服务面临的挑战:1、服务拆分:(1)、微服务拆分原则:领域模型、组织结构、康威定律、单一职责(2).
2020-07-10 07:23:16
1885
原创 java线程池大小设置
一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU的个数)如果是CPU密集型应用,则线程池大小设置为N+1如果是IO密集型应用,则线程池大小设置为2N+1这个说法到底是不是正确的呢?其实这是极不正确的。那为什么呢?首先我们从反面来看,假设这个说法是成立的,那我们在一台服务器上部署多少个服务都无所谓了。因为线程池的大小只能服务器的核数有关,所以这个说法是不正确的。那具体应该怎么设置大小呢?假设这个应用是两者混合型的,其中任务即有 CPU 密集,也有 IO 密集型的,那么我们改怎么
2020-07-10 06:39:17
588
原创 索引结构B+树
m阶B树具有如下特征:1.根结点至少有两个子女。2.每个中间节点都至少包含ceil(m / 2)个孩子,最多有m个孩子。3.每一个叶子节点都包含k-1个元素,其中 m/2 <= k <= m。4.所有的叶子结点都位于同一层。5.每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。B+树与B树的区别有k个子结点的结点必然有k个关键码(有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点
2020-07-07 20:49:05
1008
原创 java中对象、成员变量、静态变量、方法的内存分配
java中内存主要包含4块,heap(堆内存)stack(栈内存)data segment(静态变量或是常量存放区)codesegment(方法区).堆内存中存放的是new出的对象,new出的对象只包含成员变量。栈内存中:存放的是局部成员变量。对于基本的数据类型存放的是基本变量的值,而对于对象变量,存放的是堆内存的地址。静态、常量区:存放的是静态变量(类变量)或是常量。方法区:存放的是对象的方法。因此即使new出多个对象也是只是存在一个方法。...
2020-07-07 15:17:38
417
原创 JVM类装载分为以下 5 个步骤
加载:根据查找路径找到相应的 class 文件然后导入检查:检查加载的 class 文件的正确性准备:给类中的静态变量分配内存空间解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址初始化:对静态变量和静态代码块执行初始化工作...
2020-07-07 13:58:27
243
原创 Maven的Scope
scope定义了类包在项目的使用阶段。项目阶段包括: 编译,运行,测试和发布。compile默认scope为compile,表示为当前依赖参与项目的编译、测试和运行阶段,属于强依赖。打包之时,会达到包里去test该依赖仅仅参与测试相关的内容,包括测试用例的编译和执行,比如定性的Junitruntime依赖仅参与运行周期中的使用。一般这种类库都是接口与实现相分离的类库,比如JDBC类库,在编译之时仅依赖相关的接口,在具体的运行之时,才需要具体的mysql、oracle等等数据的驱动程序。此类的驱
2020-07-06 21:49:00
151
原创 GC Roots
虚拟机栈(栈桢中的本地变量表)中的引用的对象方法区中的类静态属性引用的对象方法区中的常量引用的对象本地方法栈中JNI的引用的对象
2020-07-06 20:20:06
198
原创 JAVA线程池的执行过程
线程池刚创建时,里面没有一个线程。任务队列是作为参数传进来的。不过,就算队列里面有任务,线程池也不会马上执行它们。当调用 execute() 方法添加一个任务时,线程池会做如下判断:如果正在运行的线程数量小于 corePoolSize,那么马上创建线程运行这个任务;如果正在运行的线程数量大于或等于 corePoolSize,那么将这个任务放入队列;如果这时候队列满了,而且正在运行的线程数量小于 maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;如果队列满了,而且正在.
2020-07-04 21:23:32
673
原创 Mysql分表标准
什么样的表需要拆分:根据表的体积、表的行数、访问特点来衡量表是否需要拆分一.拆分标准是:1.表的体积大于2G或行数大于1000w,以单表主键等简单形式访问数据,这个时候需要分表2.表的体积大于2G或行数大于500W,以两表jion,小范围查询(结果集小100行)等形式访问数据,这个时候需要分表3.表的体积大于2G或行数大于200w,以多表join,范围查询,order by,group by,高频率等复杂形式访问数据,尤其DML,这个时候需要分表4.表的字段中含有text等大字段的、varchar
2020-07-04 12:21:45
511
原创 java.lang.NoClassDefFoundError和ClassNotFoundException的几种解决思路方法
CLASSPATH环境变量配置出错java运行环境的jdk版本比class文件的编译版本低了导致class文件的访问权限或者所在目录的访问权限有问题,导致java无法读这个文件jar包有错误,查看jar是否有漏或者重新导入jar包...
2020-07-02 11:24:43
453
原创 反射
反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力Java反射:在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法Java反射机制主要提供了以下功能:在运行时判断任意一个对象所属的类在运行时构造任意一个类的对象在运行时判断任意一个类所具有的成员变量和方法在运行时调用任意一个对象的方法58. 什么是 java 序列化?什么情况下需要序列化?简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可
2020-07-02 07:39:26
168
原创 ArrayList 扩容原理
List扩容实现步骤分两步:1、扩容把原来的数组复制到另一个内存空间更大的数组中2、添加元素把新元素添加到扩容以后的数组中ArrayList 的构造函数ArrayList的两个构造方法ArrayList()ArrayList(int initialCapacity)/** * 默认初始容量大小 */ private static final int DEFAULT_CAPACITY = 10; /** *声明空数组 */
2020-07-01 23:27:46
324
原创 java对象拷贝
61. 为什么要使用克隆?想对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆了,Java语言中克隆针对的是类的实例。62. 如何实现对象克隆?有两种方式:1). 实现Cloneable接口并重写Object类中的clone()方法;2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆63. 深拷贝和浅拷贝区别是什么?浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷
2020-06-30 23:37:43
227
原创 多线程
35. 并行和并发有什么区别?并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群。所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。36. 线程和进程的区别?简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个
2020-06-30 23:34:03
208
转载 Java服务,内存OOM了,如何快速定位
某Java服务(假设PID=10765)出现了OOM,如何快速定位?Java服务出现OOM,最常见的原因是:(1)内存确实分配过小,内存确实不够用(2)某一个对象被频繁申请,却没有释放,内存不断泄漏,导致内存耗尽(3)某一个资源被频繁申请,系统资源耗尽,例如:不断创建线程,不断发起网络连接更具体的,可以按照以下步骤,使用以下工具排查一、确认是不是内存本身就分配过小如上图,可以查看新生代,老生代堆内存的分配大小以及使用情况,看是否本身分配过小。二、找到最耗内存的对象方法:jmap -his
2020-06-30 19:03:18
568
原创 单体架构与微服务架构
产品初期优先选择单体架构。面对一个新的领域,对业务的理解很难在开始阶段就比较清晰,往往是经过一段时间之后,才能逐步弄清楚。很多时候,从一个已有的单体架构中逐步划分服务,要比一开始就构建微服务简单得多。另外,在资源受限的情况下,采用微服务架构风险较大,很多优势无法体现,性能上的劣势反而会比较明显。单体、组件化、微服务架构成本趋势,当业务复杂度达到一定程度后,微服务架构消耗的成本才会体现优势,并不是所有的场景都适合采用微服务架构,服务的划分应逐步进行,持续演进。产品初期业务复杂度不高的时候,应该尽量采用单体架
2020-06-30 13:30:58
376
原创 spring boot 内置 tomact 启动创建临时文件出错
org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to create tempDir. java.io.tmpdir is set to C:\Windows\TEMPat org.springframework.boot.
2020-06-30 10:48:43
1452
原创 oracle分区方式
oracle分区表的分区有四bai种类型:范围分区、du散列分区、列表分zhi区和复合分区。1、范围分区就是根据数据库表中某一字段的值的范围来划分分区。数据中有空值,Oracle机制会自动将其规划到maxvalue的分区中。2、散列分区根据字段的hash值进行均匀分布,尽可能地实现各分区所散列的数据相等。散列分区即为哈希分区,Oracle采用哈希码技术分区,具体分区如何由Oracle说的算,也可能我下一次搜索就不是这个数据了。3、列表分区列表分区明确指定了根据某字段的某个具体值进行分区,而不
2020-06-30 09:03:12
4973
原创 数据结构 数组和链表对比
数组数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;链表链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N)。链表的特点是:寻址困难,插入和删除容易。...
2020-06-30 07:42:11
261
原创 容器
java 容器都有哪些?常用容器的图录:Collection 和 Collections 有什么区别?java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素..
2020-06-30 07:33:56
3621
原创 Java 基础
1. JDK 和 JRE 有什么区别?JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 j
2020-06-29 22:27:06
142
转载 nginx启动失败(bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbid
nginx启动失败(bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket…permissions)nginx启动失败nginx启动失败(bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbidden by its access permissions))文章目录#nginx启动失败(
2020-06-24 10:10:57
3225
1
原创 window 配置nginx
第一步配置 hostsC:\Windows\System32\drivers\etchosts127.0.0.1 www.xxxx.com127.0.0.1 cloud.xxxx.com第二步配置 nginx.conf#user nobody;worker_processes 1;#error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log
2020-06-22 16:15:01
344
原创 线程状态
线程共包括一下5种状态:新建、初始状态(New) :线程对象被创建后就进入了新建状态,Thread thread = new Thread();就绪(Runnable):也被称之为“可执行状态”,当线程被new出来后,其他的线程调用了该对象的start()方法,即thread.start(),此时线程位于“可运行线程池”中,只等待获取CPU的使用权,随时可以被CPU调用。进入就绪状态的进程除CPU之外,其他运行所需的资源都已经全部获得。运行(Running):线程获取CPU权限开始执行。注
2020-06-21 07:03:52
249
原创 数组、链表、哈希表
数据结构中有数组和链表来实现对数据的存储,但这两者基本上是两个极端。数组数组存储区间是连续的,占用内存严重,故空间复杂度大,但数组的二分查找时间复杂度小,为O(1), 数组的特点是:寻址容易,插入和删除困难链表链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,达O(N),链表的特点是:寻址困难,插入和删除容易我们能不能综合两者的特性,做出一种寻址容易,插入删除也容易的数据结构,答案肯定:哈希表哈希表哈希表(Hash table)既满足了数据的查找方便,同时不占用太多的内存
2020-06-20 21:36:33
295
转载 JAVA 中BIO,NIO,AIO的理解
在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解。具体如下:1 什么是同步?2 什么是异步?3 什么是阻塞?4 什么是非阻塞?5 什么是同步阻塞?6 什么是同步非阻塞?7 什么是异步阻塞?8 什么是异步非阻塞?在弄清楚上面的几个问题之前,我们首先得明白什么是同步,异步,阻塞,非阻塞,只有这几个单个概念理解清楚了,然后在组合理解起来,就相对比较容易了。1,同步和异步是针对应用程序和内核的交互而言的。2,阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取
2020-06-20 21:19:21
180
原创 过滤器(Filter)和拦截器(Interceptor)的区别
过滤器(Filter)依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等Filter用处在HttpServletRequest到达Servlet之前,拦截客户的HttpServletRequest。根据需要检查HttpServletRequ
2020-06-18 17:22:13
280
原创 Spring&Spring MVC&Spring Boot三者之间的区别与联系
什么是Spring?它解决了什么问题?什么是Spring MVC?它解决了什么问题?什么是Spring Boot?它解决了什么问题?Spring,Spring MVC,Spring Boot 三者比较什么是Spring?它解决了什么问题?Spring,一般指代的是Spring Framework,它是一个开源的应用程序框架,提供了一个简易的开发方式,通过这种开发方式,将避免那些可能致使代码变得繁杂混乱的大量的业务/工具对象,说的更通俗一点就是由框架来帮你管理这些对象,包括它的创建,销毁等,比如.
2020-06-18 16:21:13
23428
原创 HDFS和MapReduce擅长与局限
HDFS的优势HDFS的英文全称是 Hadoop Distributed File System,即Hadoop分布式文件系统,它是Hadoop的核心子项目。实际上,Hadoop中有一个综合性的文件系统抽象,它提供了文件系统实现的各类接口,而HDFS只是这个抽象文件系统的一种实现,但HDFS是各种抽象接口中应用最为广泛和最广为人知的一个。HDFS被设计成适合运行在通用和廉价硬件上的分布式文件系统。它和现有的分布式文件系统有很多共同点,但他和其它分布式文件系统的区别也是明显的。HDFS是基于流式数据模式访
2020-06-17 22:01:50
1627
转载 索引设计实现
为了高效地查询数据库中的数据,我们常常会给表中的字段添加索引,如何添加索引才能使索引更高效添加的索引是否越多越好明明添加了索引却不生效索引有哪些类型评判一个索引设计的好坏标准什么是索引,索引的作用在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。在新华字典里查某个字(如「先」)具体含义的时候,通常都
2020-06-17 18:32:24
846
原创 HDFS简要介绍
HDFS 出现背景随着数据量越来越大,一个操作系统存不下所有数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。。HDFS只是分布式文件管理系统中的一种。HDFS定义HDFS(Hadoop Distributed File System),它是一个文件系统,用于存储文件,通过目录树来定位文件,其次是分布式,由很多服务器联合起来实现其功能,集群中服务器有各自角色。HDFS的使用场景:适合一次写入,多次读出的场景,且不支持文件
2020-06-16 22:42:20
243
转载 Cookie、Session、Token、JWT区别
什么是认证(Authentication)通俗地讲就是验证当前用户的身份,证明“你是你自己”(比如:你每天上下班打卡,都需要通过指纹打卡,当你的指纹和系统里录入的指纹相匹配时,就打卡成功)互联网中的认证:用户名密码登录邮箱发送登录链接手机号接收验证码只要你能收到邮箱/验证码,就默认你是账号的主人什么是授权(Authorization)用户授予第三方应用访问该用户某些资源的权限你在安装手机应用的时候,APP 会询问是否允许授予权限(访问相册、地理位置等权限)你在访问微信小程序时,
2020-06-16 17:38:53
734
原创 HDFS组成介绍
NoneName(NN)存储文件的原数据,如文件名,文件目录(生成时间,副本数,文件权限等),每个文件的块列表和块所在的DataNode等等DataNode(DN)本地文件系统存储文件块数据,以及块数据的校验和Secondary NameNode (2NN)用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据快照...
2020-06-15 23:44:14
270
原创 Hadoop1.x和Hadoop2.x区别
Hadoop1.x中MapReduce处理业务逻辑同时负责资源调度耦合性较高,在Hadoop2.x增加Yarn,Yarn只负责资源调度,MapReduce只负责运算。
2020-06-15 23:38:04
270
原创 Hadoop优势
高可靠性Hadoop 底层维护多个数据副本,所以即使Hadoop某个计算元素或存储出现故障,也不会导致数据丢失高扩展在集群间分配任务数据,可方便的扩展数以千计的节点高效性MapReduce思想下,Hadoop是并行工作,以加快任务处理速度。高容错性能够自动将失败的任务重新分配...
2020-06-15 23:16:41
231
转载 LoadRunner中对图表的分析说明
LoadRunner中对图表的分析说明(一)在Vusers(虚拟用户状态)中1.Running Vusers(负载过程中的虚拟用户运行情况)说明——系统形成负载的过程,随着时间的推移,虚拟用户数量是如何变化的,描述为(用户在几分钟左右到达了组在峰值多少个虚拟用户,负载的生成是大约每分钟增加几个用户,峰值负载持续为几分几秒)。2.Rendezvous(负载过程中集合点下的虚拟用户数)说明——脚本中一般要设置集合点才会产生并发,随着时间的推移各个时间点上并发用户的数目,方便我们了解并发用户数的变化情况
2020-06-15 17:22:41
1842
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅