mysql使用druid时自动断开连接解决方案
今天接手了一个上了年龄的项目,用的是smm,数据库连接池用的druid,数据库版本较老,是5.0的mysql,我升级成mysql8.0后,一开始还没问题,然后大概每次无连接2分钟后数据库自动断开。。。
前端妹子立马跟我说接口报错了,我咯噔心里一慌,让前端妹子给我截一下报错信息(后台日志刷的太多,当时没注意到)。然后前端妹子说,哦又好了,我当时意识到不对劲,但也没有深究,直到这样的问题出了几次,每次一刷新又好了,我开始意识到问题的严重性。
一开始我复制了报错信息,也就是这一段
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failureThe last packet successfully received from the server was 8848 milliseconds ago. The last packet sent successfully to the server was 8848 milliseconds ago.
搜了半天,网上说加配置、也 ...
springboot聚合工程部署时遇到的坑
今天打包springboot聚合项目的时候,遇到了一个问题,一直报ClassNotFoundException
明明打包都打好了,运行的时候报这个错,弄了好久,解压jar包一看,怎么多了个目录?!
这个目录叫BOOT-INF,打开一看,里面是com文件。。。原来罪魁祸首就在这里,把BOOT-INF里的目录挪出来,然后就不报错了。。项目终于发布上线了!开心~
1.spring-boot maven打包,一般pom.xml文件里会加<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId></plugin>这样打的jar里会多一个目录BOOT-INF。2.引起问题,程序包不存在。3.解决办法,如果A子模块包依赖了B子模块包,在B子模块的pom文件,加入<plugin> <groupId>org.springframework.boot ...
Optional进行优雅非空判断
又到了阿超说博客时间
今日给小伙伴们带来的是如何用Optional这个类
近日,国外一小哥因为不写注释和括号换行,以及用git经常覆盖掉同事的代码被揍
在这里阿超也顺便提醒一下大家:代码不规范,同事两行泪
那么进入今天的正题吧~今天带来的是1.8的这个类Optional,Optional在英文中是可选的意思,他在java中可以作为非空判断,是妥妥的炫技哦!
首先是进行字符串的长度取值
/** * 获取一个字符串的长度 * * @param str * @return */Integer strLength(String str) { if (str == null) { return 0; } return str.length();}
相信有不少小伙伴看出来了,这段代码是大家经常写的,这种逻辑代码,传入的字符串为空,如果调用它的方法,会报NullPointerException
所以我们给她加了个非空判断
现在展示新写法:
/** * 获取一个字符串的长度plus * * @param str * @retur ...
拦截器解决跨域问题
大家平时在项目开发中遇到跨域问题是怎么解决的呢?
我相信有很多小伙伴就会回答:在Controller加上@CrossOrigin就可以啦!
但我们知道,在企业开发中,会有很多个controller,controller数量多也便于维护和查找控制层代码
那有没有一种方式能解决这种繁琐的问题呢?答案是肯定的!
下面介绍如何用JSONP解决跨域问题,哦不是用拦截器解决hh
package com.ruben.controller.interceptor;import org.springframework.http.HttpStatus;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.se ...
快速开发
如今,开发网站已经不是什么稀奇事了
那么如何快速进行网站的开发呢?
首先我推荐的是这款快速开发框架——《jeecgboot》
Jeecg-Boot 是一款基于BPM的低代码开发平台!采用前后端分离架构: SpringBoot 2.x,Ant Design&Vue,Mybatis-plus,Shiro,JWT。强大的代码生成器让前后端代码一键生成,无需写任何代码!!帮助Java项目解决70%的重复工作,让开发更关注业务逻辑,既能快速提高效率,节省研发成本,同时又不失灵活性!各种低代码能力,在线开发:Online表单、Online图表、Online报表、表单设计器、流程设计器、报表设计器、大屏设计器 等等…
其次,是一款gitee上的一套解决方案——《人人开源》
包含了一款快速开发框架Vue+springboot前后端分离、一整7Kstars的权限系统
这两款框架因为都是基于springboot,所以其他的组件都是开箱即用,用很少的配置甚至0配置就能引入组件开始使用
还有一套基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构,提供整套公共微服务服务模块:集中 ...
箭头函数
最近在代码中用到大量箭头函数,例如
result = page.stream().map(p -> { //这个p相当于list里的每一项,map需要return Map<String, Object> tempMap = BeanUtil.beanToMap(p); tempMap.put("isMeLikeHisProduct", StringUtils.isNotBlank(master.getUFavorite()) && master.getUFavorite().contains(p.getId())); return tempMap;}).collect(Collectors.toList()); //可以把return的结果收集起来,转换成一个新的list
以及
productList.forEach(product -> { //这个product相当于list里的每一项,forEach不需要return if (product.getId(). ...
Map和List的碰撞
大家都知道map和list是我们常用的数据结构
比如hashmap和arraylist
在实际开发中,有时会遇到一个问题,比如加了个需求,原来的数据库字段不够用,需要加字段,这样会导致很多处做修改,而我们如果灵活使用map和list就可以一个用字段以json的格式存放很多数据,但这种形式也有弊端,比如难以维护、难以拓展,所以一般情况下,能加字段,加表的话就先别用这种形式
但如果遇到不能动数据库的情况,就可以以这种方式(你甚至可以以这种方式把整个项目存放到一条数据里):joy:废话不多说:
package com.ruben;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestCont ...
工作中遇到的点滴
java程序员这份工作是怎么样的呢?
它和很多工作一样,都很累、很苦。但我们需要学会的是苦中取乐~这篇准备记录下工作中的一些点滴
记得我们做登录的时候,写了个拦截器,把登录页面拦截住了。。。这样导致我们的项目需要登录才能登录,像这样的还有充值是扫码付款,提现也变成了扫码付款,这些BUG真的令人哭笑不得。还有一些奇葩的接口文档(比如我写的),在参数这一栏我写上了“写到这里来了直接问我——by阿超”,因为参数太多了,所以我懒得写了哈哈,还有一个方法的注释那里,有人写上了:如果你想试图修改这段代码,我认为你是愚蠢的,你可以在这段代码浪费掉你一整个下午!
像这种乐趣,就是苦中取乐。除了苦中取乐,工作中还需要摆正心态,不能(像我一样)说下单这块难做,就扔给别人。。。应该挑战自己,指定计划,写好逻辑的大纲流程,以及代码的执行流程,一般像一些复杂的业务逻辑每一步操作都事先写上注释,然后你所需要的就是填空,按照你的注释写下去,最后完成整个流程,这是一个非常实用的方法。但我知道各位都跟我一样,懒得写注释。。。自己的代码有时过上一段时间就会看不懂。所以这方面希望能大家一起进步,毕竟注释不规范,维护两行泪。 ...
浅谈分布式锁实现原理
本篇讲的是基于redis实现的分布式锁
很多程序员都知道redis有个命令叫setnx,它可以给我们的redis加锁
执行这个命令,如果它判断这个锁的名字,也就是key存在的时候,不做操作
假设我这里有段代码,我需要给他加锁以保证线程安全,解决分布式下的资源共享问题
String lockKey = "myLock";Boolean result = stringRedisTemplate.opsForValue().setIfAbsent(lockKey, "achao"); //加锁if (!result) { throw new Exception("error!");}//执行业务System.out.println("执行业务");stringRedisTemplate.delete(lockKey); //释放锁
现在有个问题,就是如果我按上面这样写,如果我们中途程序执行的时候抛出了一个异常,那么我们的锁就永远得不到释放,下一个线程过来,发现锁没释放,就导致整个系 ...
一行代码搞定中文姓名排序
上码!
两个参数分别为:一个字符串数组、一个接收比较器,以确定所述阵列的顺序
Collator是一个抽象基类,子类实现特定的整理策略。
Arrays.sort(names, Collator.getInstance(java.util.Locale.CHINA));
完整代码如下:
String[] names = {"张三", "李四", "王五", "赵六", "狂神", "阿超"}; Arrays.sort(names, Collator.getInstance(java.util.Locale.CHINA)); for (String name : names) { System.out.println(name); }
输出结果:
阿超狂神李四王五张三赵六