企图变秃变强的第一天

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.还有一个最重要的习惯:

一定要先想好再动手做,不然会返工。
先写文档
今日事,今日毕。别拖延
多听取建议

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值