自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(75)
  • 收藏
  • 关注

原创 Java web三大组件回顾

Java web三大组件回顾接触到了grpc相关的框架项目,项目中有一个微服务作为接受前端的http请求,再将请求进行处理过滤验证等操作后转发给其他对应的rpc服务接口。(此处是个人理解,有些形容可能不够恰当)看了这个接受请求的总服务相关的代码,查阅回顾了下相关的知识点。Java web三大组件ServletFilterListener其他HttpServletRequest...

2020-03-29 18:53:21 226

原创 在数组中找出和为某值的数对

在数组中找出和为某值的数对题目要求:给定一个数组和一个数字,找出数组中所有和为数字的数对,并返回总个数。思路:1、直观的就是直接暴力遍历,找出所有数对然后判断是否符合,时间复杂度为O(n^2)2、将数组排序,然后通过两端夹击的方法,当和大于预期值,后面的数字下标向前移动一格,如果小于,则前面的数字下标向前移动一格…代码实现:import java.util.Arrays;publ...

2019-09-09 22:44:55 998

原创 navicat导旧数据到新表

navicat导旧数据到新表在项目中有个需求,由于旧项目的旧表一直没有更新,且由于之前没有对更新表的操作进行记录,无法通过sql文件进行表的更新…问题:将旧表的数据导入到新表中(新旧表结构不大一样),这就不能直接导出数据与结构文件然后直接执行了。解决:在这里我使用的是navicat premium这个工具先将新表的结构导出,然后在目标库中执行生成对应的空表用旧表导出向导(注意导出格...

2019-09-04 14:49:22 1133 3

原创 编程练习-求出数组逆序对

编程练习-求出数组逆序对思路:刚开始使用一个个遍历所有数对然后比较算出,时间复杂度为O(n^2);后来思考后发现可以基于归并排序来实现优化,归并排序可以在选出较大数字的过程,记录后半部分中小于前半部分某个数字的个数…代码如下:public class Main { private static int res = 0;//逆序对个数 public static void m...

2019-09-02 23:41:28 228

原创 MyBatis-plus缓存相关

MyBatis-plus缓存相关Mybatis有一级缓存、二级缓存,不过存在一些问题,最好使用第三方缓存,这里来记录下配置redis作为缓存。第三方缓存配置Cache实现类代码:public class RedisCache implements Cache { //实现类 private static final Logger logger = LoggerFactory...

2019-08-29 11:53:54 4636

原创 spring声明式事务 同一类内方法调用事务失效

spring声明式事务 同一类内方法调用事务失效在项目开发中,检查代码流程时,被boss指出了一个潜在问题的代码 @Override public void closeCharge(String payNo){ logger.info("--------------------执行充值结算------------------------"); LsIdC...

2019-08-28 16:26:14 355

原创 定制HTTP消息转换器

定制HTTP消息转换器参考文章:将java实体对象转换成HTTP的数据输出流。Spring Boot底层通过HttpMessageConverters依靠Jackson库将Java实体类输出为JSON格式。当有多个转换器可用时,根据消息对象类型和需要的内容类型选择最适合的转换器使用。基于WebMvcConfigurerAdapter类中的configureMessageConverter...

2019-08-27 14:57:12 247

原创 拦截器之权限注解

拦截器之权限注解接触了项目,在阅读代码时对其架构中拦截器的设计有很多值得记录的地方,在此记录一下。对拦截器的理解:在项目架构的搭建中,通过注册拦截器,可以减少很多重复代码,将请求拦截下来进行对应的操作,是一种AOP思想的运用。通过使用拦截器来对请求开始,执行过程,结束时都执行所指定的代码,实现业务与功能代码的解耦,让整个代码的结构更加优雅。这里说说拦截器的应用之一:权限注解在项目开发中想...

2019-08-23 11:06:17 1539

原创 交易精度相关

交易精度相关在项目开发中,在金钱交易模块方面发现了bug,在计算折扣优惠时会出现少一分的问题,后来分析应该是在精度计算上出错了。在后台进行金钱交易时,在JAVA中使用的是bigdecimal这个数据类型,保证金钱额度的准确性。不过在进行交易的时候,一般都是精确到分,所以要统一将结果精确到小数点后两位。为了达到代码复用,可以开发一个公用的精确数值小数位的方法。代码://此处还可方便直接使用...

2019-08-22 18:39:59 166

原创 实现Excel文件导入数据库

实现Excel文件导入数据库项目需求,要通过读取excel表的文件将数据导入到数据库,这里项目要求比较简单,不需要多个字段以及一些复杂的字符串判断,不过大体框架实现是差不多的,在这里记录下,以后应该需要的场景会比较多。//导入卡列表@Transactional@PostMapping("/card/import")public BaseResponse cardImport(@Reque...

2019-08-09 19:00:07 270

原创 MQTT报文协议

MQTT报文协议之前一篇文章讲述了关于后台服务器和设备之间的通信的博客(链接),现在深入具体的协议报文以及一些代码实现。服务器发送报文根据topic区分设备和版本:报文头(区分报文是谁发送的):服务器上报设备上报数据区功能码(让设备要执行的一些操作)时间戳(校验发送与接收时间差,超时的就废弃掉)PID(流水号,识别整个流程)MID(信息号,区分信息发送顺序)数据长度...

2019-08-08 11:11:33 774

原创 Netty实现websocket

Netty实现websocket项目中有一个需求,就是能够让服务端主动向客户端发送通知信息,大致过程如下门柜设备开门成功 -》返回开门成功信息给服务端 -》服务端返回ACK确认 -》服务端同时通知小程序用户开锁成功信息…由于需要服务端主动向客户端发送信息,这里可以使用websocket来实现,下面就来实现一个基于websocket的服务器的基本建立过程(这里使用的时Netty,其基于NIO,...

2019-08-05 00:03:58 744

原创 后台开发之设备通信

后台开发之设备通信最近接手了一个智能零售柜的项目,负责JAVA后台开发,在熟悉项目过程学习到了很多东西,从项目的框架设计也感受到了框架设计的艺术,比如拦截器、监听器、测试Mock模拟设备(mqtt协议)…还有许许多多可以吸收理解的,比如通过Mybatis plus实现自动生成文件功能、通过Shell脚本来提高开发效率…今天先记录下关于后台与设备通信之间的一些要注意的点。MQTT协议要实现后...

2019-07-28 23:46:04 889

原创 Java入参细节

Java入参细节今天遇到一个问题,关于函数传入参数引用指向其他对象时,原来的引用会随之指向新的对象吗?现在用代码实验一下改变传入参数引用指向的对象public class Test{ static class Inner{ int count =0; } public static void main(String[] args) { Inner in = new In...

2019-06-24 20:24:18 1411

原创 String中的intern方法

String中的intern方法参考:https://blog.csdn.net/goldenfish1919/article/details/91043638在jdk6及之前,调用.intern方法时如果常量池中不存在该字符串,则会拷贝到常量池中在jdk7及之后,如果发现没有在常量池中,不是拷贝到常量池中,而是生成一个指向堆中该对象的引用在常量池中,我下面分析的是jdk1.7之后的代码...

2019-06-22 22:56:33 497 1

原创 编程练习-把数字翻译成字符串(递归)

编程练习-把数字翻译成字符串(递归)题目:给定一个数字,0翻译成‘a’,1翻译成‘b’…,25翻译成‘z’,比如12258可以翻译成’bccfi’、‘bwfi’、‘bczi’、‘mcfi’、‘mzi’五种,计算出一个数字有多少种不同翻译方法思路:基于递归:将当前一个数字作为整体f(i,i),将当前两个数字作为整体f(i,i+1)再判断符不符合要求,不断递归,累加最终符合的结果。f(0,0)...

2019-06-22 20:35:03 447

转载 强缓存、协商缓存

强缓存协商缓存记录下这篇关于资源更新一致性等问题的文章—链接

2019-06-21 20:47:09 222

原创 编程练习-平衡二叉树

编程练习-平衡二叉树判断一棵树是否为平衡二叉树代码思路:首先先设计一个计算节点深度的函数,可以得出某个节点的左节点深度和右节点深度,来判断深度差是否超过1,如果用前序遍历,会导致重复计算,所以应该改用后序遍历,这里为了保存结果要初始化一个布尔全局变量代表是否为平衡树,在遍历过程中一旦出现不平衡的子节点,就设置为false。import java.util.*;public class S...

2019-06-19 20:58:05 265

原创 JVM垃圾回收调优入门

JVM垃圾回收调优入门垃圾回收是程序运行中影响性能很关键的一环,分析垃圾回收情况并对其参数进行一些调优是非常有必要的。主要指标:吞吐量、停顿时间、GC原因工具:gceasy、gcviewer选择垃圾回收器并行收集器介绍:这里的并行是指垃圾回收线程并行回收,而不是垃圾回收线程和应用程序线程并行,故在进行垃圾回收的时候,应用程序会被暂停执行。特点:吞吐量优先,不过会影响程序的响应时间...

2019-06-19 11:56:31 155

原创 编程练习-数据流中的中位数

编程练习-数据流中的中位数这里要注意的是数据流,而不是固定的数组,因此无法进行排序得出中位数,可以使用两个堆结构来实现,一个最大堆来存数据流中较小的数据,一个最小堆来存数据流中较大的数据,这样一来,中位数不是最大堆的堆顶数就是最小堆的堆顶数,要不就是两个堆顶和除以二。代码思路:java中的PriorityQueue是基于堆实现的,可以通过传入不同的比较器来实现最大堆和最小堆,这里的比较器Co...

2019-06-18 15:48:33 196

原创 网络编程之Netty

网络编程之NettyNetty是对网络编程接口的优化封装,使得开发难度降低,支持BIO和NIO模式,这里关于为什么没有使用AIO模式,是因为在Linux中NIO和AIO底层使用的都是系统的epoll方法,并且AIO还在该基础上增添了一层封装,性能上没有优势,而Netty主要是针对Linux服务器做开发的,所以使用了NIO。(在Windows的AIO和NIO却又较大区别,在性能上AIO比NIO更好...

2019-06-16 10:39:12 325

原创 网络编程之AIO

网络编程只AIOAIO是一种异步非阻塞模式,它的思想是一个线程处理一个有效请求,当有连接请求时,由系统来通知应用程序处理请求完成连接,而不需要向NIO一样进行轮询,IO请求也是由系统进行处理,处理完成后通过回调机制通知应用程序直接调用这些数据,这里就是使用到了异步的思想。AIO适用于连接数量多并且连接时间长的场景。代码思路:建立一个线程池转化为AsynchronousChannelGrou...

2019-06-16 09:58:39 332

原创 网络编程之NIO

网络编程只NIONIO是一种非阻塞同步模型,它的思想是一个线程处理一个请求,通过将所有连接存在一个多路复用器中,然后通过轮询这个多路复用器查看是否有连接发送了事件,当发现了有事件发生时(如IO操作),则调用线程来处理这个连接,相比BIO能处理的连接数大大提高,并且线程利用率也高了很多。这里要注意NIO底层是epoll实现的,相对于select有更大的优势。代码相关:我这里为了编程简单,体现N...

2019-06-15 23:09:02 111

原创 网络编程之BIO

网络编程之BIOBIO是一种同步阻塞模式的网络处理方式,它的思想是一个线程处理一个连接,当连接没有事件方式的时候,线程会一直阻塞直到有相关事件发生然后进行处理,由于线程是需要消耗系统资源的,当连接数量多的情况下,调用了大量线程,就会导致系统无法提供资源建立线程进行处理,导致服务器无法接受网络请求,在高并发情况下不适合使用BIO模式,不过他的编程方式比较简单,在并发量较低的情况下可以使用该模式。...

2019-06-15 20:41:01 152

原创 程序死循环、死锁问题定位

程序死循环、死锁问题定位在开发过程中,可能由于代码设计问题导致出现了死循环或者死锁的问题,使服务器CPU负载飙高从而导致系统运行缓慢,因此要特别注意防止死循环和死锁的发生。如监控服务器状态时,如果发现CPU负载或利用率飙得很高,这时候就要定位出可能出现的问题,这是在开发中非常重要的能力之一。主要方法:top 、jstack定位死循环模拟一段死循环代码(我这里参考了其他博客的代码来做实验...

2019-06-11 11:47:19 3823

原创 内存溢出问题定位

JVM内存溢出问题定位前言:内存溢出是程序运行中很常见的一个问题,导致这个问题发生的可能性也有很多,如内存分配不足或者内存泄漏等,如何定位到问题所在是非常重要的,至此记录一下关于定位内存溢出问题的方法与思路。(在实验过程出现了一个关于maven版本冲突的问题:解决链接)主要工具:jmap、mat工具步骤:先写出两个demo代码:一个不断创建对象导致堆内存溢出,一个不断创建类导致元空间内存...

2019-06-10 17:08:28 4017

原创 Maven依赖构建版本冲突

Maven依赖构建版本冲突今天在做一个demo时遇到了一个asm包版本冲突的问题,寻找了相关解决方法在这里记录下–链接过程主要是想模拟一个Java虚拟机metaspace空间内存溢出的情况,需要使用到asm工具来循环创建多个类使得metaspace被撑爆来提示错误,再使用MAT工具来排查并定位问题,找到使内存溢出的代码位置。关于这个工具的使用和问题分析的整个过程我在另一篇博客会记录,这篇主要...

2019-06-10 15:34:35 225

原创 Java线程同步-生产者消费者

Java线程间通信实践-生产者消费者设计一个容器,生成者往里面加物品,消费者往里面拿物品。很显然,这个容器需要一个同步机制,可以使用synchronized或者lock这里我在生产者put的时候判断容器是否满了,而在消费这get时判断容器是否为空。注意:这里使用wait时要注意要和while配合使用,防止并发情况下出现错误使用notifyAll而不是使用notify,防止同类唤醒一个同...

2019-06-06 17:42:01 208

原创 编程练习-复杂链表的复制

编程练习-复杂链表的复制题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。步骤:这里要分为三步:1、复制出所有节点,2、将节点的随机指针指向对应的节点,3、分离出新旧链表。这里有个小坑,注意当使用了连续next时要注意判断是否为null/*public class RandomLis...

2019-05-28 10:21:02 90

原创 MyBatis缓存机制

MyBatis缓存机制学习了关于Mybatis的一级缓存、二级缓存相关的知识,做一下总结…一级缓存:mybatis中一级缓存是一种基于sqlSession的缓存(是默认开启的,并且是无法关闭的,不过可以在select标签中的flushCache设置为true,使得查询都清除缓存)。一级缓存失效情况:不同sqlsession会导致一级缓存失效同一个sqlsession,但是查询条件不同...

2019-05-27 17:48:46 130

原创 重建二叉树-(递归)

重建二叉树-(递归)今天遇到一道比较难实现的题,参考别人的代码进行学习总结下…题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。/** * Definition for binary tree ...

2019-05-25 21:11:01 311

原创 对象锁和类锁问题实验

对象锁和类锁问题实验今天遇到了一个问题,就是当获取到类锁时还能获取到该类的对象锁吗?实验一都是获取类锁,显然会实现同步public class Solution { /*实验结果 获得类锁,睡觉zzz 起床... 获得对象锁 */ public static void main(String[] args) { Solution s = new Solution(); ...

2019-05-24 22:50:56 125

原创 编程练习--回溯法

编程练习–回溯法回溯法,通过递归不断尝试,失败后返回到前一步继续尝试…矩阵中的路径public class Solution { private int rows; private int cols; private boolean[] visited; private int p; public boolean hasPath(char[] matr...

2019-05-24 14:55:58 361

原创 MySQL性能分析思路总结

MySQL性能分析思路总结总结一下对mysql性能分析的大概思路。分析开启慢查询日志(slow_query_log)设定一个阈值,通过查询日志记录下这些慢的SQL语句,然后进行分析1、是否建立了索引?2、建立了索引,是否有达到走索引的效果?如:遵循最左前缀原则;是否使用了范围查找(>、<、in、between);是否使用了not in、!=、<>导致全...

2019-05-20 22:57:19 243

原创 MySQL优化之exists、in

MySQL优化之exists、in很多关于MySQL关于exists和in的介绍中,都说使用exists优于in,其实这种说法是不准确的,要根据实际场景来进行分析。以前使用的方式:--出现笛卡儿积,占用内存select * from A a, B b where a.id = b.id; 优化原则:小表驱动大表,即小的数据集驱动大的数据集。使用in的情况:select * from...

2019-05-20 22:44:07 189

原创 MySQL慢查询日志

MySQL慢查询日志关于MySQL的基本使用记录一下。介绍:开启慢查询日志后,设定一个阀值,会将超过这个阀值设定的时间的查询语句记录下来,默认是不开启的,在实际场景中也不建议开启,会影响性能,除了要测试调优的时候再开启。日志位置:var/lib/mysql/xxx-slow.log开启方法:--查看状态SHOW VARIABLES LIKE '%slow_query_log%';...

2019-05-20 20:50:10 101

原创 MySQL单表、双表、三表优化

MySQL单表、双表、三表优化学习了mysql中使用explain进行sql语句性能分析,总结一下mysql单表、双表、三表优化在看这篇文章之前,应该要先理解好左连接、右连接等一些知识。(链接)单表优化:单表优化就要注意SQL语句是否能够正确利用到联合索引(即走不走索引)例如:建立联合索引 a_b_c_index(a,b,c)#查询a为xx值,b大于xx值 以c排序的最大一行数据S...

2019-05-20 10:53:00 460

原创 Linux下的mmap原理

Linux下的mmap原理看了关于mmap原理介绍的文章,在这里做一些自己的总结。mmap简介:mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,w...

2019-05-17 10:36:29 599

原创 操作系统内存管理总结

操作系统内存管理总结关于内存管理这一块的学习进行自己简单的总结,如有错误,请指出交流,一起学习进步…我抽离出几个概念来总结。虚拟内存虚拟内存其实就是一种操作系统的内存管理机制,使得看起来有比真正拥有的内存更大的空间,其一部分映射到物理内存,一部分对应在磁盘上。虚拟内存允许执行进程不必完全在内存中。虚拟内存的基本思想是:每个进程拥有独立的地址空间,这个空间被分为大小相等的多个块,称为页(...

2019-05-16 21:50:47 867

原创 编程练习--二叉树和为某一值的路径

编程练习–二叉树和为某一值的路径import java.util.ArrayList;/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val;...

2019-05-15 22:48:18 86

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除