企图变秃变强的第一天
2020.7.22
好记性不如烂笔头
1.MyBatis-Plus之saveOrUpdate
我需要写一个保存/修改的接口,嗯,写呗,没人拦着你。 怎么写…
来自官网的注释:
/**
* TableId 注解存在更新记录,否插入一条记录
*
* @param entity 实体对象
*/
boolean saveOrUpdate(T entity);
//然后斗胆瞅一眼源码:
public boolean saveOrUpdate(T entity) {
if (null != entity) {
Class<?> cls = entity.getClass();
TableInfo tableInfo = TableInfoHelper.getTableInfo(cls);
Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!");
String keyProperty = tableInfo.getKeyProperty();
Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!");
Object idVal = ReflectionKit.getMethodValue(cls, entity, tableInfo.getKeyProperty());
return StringUtils.checkValNull(idVal) || Objects.isNull(getById((Serializable) idVal)) ? save(entity) : updateById(entity);
}
return false;
}
首先判断传入的实体是不是null,如果是null,哪玩完,上帝都救不了你,送你一个false,下次再来。然后断言TableInfo(数据库表反射信息)是true,如果是false,再下边是判断主键,如果false,丢给你一堆msg,说你没设置TableId,如果传了,就调它的update方法,如果没传,就调save方法。
2.Dubbo调用超时
今天遇到了Dubbo的consumer调provider超时的问题,Dubbo默认的调用时间默认是1秒,默认重复三次,如果一秒内返回不成功会报一个调用超时并打印日志,我百度了一下,大部分都是通过配置xml的形式,与我需要的不符,后来请教阳哥,最后决定在**@Reference**上设置timeout,格式是:@Reference(timeout = time),以毫秒为单位,刚刚看到一篇文章,简单列举了设置超时的优先级:
注解式>dubbo.properties中“dubbo.service”>xml中dubbo:provider >dubbo.properties中“dubbo.provider”
3.数据库表死锁
我在用postman做测试的时候,遇见了MySQLTransactionRollbackException: Lock wait timeout exceeded,第一次遇见这个,然后度娘搜,找了一下原因:当数据库在执行语句时,会把表锁住,直到commit 或者 事务失败导致回滚数据还用就是退出数据库用户 ,所以我觉得是我对数据库进行操作的时候,另一块代码也对改表执行了操作,由于并没有commit,所以出发了锁,由此我想到两个概念,乐观锁和悲观锁,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测。悲观锁是当要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。现在只看到了概念,还需要深入理解。
死锁的解决:
-- 查询有没有出现死锁的表
show open tables where In_use>0;
-- 查询出那个进程(id)是出现了死锁
select * from information_schema.innodb_trx;
-- 然后杀掉它
kill id;
-- 还有另一种语句是同样的作用
show open tables where In_use>0;
show processlist
kill id;
-- 经过尝试,个人觉得第一种方式比较好,以后可能就用第一种了,但是我不希望以后出现这样的问题了...
-- 不过用show processlist的好处就是可以查看状态等消息。
4.还有一个最重要的习惯:
一定要先想好再动手做,不然会返工。 先写文档 今日事,今日毕。别拖延 多听取建议
- Oracle压缩黑科技(二)—压缩数据的修改
- 在Pivotal Web Service上发布Spring Boot应用
- hdu---(1325)Is It A Tree?(并查集)
- spark2 sql编程样例:sql操作
- hdu----(1599)最大子矩阵(几何/dp)
- Go语言简单的TCP编程
- hdu---(1054)Strategic Game(最小覆盖边)
- Swagger Starter 1.4.0发布:新增swagger功能开源与全局参数的配置。
- Go语言语法汇总
- 整理的一些模版LCS(连续和非连续)
- 以太坊开发实战(第1部分:智能合约)
- spark2 sql读取数据源编程学习样例2:函数实现详解
- hdu---(4310)Hero(贪心算法)
- 数据库容器化|未来已来
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- elasticsearch-快速入门
- 数据库技术:JDBC,预处理对象,事务控制
- elasticsearch-DSL高级查询语法
- 数据库技术:XML
- 利用logstash将mysql多表数据增量同步到es
- 纯CSS实现自定义单选框和复选框
- 基于Linux安装Mysql5.7
- 纯CSS实现iOS风格打开关闭选择框
- 算法基础:递归
- ELK日志收集原理+es集群+elk搭建+本地目录文件读取,搭建分布式日志收集系统
- 什么是JavaScript 的闭包???
- es集群+elk搭建+kafka搭建分布式日志收集系统
- 设计模式(2)[JS版]---JavaScript如何实现单例模式?
- 算法基础:分治
- 黑客帝国中代码雨如何实现?用 canvas 轻松实现代码雨炫酷效果!