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