Mongo数据进入Mysql功能开发
临时中午接到任务,需要开发该功能。所以编码直接写流程了。
首先来看问题:
![](https://wx4.sinaimg.cn/large/005A3Hwygy1fiuxfpq9utj30q30fmdi8.jpg)
所以,我们定位日志文件:
![](https://wx1.sinaimg.cn/large/005A3Hwygy1fiuxg3tzz7j30hd01d3yj.jpg)
已经卡主好几天了,看来需要重新开发了。
所以,我们定位问题,在crontab任务里面:
![](https://wx2.sinaimg.cn/large/005A3Hwygy1fiuxhjfncej30qf07e0t2.jpg)
代码jar位置:
![](https://wx4.sinaimg.cn/large/005A3Hwygy1fiuxrenk8ij30ly04ggm3.jpg)
也不用反编译了,我们定位到svn代码为止,导入ide开发。
对了,在此之前,我们先来看一下报错:
![](https://wx2.sinaimg.cn/large/005A3Hwygy1fiuxuguh7hj30ek07cdg9.jpg)
我们more一下,看看
![](https://wx1.sinaimg.cn/large/005A3Hwygy1fiuxvupsjmj30vc02kt8x.jpg)
乍一看还没怎么看懂,至少当时我是指定为到两个原因的虽然后来都被我猜对了:
1.数据源问题,数据源有脏数据
2.目标数据库表字段没有对上
那好,本着这两个目的,我们需要追踪问题了。
那么首先我们要准备数据源,先发邮件给dba要目标源表结构,然后弄到本地吧。
![](https://wx4.sinaimg.cn/large/005A3Hwygy1fiuylsicjgj30jy09tdgs.jpg)
放到本地mysql里面,执行
![](https://wx2.sinaimg.cn/large/005A3Hwygy1fiuymhe5c2j30ip05sgm0.jpg)
这是我们将来的目标表。按照
![](https://wx3.sinaimg.cn/large/005A3Hwygy1fiuynnpdj2j30me04cjrt.jpg)
制作本地开发环境。
现在要给mongo库准备数据了。
/opt/mongo/db/bin/mongodump --host 127.0.0.1 --port 27010 --db new_market_report --collection apk_cnt_pvuv_ch -q '{"dt":{$gte:"2017-08-18",$lt:"2017-08-25"}}' --out ./tmp/20170824/
再导入:
/home/mongo/bin/mongorestore --port 27019 -d new_market_report -c apk_cnt_pvuv_ch /home/mongo/bin/tmp/20170822/new_market_report/apk_cnt_pvuv_ch.bson
db.pdc_status.remove({"status_code":"OK"});
/opt/mongo/db/bin/mongodump --host 127.0.0.1 --port 27010 --db new_market_report --collection pdc_status --out ./tmp/20170824/
/home/mongo/bin/mongorestore --port 27019 -d new_market_report -c pdc_status /home/mongo/bin/tmp/20170822/new_market_report/pdc_status.bson
操作mongo数据库:
一般两部,用mongodump来将正式数据导出,然后使用mongorestore导入测试库。
![](https://wx4.sinaimg.cn/large/005A3Hwygy1fiuypzpp41j30zo06raao.jpg)
这里,注意我们有有一哥参数:-q '{"dt":{$gte:"2017-08-18",$lt:"2017-08-25"}}'
就是所需要的结果查询区间。所有的数据太多了。这里我们要记住这两个表:
1.pdc_status
2.apk_cnt_pvuv_ch
后面解释这两个表,先存着。知道一个是主表,另一个是流程表即可。
![](https://wx1.sinaimg.cn/large/005A3Hwygy1fiuyt9djv7j30u202jjrj.jpg)
先看这个,pdc_status里面的,对流程定义已经到了18号了。后面详细说。
到此我们开发环境已经搭建好了。
svn代码:
好了,down下来。
![](https://wx4.sinaimg.cn/large/005A3Hwygy1fiuy00u6laj30ry0i5408.jpg)
我们调用ReportDataMultiThread来处理数据,将mongo数据库集运送到mysql,反推送结果数据。
也请注意,这里其实已经做了多进程创建,只需要参数提供即可。当然,默认做一天即可。那你可能会问,我怎么保证报错重跑,不要急,我们可以交给流程表。
工作流的两个核心表:流程定义表;流程表。
这两个即可完成基本的工作流,这里也一样,我们用这两个基本的思路即可。
![](https://wx4.sinaimg.cn/large/005A3Hwygy1fiuy6315p7j30nl0dl3zx.jpg)
我们拿utils类,取得024,即流程定义类型,这个tools的utils常量类,就相当于流程定义表的功能,提供流程定义,然后我们看,注释写的很清楚,拿到这个024的流程,可以看到
![](https://wx1.sinaimg.cn/large/005A3Hwygy1fiuy972rqvj30u201m0sr.jpg)
可以看到,mongodb里面,这条数据做了流程控制,当前staus_code 为start,表示,数据跑了没有跑完,跑完为ok。"status_dt" : "2017-08-18"表示,流程到了18号,前面已经搞定了,后面还没有。
![](https://wx1.sinaimg.cn/large/005A3Hwygy1fiuy5p9h61j30ka07sgm3.jpg)
这里,我们打印sql,
![](https://wx2.sinaimg.cn/large/005A3Hwygy1fiuyeljaxaj313s020dfz.jpg)
拖到navicat里面:
![](https://wx2.sinaimg.cn/large/005A3Hwygy1fiuyfbdv2mj311106ddgd.jpg)
豁然开朗了,熟悉了。和日志里面报错一样的。那我们:
改成 PreparedStatement prestmt = conn.prepareStatement("select banks from loan where loan_type=?");
prestmt.setString(1,loanType);
直接拼sql 语句是不规范的,会有sql注入攻击。试想一个应用的包名,叫:“drop database;”
只要思想不滑坡,办法总比困难多
![](https://wx1.sinaimg.cn/large/005A3Hwygy1fiuyi3ynlaj30u3070dgf.jpg)
预编译一下就没问题了。
![](https://wx1.sinaimg.cn/large/005A3Hwygy1fiuye92mt3j312j03k74q.jpg)
会被转义,ok。对了说一下数据源,如果打包千万别搞错了。
![](https://wx1.sinaimg.cn/large/005A3Hwygy1fiuyjlj6phj30nq09ngmr.jpg)
然后打包:
![](https://wx1.sinaimg.cn/large/005A3Hwygy1fiuyk2bm8bj30hd0fa0u1.jpg)
堡垒机操作,右键ftp选择用户
![](https://wx2.sinaimg.cn/large/005A3Hwygy1fiuykmhk26j30tj0ca3zg.jpg)
做好备份,提交之后:
![](https://wx2.sinaimg.cn/large/005A3Hwygy1fiuyvb70tgj30jw06fjrz.jpg)
一步一步
![](https://wx3.sinaimg.cn/large/005A3Hwygy1fiuyvrxee7j30ta0e1gnw.jpg)
ok了,这就搞定了,完工。
接下来,要从无到有,开发一个解放运营的功能,就是自动给入参数,查询mongo发送邮件到朋友的邮箱。这个预计下周开发完毕,到时候,也可以做代码分享和设计分享。