前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >企图变秃变强的第一天

企图变秃变强的第一天

作者头像
关忆北.
发布2020-10-15 15:51:23
1.1K0
发布2020-10-15 15:51:23
举报
文章被收录于专栏:关忆北.关忆北.

2020.7.22

好记性不如烂笔头

1.MyBatis-Plus之saveOrUpdate

我需要写一个保存/修改的接口,嗯,写呗,没人拦着你。 怎么写…

来自官网的注释:

代码语言:javascript
复制
    /**
     * 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,所以出发了锁,由此我想到两个概念,乐观锁和悲观锁,乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测。悲观锁是当要对数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发。现在只看到了概念,还需要深入理解。

死锁的解决:

代码语言:javascript
复制
-- 查询有没有出现死锁的表
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.还有一个最重要的习惯:

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-07-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2020.7.22
    • 1.MyBatis-Plus之saveOrUpdate
      • 2.Dubbo调用超时
        • 3.数据库表死锁
          • 死锁的解决:
        • 4.还有一个最重要的习惯:
        相关产品与服务
        数据库
        云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档