【程序媛晒83行代码】认真工作的程序媛原来是这样,你想到了嘛?

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 据说认真工作的程序员魅力值加10,这段代码你能猜的出来嘛。

在中国程序媛中,他们的代码有什么样的魅力,Aone联合云栖社区、饿了么、钉钉、阿里云、天猫、口碑发起首届程序媛比码活动——不秀大长腿,秀高智商;不秀美图照,秀代码图,参与晒码互动游戏赢“83行代码”T恤!

我们来说说这群女工程师的第83行代码及代码背后的故事:
我是云效的全栈开发女工程师,朱默,花名:墨瑜。

据说认真工作的程序员魅力值加10:
b2e3cef0bcef172cade954da904bdfdcf1e29082
我的第83行代码来自云效RDC上某一功能的代码, 猜猜是哪个功能:

public class MysqlLockBuilder {
    private DataSource dataSource;
    private String mysqlTableName;

    private LockDataAccessor lockDataAccessor;

    private LockStateAccessor lockStateAccessor;
    private String defaultClientId;

    public void init() throws SQLException {
        MysqlLockDataAccessor mysqlLockDataAccessor = new MysqlLockDataAccessor();
        mysqlLockDataAccessor.setMysqlTableName(mysqlTableName);
        mysqlLockDataAccessor.setConnection(dataSource.getConnection());
        lockDataAccessor = mysqlLockDataAccessor;

        defaultClientId = IP.getIpAddr();

        lockStateAccessor = buildMysqlLockStateAccessor();
    }

    private LockStateAccessor buildMysqlLockStateAccessor() throws SQLException {
        MysqlLockStateAccessor lockStateAccessor = new MysqlLockStateAccessor();
        lockStateAccessor.setMysqlTableName(mysqlTableName);
        lockStateAccessor.setConnection(dataSource.getConnection());
        lockStateAccessor.init();
        return lockStateAccessor;
    }

    public String getDefaultClientId() {
        return defaultClientId;
    }

    public void setDefaultClientId(String defaultClientId) {
        this.defaultClientId = defaultClientId;
    }

    public TimedLock lockForAWhile(String lockId, int timeout) throws LockAccessException {
        TimedLock lock = new TimedLock(lockId, defaultClientId, timeout);
        try {
            lock.setLockStateAccessor(buildMysqlLockStateAccessor());
            lock(lock);
            return lock;
        } catch (SQLException e){
            lock.close();
            throw new LockAccessException(e);
        } catch (LockAccessException e) {
            lock.close();
            throw e;
        }
    }

    public ScopedLock lockWhenAlive(String lockId) throws LockAccessException {
        ScopedLock lock = new ScopedLock(lockId, defaultClientId);
        try {
            lock.setLockStateAccessor(buildMysqlLockStateAccessor());
            lock(lock);
            return lock;
        } catch (SQLException e){
            lock.close();
            throw new LockAccessException(e);
        } catch (LockAccessException e){
            lock.close();
            throw e;
        }
    }

    /**
     * 指定clientId,加时间锁
     * @param lockId: 锁名称
     * @param timeout: 加锁时长
     * @param clientId: 锁的持有者
     * @return
     * @throws LockAccessException
     */
    public TimedLock lockForAWhileByClient(String lockId, int timeout, String clientId) throws LockAccessException {
        TimedLock lock = new TimedLock(lockId, clientId, timeout);
        try {
            LockStateAccessor timeLockStateAccessor = buildMysqlLockStateAccessor();
            lock.setLockStateAccessor(timeLockStateAccessor);
            lock(lock);
            return lock;
        } catch (SQLException e){
            lock.close();
            throw new LockAccessException(e);
        } catch (LockAccessException e) {
            lock.close();
            throw e;
        }
    }

    /**
     * 刷新时间锁,延长加锁时长
     * @param lockingContext
     * @return
     * @throws LockAccessException
     */
    public Boolean refreshTimeLockByContext(LockingContext lockingContext) throws LockAccessException {
        if(lockStateAccessor == null){
            try {
                lockStateAccessor = buildMysqlLockStateAccessor();
            }catch (SQLException e) {
                throw new LockAccessException(e);
            }
        }

        return lockStateAccessor.refreshTimeLock(lockingContext);
    }

    /**
     * 手动解锁
     * @param lockingContext
     * @return
     * @throws LockAccessException
     */
    public Boolean unlockTimeLockByContext(LockingContext lockingContext) throws LockAccessException {
        if(lockStateAccessor == null){
            try {
                lockStateAccessor = buildMysqlLockStateAccessor();
            }catch (SQLException e) {
                throw new LockAccessException(e);
            }
        }

        return lockStateAccessor.timedUnlock(lockingContext);
    }

    /**
     * 根据锁id,获取时间锁信息
     * @param lockId
     * @return
     * @throws LockAccessException
     */
    public LockingInfo getTimedLockInfo(String lockId) throws LockAccessException{
        return lockStateAccessor.getTimedLockingInfo(lockId);
    }

    private void lock(Lockable lock) throws LockAccessException {
        try {
            lockDataAccessor.createIfNotPresent(lock.id());

            boolean locked = lock.lock();
            if (!locked) {
                throw new LockAccessException("Lock has been occupied");
            }
        } catch (Exception e) {
            throw new LockAccessException(e);
        }
    }

    public String getMysqlTableName() {
        return mysqlTableName;
    }

    public void setMysqlTableName(String mysqlTableName) {
        this.mysqlTableName = mysqlTableName;
    }

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public DataSource getDataSource() {
        return dataSource;
    }

}
AI 代码解读

与墨瑜小姐姐互动,为她打call——>点击进去墨瑜晒码

更多小姐姐,点击进入查看代码

有被代码耽误的钉钉吃货程序媛,写代码写到忘记吃饭的——采霜
她急需能把她从代码中叫醒去吃饭的小伙伴,赶紧勾搭;
http://yq.aliyun.com/roundtable/126499/answer/170319#visit170319


有以代码为乐的饿了么大前端打(bei)杂(guo)工程师——敖天羽
http://yq.aliyun.com/roundtable/126499/answer/170299#visit170299


还有全栈美女工程师——前端后端一锅端的——墨瑜女神
http://yq.aliyun.com/roundtable/126499/answer/170316#visit170316


还有阿里云活好码赞,像男人一样活着的技术专家小姐姐——清宵http://yq.aliyun.com/roundtable/126499/answer/170296#visit170296


和天猫Java程序媛,happy(被)来(逼)的——采月
http://yq.aliyun.com/roundtable/126499/answer/170354#visit170354


阿里口碑 搜索推荐组的JAVA女工程师——妍霏
http://yq.aliyun.com/roundtable/126499/answer/214059#visit214059


阿里口碑基础平台技术部的工程师-衔远,一个技术与马甲线并存的mm
http://yq.aliyun.com/roundtable/126499/answer/248798#visit248798

云栖社区聚能聊专家,具有知性温婉气质的——海洋的云http://yq.aliyun.com/roundtable/126499/answer/170290#visit170290

福州市五佰网络科技有限公司的Java女工程师——江小白太白
http://yq.aliyun.com/roundtable/126499/answer/189332#visit189332


在下*的程序媛——cn_suqingnian
http://yq.aliyun.com/roundtable/126499/answer/170309#visit170309


交通银行的前端女工程师——昆0830
http://yq.aliyun.com/roundtable/126499/answer/201979#visit201979

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
21416
分享
相关文章
程序员的恐惧之源---‘“改需求”
【5月更文挑战第21天】程序员的恐惧之源---‘“改需求”
学Python静不下来,看了一堆资料还是很迷茫是为什么
学Python静不下来,看了一堆资料还是很迷茫是为什么
68 2
学Python静不下来,看了一堆资料还是很迷茫是为什么
干了这碗“美丽汤”,网页解析倍儿爽
HTML 文档本身是结构化的文本,有一定的规则,通过它的结构可以简化信息提取。于是,就有了lxml、pyquery、BeautifulSoup等网页信息提取库。一般我们会用这些库来提取网页信息。
高薪程序员的三大窍门,你准备好了吗?
“高薪,月薪过万”已经成为人们对于程序员的刻板印象,但实际上对于二三线城市的码农来说,月薪过万似乎仍然是一个难以达到的目标。地理位置、房价以及升职加薪等问题让程序员陷入了薪资困境。作为一位程序员,若想获得自己理想的工资水平,需要具备哪些要素呢?
一个程序员的中秋节碎碎念
2022 年中秋节非常特殊,和教师节同一天。 在这个特殊的日子里,谈谈我的中秋仪式感,中秋计划怎么过,并谈谈自己的一些收获和感悟。
277 0
一个程序员的中秋节碎碎念
程序人生 - 程序员要学点儿理财知识,而不仅仅是代码技巧
程序人生 - 程序员要学点儿理财知识,而不仅仅是代码技巧
147 0
程序人生 - 程序员要学点儿理财知识,而不仅仅是代码技巧
听说你情人节没人陪,这不我来给你介绍对象啦
听说你情人节没人陪,这不我来给你介绍对象啦
241 0
听说你情人节没人陪,这不我来给你介绍对象啦
学编程的 3 个正经建议,学弟学妹们记得收藏呀,这波赚大发了!
学编程的 3 个正经建议,学弟学妹们记得收藏呀,这波赚大发了!
162 0
工作五年“攒”够100万,程序猿们,我可没开玩笑!8条建议抱走不谢
对于一个刚刚工作几年的程序员来说,拥有100万人民币存款却是一个看似难以实现的目标,然而只要作为程序员合的你们做好合理的规划,这个目标是不难实现的,而且当五年过去之后,你可能发现你不止拥有了这100万存款,还提升了自己的“财商”。程序员如何实现工作五年“攒”够100万,本文就给你细细道来。
7131 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等