![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
文章平均质量分 85
雨过天晴_6795
java工程师
展开
-
超过500万海量数据怎样处理
前言最近笔者在工作中遇上一个测试人员通过压力测试反馈的问题。这个问题就是测试人员一下子制造了上千万的数据,造成某个mysql/oracle数据库表产生了500万以上的数据,造成分页查询offset过大的问题。即使查询条件加了索引以及采用懒加载策略,查询速率也还没提升。这里,笔者考虑了几种处理办法:oracle分区、分库分表、nosql法。下面对这几个方法进行表述。oracle分区法笔者在以前的公司工作时,遇上了告警数据量过多,超过1千万了,造成分页数据量过慢。当时存储告警的数据是在oracle里面,故原创 2021-10-17 19:54:30 · 1342 阅读 · 0 评论 -
线程池的描述
线程池的描述前言多线程的使用可以提升程序运行的时间效率,同时也发挥多核CPU的计算能力的优势,从而提升系统的吞吐量和性能。然而,如果不合理地使用多线程,就会造成CPU的上下文切换频繁,反而因为对CPU和内存耗尽造成对性能产生不利的影响,从而拖垮了系统。故我们需要对线程的使用有个限度,限制运行线程的数量的范围。1.线程池的定义线程池是一种存放一定数量的活跃线程的对象,在需要使用线程时,从其中拿出一个活跃线程,运行完毕之后把对应的线程放回。2.线程池的优势使用线程池,可以实现对活跃线程的复用来提高线原创 2021-01-17 17:22:41 · 236 阅读 · 0 评论 -
为何阿里官方不同意关联三张及以上数据库表
在阿里巴巴开发手册里有这样一条规定,禁止关联三张及以上的数据库表。这个是为何呢?笔者在之前工作中有了亲身的体验,现在对其进行总结。正如广大开发人员所知道的,多表关联查询是对一张表的某个字段来匹配另一张表的对应字段,进而从另外一张表里查询对应的属性。这里大家一般采用join查询,此类查询这里分为left join、right join、inner join、cross join这几种。其中,left join是把前面的表作为主表进行全表扫描的,而right join是把右表进行主表全表扫描的。另外两种则是把原创 2020-10-18 11:34:51 · 1317 阅读 · 1 评论 -
knife4j使用(整合spring boot和spring cloud gateway)
一、背景前后端分离大大实现了项目的解耦合,可扩展性,以及专业人做专业事的特点。前端开发不仅仅有网页端,还有ios、安卓、小程序等,他们都可调用后端的接口。然而,传统的手写文档说明增加了后端开发的成本,同时也不利于前后端之间的沟通。与此同时,传统的浏览器直接测试法不仅不方便接口调用方法的指定,而且填写传递参数的方法耗时很大。为此swagger-ui这个能够在线生成接口说明文档及调试的框架诞生了。...原创 2020-03-08 00:11:15 · 7717 阅读 · 1 评论 -
用ApplicationEvent事件监听解决async注解不能嵌套的问题
前言笔者之前写的文章表述了async注解可以解决异步执行任务同时不影响主业务的功能的特点,很好解决响应超时出503问题影响主业务。然而,async除了在加入@Controller注解的有继承和实现的方法有坑之外,也不能够直接嵌套使用来再开一个线程。下面介绍的事件监听即可解决此类问题。ApplicationEvent简介ApplicationEvent是spring对事件监听的一种机制,采用了观察者模式来进行的。可以使核心业务与子业务进行解耦,还实现了异步事件的嵌套,也方便后期的业务的扩展。而类Appl原创 2020-08-07 15:35:43 · 911 阅读 · 0 评论 -
jvm类加载器Classloader原理
众所周知,java是一门面向对象的编程语言,具有跨平台性高的特点。它也是靠编译后在机器上运行。Java编译运行的平台就是java虚拟机(JVM),其内存结构如下图(图1)所示。图1 jvm基本结构(方法区在java8及以后改为元空间了)如图1可知,java文件是先编译成.class扩展名文件之后再加载到jvm系统运行的。加载此类文件的部分叫做类加载子系统(ClassLoader),该系统加载过程是通过校验、准备、解析三个步骤来进行的。其中校验这个过程是来校验.class文件是否有利于jvm的安全以防jv原创 2020-08-07 15:22:12 · 205 阅读 · 0 评论 -
volatile关键字的使用心得
在多线程操作中,一个线程类的全局变量在直接用传统的关键字情况下,是无法通过另外一个线程更改它的值。具体的代码和执行结果如下:public class DemoThread1 implements Runnable { private static boolean flag = true; @Override public void run() { System.out.println(Thread.currentThread().getName());原创 2020-06-17 13:59:27 · 184 阅读 · 0 评论 -
我所见的orm映射对比
我所见的orm映射对比前言笔者在开发和学习中接触了5种orm框架,他们各有各的优缺点,应用的场景也不一样。下面对这五种orm大体状况进行表述。1.原始jdbc原始jdbc是所有java orm映射的底层封装实现的代码,它通过数据库驱动java类字符串反射初始化驱动来创建连接。在执行完对应的sql后传递到resultset,再通过循环来封装到对应的实体类中。其优点在于可以直接迅速地执行sql,灵活将结果转换为实体类或者vo、dto,但缺点是数据库连接资源利用率不高,同时代码繁琐,开发成本高。2.qu原创 2020-06-13 13:12:14 · 209 阅读 · 0 评论 -
导入大批量数据的案例及@Async注解用法
在导入数据量较大的excel文件到数据库中,常常遇上因为性能问题导致导入失败或响应失败的问题。这里涉及的知识点包含异步执行,线程导入分片和休眠的模块。笔者在最近和之前的工作中针对踩到的坑进行分析,对上面的知识点进行表述。一般的网页请求是同步的,前端默认响应时间是30秒,最多为2分钟,这一点笔者在与前端联调时发现的。导入大量的数据到数据库中往往耗时超过2分钟,这一点超过了前端最长响应时间,前端一旦超时就容易报错(503错误)。故笔者采用异步的方式来进行导入,但是缺点是导入是否失败还不能直接响应给前端,此时笔原创 2020-05-08 23:22:57 · 1104 阅读 · 1 评论 -
服务降级与熔断(基于sentinel)(1)
一、背景在高并发的状态下服务器被访问量很多,但是服务器中可连接的线程数目有限。故访问量一旦超限,很容易导致其他服务无法访问,甚至让整个系统崩溃。为了解决这种问题,需要对某些接口访问的数量进行限制来对该服务进行保护。为此,服务降级与熔断产生了。二、服务保护的基本概念和基本理论2.1 服务限流/熔断服务限流指的是限制某个服务接口高并发状态下的访问数目,即阈值。当服务请求数量超过阈值时,服务器就...原创 2020-03-17 22:22:08 · 874 阅读 · 0 评论 -
springcloudalibaba之注册和配置中心nacos
1.微服务背景1.1传统项目的局限性传统项目即单体应用,是把项目中所有模块和代码都整合在一个项目里,它虽然开发和运维比较简单,但随着业务和需求的发展,其局限性明显体现了。这些局限性体现在耦合度高,业务逻辑没有充分拆分,往往在某个模块崩溃了造成整个系统的崩溃。1.2分布式微服务架构演变为了解决单体应用的局限性,分布式系统就此诞生。分布式系统就是根据业务逻辑将系统进行拆分,降低了耦合度。然而,...原创 2020-02-22 11:00:16 · 388 阅读 · 0 评论