Java
文章平均质量分 68
莱特昂
这个作者很懒,什么都没留下…
展开
-
生产慢查询问题分析
由于mysql在真正执行语句的时候,并不能准确的知道满足这个条件的记录有多少,只能通过统计信息来估算记录,而优化器并不是非常智能的,就有可能发生索引跳变的情况,这种情况很难在测试的时候复现出来,生产也可能是突然出现,所以我们只能在使用上尽量的去降低索引发生跳变的可能性,尽量避免出现该问题。我们可以在创建索引和使用sql的时候通过以下几个点进行检视。(1) 索引的创建。原创 2023-07-11 16:13:13 · 268 阅读 · 0 评论 -
含生僻字中文校验方式优化
项目姓名校验原本一直是通过utf8正则进行校验,但近期出现的客户生僻字包含双码字,原有校验方式无法实现。需要修改扩大校验范围。原创 2023-07-10 14:38:43 · 1913 阅读 · 2 评论 -
Java服务凌晨自动补传文件存储系统上传失败的文件
腾讯文件存储的COS系统时而有抖动的现象,导致文件上传失败。而这些文件对客户查记录来说有很重要,所以需要一种兜底机制,在文件存储COS系统不可用的情况下,仍然能保存图片,在COS可用之后重新上传,提高系统的总体可用性原创 2023-05-29 17:03:09 · 205 阅读 · 0 评论 -
Java服务xml格式请求HttpServletRequest转Json
新的限流方法需要从请求中读取appid,实现appid级的限流。功能开发完在测试环境中跑没有问题,测试也没有发现问题。但上线后却直接抛异常,看了下日志,是个固定appid,从request读取的时候拿不到。仔细查看后,发现这个appid对应的客户采用的xml的格式请求,不是JSON的!解决的思路是,拿到请求后,先判断请求头里的请求格式,如果是xml格式,则先转成JSON。从网上找到两种xml转JSON的方法,详见参考文件。如果请求是xml,最后一行jackson读值的时候就会报错。原创 2023-05-26 11:32:20 · 555 阅读 · 0 评论 -
拦截器实现接口限流
通过以上几步,就可以简单实现拦截器限流的方式。之后如果需要在服务接口响应之前做些公共操作也可以考虑拦截器的方式。方便且容易实现,步骤很清晰,可以专注于功能本身的开发。原创 2023-05-18 17:53:37 · 369 阅读 · 0 评论 -
记录线上排查内存泄露问题
记录一次云上排查内存泄露的问题,最近监控告警云上有空指针异常报出,于是找到运维查日志定位到具体是哪一行代码抛出的空指针异常,原创 2023-05-06 10:16:24 · 558 阅读 · 0 评论 -
restTemplate未设置连接数导致服务雪崩问题
RestTemplate和Spring提供的JdbcTemplate类似,对象一旦构建(使用过程中不对其属性进行修改)就是线程安全的,多线程环境下可以安全使用。第三方库提供的各种方便的类,简化了编码复杂度,方便了开发者。使用不恰当时,细微的编码可能埋藏着大的隐患。精雕细琢,精益求精。原创 2023-03-17 10:59:26 · 1400 阅读 · 0 评论 -
list.size()阻塞踩坑
因为在遍历list时,会获取个锁来保证遍历的原子性,如果其他线程正在修改list,则size()方法需要等待该锁被释放才能继续执行,这可能导致阻塞。最后,组内的大佬说,可能是list.size()的问题,list.size()查看大小的时候也是阻塞的,可能别的线程还在插入,list.size()查看的时候把list阻塞了。今天导师在群里问下面这段代码,list也改了线程安全的List,循环一万次往list里塞元素,为什么看size都是小于一万的,而且每次的值都是不一样的?仔细看了代码,确实也感觉奇怪。原创 2023-02-22 16:43:39 · 593 阅读 · 0 评论 -
使用Arthas定位问题
记录Arthas常见的使用场景,以及定位问题的实例原创 2023-02-14 16:13:06 · 1967 阅读 · 0 评论 -
测试环境频繁Full GC问题的解决思路
测试环境的问题,发现了应当立即定位分析根本原因,然后评估影响并确定解决方案,不要把悬念带上生产;原创 2023-01-29 15:56:23 · 1225 阅读 · 0 评论 -
guava本地缓存CacheLoader使用
最近代码里看到有部分关于guava写本地缓存的,学习记录一下。首先guava的本地缓存可以理解成一个缓存map,以kv的形式存数据,不会持久化,没有支持分布式。比redis使用起来方便,不用引入额外的组件。如果是单机缓存的话,可以首先选择使用这种缓存方式。Guava cache的设计来源于CurrentHashMap,是线程安全的,可以按照多种策略来清理存储在其中的缓存值且保持很高的并发读写性能。常见应用场景:对性能有非常高的要求、不经常变化、占用内存不大、有访问整个集合的需求、数据允许不时时一致。多种清理原创 2022-12-05 17:22:37 · 2557 阅读 · 0 评论 -
MySQL查询优化实例
导语 通过几个小实例,对实际会经常用到的查询进行对比,通过MySQL的执行计划分析语句的执行性能,最后分析几个在实际中会遇到的小问题。我们知道一般应用系统的读写比列在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化是非常重要的。原创 2022-11-16 17:00:44 · 753 阅读 · 0 评论 -
Mybatis的sql语句执行异常后打印到日志
最近做的一个运维提的需求。希望插入和更新的sql语句时,如果执行失败,能打印到一个专门的日志文件里。他可以用来恢复数据库里的数据。在网上调研了下可以实现这个功能的方案:1、可以通过Mybatis拦截器可以获取到执行的sql语句2、由于我们的数据库都是异步写的,所以会存在多线程的问题,如果用一个变量存,可能会出现这条sql还没读出来就被别的线程的sql语句覆盖的问题,线程不安全。所以考虑用ThreadLocal存Mybatis拦截器的sql语句。原创 2022-11-14 19:52:53 · 2436 阅读 · 0 评论 -
零拷贝底层剖析
零拷贝字面上的意思包括两个,“零”和“拷贝”:“拷贝”:就是指数据从一个存储区域转移到另一个存储区域。“零” :表示次数为0,它表示拷贝数据的次数为0。合起来,那零拷贝就是不需要将数据从一个存储区域复制到另一个存储区域咯。做服务端开发的小伙伴,文件下载功能应该实现过不少了吧。如果你实现的是一个web程序,前端请求过来,服务端的任务就是:将服务端主机磁盘中的文件从已连接的socket发出去。关键实现代码如下:while((n = read(diskfd, buf, BUF_SIZE)) > 0) writ原创 2022-06-23 10:49:15 · 155 阅读 · 0 评论 -
Java类似引用传参的方法
由于是C++转Java,之前一直习惯了用引用传递。虽然已经转变过来了,但还是有些场景,确实用引用传参方便。比如在之前的代码上做修改,需要在循环中的处理函数传出个计数的值,在循环外定义这个值保存,但如果用Integer直接传入,处理函数逻辑里面累加的话,循环外的值不会随之改变,不能实现计数的目的。此时如果像C++一样能够引用传递,便能轻松避免这个问题。—————————————————————————————————————————关键字Reference还是同事跟我说的方法,可以用Reference包装原创 2022-06-01 19:48:38 · 343 阅读 · 0 评论 -
nginx配置
记录几个NG配置时才过的坑:导入前端页面去掉访问路径前缀POST上传文件大小限制前端页面刷新后404原创 2022-05-28 11:00:02 · 209 阅读 · 0 评论 -
网站加载图片速度提升
发现网站加载图片速度很慢,于是尝试去找了一下经济又高效的加速方案。基本分为三种:提升服务器带宽、OSS云存储和CDN加速。OSS的基础上还能进一步用CDN加速,不过费用就要进一步提升了。1、提升服务器带宽因为现在是在服务器里自建的文件存储系统,相当于用的是服务器本身的带宽,所以加载图片的时候会收到服务器带宽瓶颈的限制。所以可以直接加钱升服务器带宽来解决,不过要综合对比考虑一下经济性。如果每月增加5Mbps带宽,每月需要额外增加400的费用。2、OSS云存储OSS云存储是直接采用云存储系统,等于原创 2022-05-23 17:18:32 · 2493 阅读 · 0 评论 -
SpringBoot应用刚启动时服务报大量超时的问题
刚转Java,每次项目要更新线上的时候。虽然操作非常缓慢且小心,按照摘除负载、更新容器、等待一段时间、恢复负载的严格步骤来操作,Nginx那边依然会报许多的503超时告警。搞得之后每次更新线上都胆战心惊。暂时的解决方法网上类似的情况举例研究深层次的原因解决......原创 2022-05-05 20:25:13 · 1484 阅读 · 0 评论 -
Java 浅拷贝和深拷贝
浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。深拷贝 :深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。浅拷贝浅拷贝的示例代码如下,我们这里实现了 Cloneable 接口,并重写了 clone() 方法。clone() 方法的实现很简单,直接调用的是父类 Object 的 clone() 方法。public class Address impleme原创 2022-04-24 20:19:25 · 194 阅读 · 0 评论 -
Java ==判相等踩坑
Java 基本类型的包装类的大部分都实现了常量池技术。Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。如果超出对应范围仍然会去创建新的对象,缓存的范围区间的大小只是在性能和资源之间的权衡。两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。下面的代码的输出结果是 true 还是 fals原创 2022-04-24 19:31:15 · 131 阅读 · 0 评论 -
Spring如何解决循环依赖问题
看到一篇文章讲Spring如何解决循环依赖问题,记录一下:PS:其实正确答案是开发人员做好设计,别让Bean循环依赖,但是没办法,面试官不想听这个。我们都知道,单例Bean初始化完成,要经历三步:注入就发生在第二步,属性赋值,结合这个过程,Spring 通过三级缓存解决了循环依赖:1、一级缓存 : Map<String,Object> singletonObjects,单例池,用于保存实例化、属性赋值(注入)、初始化完成的 bean 实例2、二级缓存 : Map<Strin原创 2022-04-22 16:01:00 · 2565 阅读 · 0 评论 -
Java log4j2日志配置
项目中日志的xml文件结构很复杂,这里逐步解析记录下,还有相应的参考教程。<?xml version='1.0' encoding="UTF-8" ?><Configuration> <Properties> <!-- 定义日志文件的存储地址 --> <Property name="log-dir">/export/Logs/jx-search-web</Property>原创 2022-04-22 11:30:51 · 2675 阅读 · 0 评论 -
docker-compose部署Java应用和相关依赖
上次用了docker远程部署之后,发现还是有点不方便的地方。2357上传了镜像之后,不会自动启动成容器,而且许多启动时的命令还要重新打。换台机器还要从偷装mysql和minio等等。网上看到能通过docker-compose进行一键部署。docker-compose部署分为一下几步:下载docker-compose编写build镜像相关的dockerfile编写docker-compose启动的yml文件以本Java应用为例,dockerfile已经本地通过IDEA的docker-maven-原创 2022-04-17 17:12:15 · 4847 阅读 · 0 评论 -
docker容器间互联
单机部署的时候考虑,能不能使docker各个容器间互通呢。比如我的web应用容器可以和db容器间互通,而不是现在这样再web应用调用本机ip去访问。网上查了一下还真有这种方法。还有两种方法:1、links在容器启动时,启动命令中加入links指定链接的容器:docker run -itd --name nginx-web02 --link nginx-web:nginx01 -p 81:81 sunmmi/nginx nginxrun容器nginx-web02时,link容器nginx-web,原创 2022-04-15 18:20:47 · 1915 阅读 · 0 评论 -
本地配置虚拟机docker开发环境
1.开启ubuntu ssh服务sudo apt-get install openssh-serversudo /etc/init.d/ssh start 2. docker hello-world报错[vagrant@docker ~]# docker pull hello-worlddocker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while原创 2022-04-14 22:27:02 · 1717 阅读 · 0 评论 -
Guava库使用
今天听同事说到google的Java工具库Guava非常好用,有很多操作list和map的快捷方法。所以就来学习记录一下。Joiner静态初始化方法,创建list时指定初始值List<String> list1 = Lists.newArrayList("1", "2", "3"); //传入集合List<String> list2 = Lists.newArrayList(list1);将list字符串集合,以,形式转为字符串List<String&g原创 2022-03-28 21:31:08 · 1001 阅读 · 0 评论 -
JAVA面试学习资料
JAVA面试学习资料/进阶学习《JAVA进阶手册》在线文档(可免费下载)转载 2022-03-28 14:44:29 · 106 阅读 · 0 评论 -
windows wsl装linux踩坑
windows非官方正式版,无法登陆Micsoft账号从网上找了网盘的下载点下载,本地用命令行安装。详见链接:http://www.biliyu.com/article/1968.html命令行安装报WslRegisterDistribution failed with error: 0x80041002的错误网上找到命令行输入Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux.原创 2022-03-19 12:09:11 · 5194 阅读 · 0 评论
分享