暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

crud怪

在下uptown 2021-09-12
1056

闲聊

最近帮人写了个定时访问api把数据持久化到数据库的小服务,还挺有意思,记录一下,简单说下需求,其实就是第三方提供一个API接口,通过不同的门店id去获取对应的订单数据,然后每天定时同步。

听起来简单的一比,做出来其实也挺简单,不过要做好还是有点难度的。

maven引入外部jar包部署服务

首先第三方也是搞人心态,提供个加密算法和签名只提供个jar包,还不放maven里,所以得引入本地的下载回来的jar包。

本地开发直接引入,用工具是可以直接跑调用是没问题的,这里可以用maven的一条命令直接把本地的jar包打到本地仓库里

mvn install:install-file -DgroupId=com.uptown -DartifactId=xxx_sdk -Dversion=1.0-SNAPSHOT -Dpackaging=jar -Dfile=E:\uptown\uptown.jar

但是部署服务的时候就会发现打不出jar包来,项目能跑,但是到关键的调用sdk的时候就爆ClassNofFoundException错误。

看了很多网上的帖子,很多都说用plugin 中resource来弄,对我的项目一点鸟用也没有。最后还是在stackoverflow上找到了答案。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <configuration>
        <source>${java.version}</source>
        <target>${java.version}</target>
        <encoding>UTF-8</encoding>
        <compilerArguments>
            <bootclasspath>${java.home}/lib/rt.jar</bootclasspath>
        </compilerArguments>
    </configuration>
</plugin>

其实就是pom里打包插件那配置下外部jar包引用。就完美解决了。

数据持久化效率

大约有150个门店,然后每次同步要看前7天的,这样下来光请求api的耗时就将近半小时,还不算入库。

于是起了一个核心线程20个的线程池去并发请求api数据入库。部署之后发现总有这么几条错误日志。

com.*.OrderDetailMapper.updateById
(batch index #2) failed. 
1 prior sub executor(s) completed successfully, 
but will be rolled back. 
Cause: java.sql.BatchUpdateException: 
Deadlock found when trying to get lock

原因也很清晰,死锁了,但是为啥会死锁呢,时至今日我还是没想通,每一个线程都相当于有数据隔离,按理说不会有啥互相占有的情况。

感觉跟数据库写锁有关,但又没有啥证据。很焦灼,不过数据应该不会丢,因为在晚上11点又设置了全量同步检查没有更新或数据不一致的情况。

等一波看有没有人发现这个问题,发现了我准备改成用countdownlatch
请求api,拿到所有的数据之后再入库。这回肯定死锁不了了。

看了那么多八股文,遇到个实际问题依然只限于纸上谈兵,真尴尬呐是真尴尬。。。。


文章转载自在下uptown,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论