项目记录——故障排查
这里将会记录一些我在企业开发中的遇到的一些长见识的Bug,以及针对别人代码的故障排查
SQL DML堵塞问题(Oracle)Bug描述最近项目需要接收大数据部门接口传来的数据,然后对数据做一些update操作后插入到一个表里面,后文会将该表称之为Business表。在执行这个操作的时候,意外发现执行时间过长,超过二十分钟了。
最开始以为是数据量过大的问题,后来发现并不是,因此不得不化身为DBA寻找阻塞原因,因此记录下解决这个问题的经历:
问题排查首先可以用以下sql分析和确定下,这个查询是不是被堵住了:
123456select s1.username || '@' || s1.machine || '(SID=)' || s1.sid || ')' as blocking_session,s2.username || '@' || s2.machine || '(SID=)' || s2.sid || ')' as waiting_session,s1.sql_id ...
项目记录——企业需求
这里将会记录一些我在企业开发中的一些项目需求
——————————————-快速检索和翻页请见右侧目录—————————–>
——————————————-快速检索和翻页请见右侧目录—————————–>
——————————————-快速检索和翻页请见右侧目录—————————–>
Redisson分布式锁
需求描述最近自己做项目的时候,需要对一个查询菜单项目的缓存加锁,以优化查询性能。但是后续由于搭建了Redis集群的原因,多线程锁不能满足需求了(多线程锁只能锁住当前JVM,没办法锁住集群其他JVM),需要使用分布式锁完成该性能优化。
思路与实现下面是我本来的代码,用于实现多线程锁。
123456789101112131415161718192021222324public Map<String, List<Catalog2Vo>> getCtegoryJsonFromDbWithRedisLock() { // distributed lock String uuid = UUID.randomUUID().toS ...
Hexo转换语言,适用任何主题
本文主要讨论Hexo如何最简单地实现国际化,而且该方法适用性很高,对使用哪种主题我个人认为没有什么要求
理想解决方案在主页存在一个按钮,通过单击该按钮可以实现一键切换语言的页面(本博客示例将是中英文)。同时该方法的实现不需要新买一个域名。
值得注意的是,该方法不是直接翻译,所以需要同时维护N份post的博客文件(N是你的语言数量),所以如果你需要更新博客,需要同时更新N份文件。
以下的实现流程将会以中英文作为示例,更多语言参照此教程即可:
实现流程(1)分割页面文件夹,假设你原来的文件都存放在一个叫做hexo的文件夹中,主要存放的是中文文件。现在新建一个叫做hexo-en的文件夹用于存放英文的文件夹。注意:它们是同级的!
构建好的文件夹应该如下:
(2)复制除了node_modules外的所有文件从hexo到hexoen,将站点分开
(3)接下来修改两个hexo的 _config.yml 文件内容,下图第一个为hexo,第二个为hexo-en:(这一步是修改了hexo的主要语言)
(4)继续修改 _config.yml 的根目录url和root,下图第一个为hexo,第二个为he ...
构造器内部初始化实际过程
类初始化顺序类的初始化遵循的顺序很多人都知道是这样:(1)调用基类构造器,不断重复这个过程直到最底层(2)再按照声明的顺序调用成员的初始化方法(3)调用类构造器的主体
类初始化的实际过程但是,考虑这样一个例子:
12345678910111213141516171819202122232425262728293031class Animal{ public void walk(){ System.out.println("Animal.walk()"); } Animal(){ System.out.println("Animal() before walk()"); walk(); System.out.println("Animal() after walk()"); }}class Cat extends Animal{ private int step = 100; @Override public void walk() { ...
方法静态分派
该例子参考了书《深入理解Java虚拟机》。
首先,思考下面代码的返回结果:
1234567891011121314151617181920212223242526272829public class StaticDisptach{ static abstract class Human{} static class Man extends Human{} static class Woman extends Human{} public void sayHello(Human people){ System.out.println("hello,people"); } public void sayHello(Man man){ System.out.println("hello,man"); } public vo ...
如何调试springboot定时调度任务
最近在做企业开发的时候,有个需求需要我对发送邮件的定时调度任务做调整和优化。
@Scheduled 定时调度任务已经完成的发送邮件定时调度任务大概长这样:
首先,思考内部类是怎么运行的。我们知道在内部类编译成功后,它会产生一个新的class文件。
该class文件仅仅只保留了对外部类的引用。
举个例子,当外部类传入的参数需要被内部类调用时,直接看起来好像就是被直接调用的:
12345678910@Componentpublic class EmailScheduled{ @Scheduled(cron = "0 0 23 * * * ?") public void emailSend(){ ... } }
优化调整的困难点在于debug麻烦:
目前的开发环境的代码并没有设置统一接口来通过前端调试后端定时任务
如果通过修改cron来调试,需要重启项目,更重要的是会发很多骚扰邮件出去
还有一个思路是在测试代码里面调用方法,但是也很麻烦
实际 ...
匿名内部类形参为什么一定要final
最近在写一些匿名内部类的时候会感觉有些难以理解,所以重新复习了一下这部分内容。 发现了一些之前没注意到的点——匿名内部类的形参必须加final前缀(除非匿名内部类没使用它)
那么,怎么理解这个事情的背后原理呢?
内部类运作方式首先,思考内部类是怎么运行的。我们知道在内部类编译成功后,它会产生一个新的class文件。
该class文件仅仅只保留了对外部类的引用。
举个例子,当外部类传入的参数需要被内部类调用时,直接看起来好像就是被直接调用的:
12345678910111213public class OuterClass{ public void method(final String name,final int age){ class InnerClass{ public void show(){ System.out.println("your name is " + name + " and age is " + age); ...
内网项目踩坑记录
众所周知,有的项目是完全建立在内网的离线模式的。最近第一次接触这种离线模式的项目,记录一下遇到的问题:
Maven offline model由于内网要求,所以项目是运行在虚拟机上的,开发环境在虚拟机上不能联网,所以所有项目都是需要重新下载下来。在配置pom.xml的时候出现了问题,idea一直报一个奇怪的错误:
Cannot access maven-default-http-blocker (http://0.0.0.0/) in offline mode
最开始按照网上指示,开启了maven的offline模式,但是还是不能解决问题,后来发现是Maven的版本问题
这是因为我使用的idea默认的Bundled(Maven3),这里的maven版本是3.8以上太高了,在高版本的maven的setting.xml文件中有一个镜像:
首先,思考内部类是怎么运行的。我们知道在内部类编译成功后,它会产生一个新的class文件。
该class文件仅仅只保留了对外部类的引用。
举个例子,当外部类传入的参数需要被内部类调用时,直接看起来好像就是被直接调用的:
1234567<mirr ...
Oracle SQL优化
问题最近在写一个项目SQL的时候遇到了问题,SQL的执行时间过长:
1234567891011121314151617select'A' as type,count(adl.is_attend) as count,round(sum(case when adl.is_attend = 1 then 1 else 0 end)/ count(adl.is_attend),2) * 100 as ratefromattendance adlinner join (select deptId from department start with deptId = '...' connect by up_daptId = prior deptId) as nbd on adl.deptId = nbd.deptIdwhere to_date(adl.date,'yyyy-MM-dd') >= to_date( #{begin_date} ,'yyyy-MM-dd' ...
MySQL数据备份
该博文用于记录一下学习过程中学到的新知识,关于如何在MySQL中进行数据备份。如果之后有用到,可以用作参考。
直接看代码:
123456789101112Q1:SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;Q2:START TRANSACTION WITH CONSISTENT SNAPSHOT;/* other tables */Q3:SAVEPOINT sp;/* 时刻 1 */Q4:show create table `t1`;/* 时刻 2 */Q5:SELECT * FROM `t1`;/* 时刻 3 */Q6:ROLLBACK TO SAVEPOINT sp;/* 时刻 4 *//* other tables */
在备份开始的时候,为了确保 RR(可重复读)隔离级别,再设置一次 RR 隔离级别 (Q1);
启动事务,这里用 WITH CONSISTENT SNAPSHOT 确保这个语句执行完就可以得到一个一致性视图(Q2);
设置一个保存点(Q3);
show create 是为了拿到表结构 (Q4), ...