项目记录——企业需求
这里将会记录一些我在企业开发中的一些项目需求
——————————————-快速检索和翻页请见右侧目录—————————–>
——————————————-快速检索和翻页请见右侧目录—————————–>
——————————————-快速检索和翻页请见右侧目录—————————–>
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 ...
项目记录——故障排查
这里将会记录一些我在企业开发中的遇到的一些长见识的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_i ...
集合使用注意事项
集合判空
判断所有集合内部的元素是否为空,使用 isEmpty() 方法,而不是 size()==0 的方式
这是因为 isEmpty() 方法的可读性更好,并且时间复杂度为 O(1)。
绝大部分我们使用的集合的 size() 方法的时间复杂度也是 O(1),不过,也有很多复杂度不是 O(1) 的,比如 java.util.concurrent 包下的某些集合(ConcurrentLinkedQueue、ConcurrentHashMap…)。
下面是 ConcurrentHashMap 的 size() 方法和 isEmpty() 方法的源码。
123456789101112131415161718192021public int size() { long n = sumCount(); return ((n < 0L) ? 0 : (n > (long)Integer.MAX_VALUE) ? Integer.MAX_VALUE : (int)n);}final long ...
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), ...
方法静态分派
该例子参考了书《深入理解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 ...
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' ...
内网项目踩坑记录
众所周知,有的项目是完全建立在内网的离线模式的。最近第一次接触这种离线模式的项目,记录一下遇到的问题:
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 ...
如何调试springboot定时调度任务
最近在做企业开发的时候,有个需求需要我对发送邮件的定时调度任务做调整和优化。
@Scheduled 定时调度任务已经完成的发送邮件定时调度任务大概长这样:
首先,思考内部类是怎么运行的。我们知道在内部类编译成功后,它会产生一个新的class文件。
该class文件仅仅只保留了对外部类的引用。
举个例子,当外部类传入的参数需要被内部类调用时,直接看起来好像就是被直接调用的:
12345678910@Componentpublic class EmailScheduled{ @Scheduled(cron = "0 0 23 * * * ?") public void emailSend(){ ... } }
优化调整的困难点在于debug麻烦:
目前的开发环境的代码并没有设置统一接口来通过前端调试后端定时任务
如果通过修改cron来调试,需要重启项目,更重要的是会发很多骚扰邮件出去
还有一个思路是在测试代码里面调用方法,但是也很麻烦
实际 ...
IDEA如何快速添加JavaDoc文档注释
作为程序员,添加javadoc注释可以说是必要的一步,但是每一次都自己手动添加大段内容也无疑是一件很麻烦的事情。
该文章主要做个记录,方便自己下次如果需要换环境的时候重新配置:
(这里的方法是idea自动生成的,不需要安装插件)
类、接口注释
File–>settings–>Editor–>File and Code Templates–>Files–>Class
在模板上加入文档注释模板:
12345678910/** *@ClassName ${NAME} *@Description TODO *@Author ${USER} *@DATE ${DATE} ${TIME} *@Version 1.0 */public class ${Name}{ }
完成之后以后每次创建类或者接口的时候就会自动生成注释了
方法注释
File–>Settings–>Editor–>Live Templates
单击 ...