概述
同步数据不外乎两种方法:一是通过对方ERP提供的API接口直接操作数据库,二是通过中间库的形式同步数据库,可想而知最好的办法是第一种,第二种方法我们采取每一分钟读取一次的方法,会有时间误差,且开销也比较高。由于某些特殊原因我们暂且采用了第二种方法同步数据,基本流程如上图所示,要匹配供应商的数据库,把数据拿到我本地进行操作,供应商那边分出了一个中间库给我们操作,对方只提供商品的基本信息,存在四个表中,并且有一个时间表用于比较他是否更新了数据,如果他更新数据则会改变基本表中的时间戳,此时时间会比时间表中的时间大,当我们此时比较式就会查出最新的数据,抽取出来根据特定字段同步到本地数据库中。在于本地大库的数据匹配,添加上其他字段形成可以使用的展现表。
技术方面我们采用定时器方法,固定时间内抓取数据,定时器方案如下代码所示:
<span style="font-size:14px;">new Thread(){
public void run(){
Connection conn = null;
try {//由于对接的供应商数量还不确定,我们采用jdbc动态数据源的方式操作对方中间库
conn = DBUtils.getConnection(url, user, password, driverName);//获取中间库Connection
} catch (SQLException e) {
e.printStackTrace();
}
Map<String, List<?>> ysbDB = synchronizeDBService.getYsbDBEntity(sqlMap, conn);//获取中间库数据
Map<String, List<?>> tempTableId = synchronizeDBService.getTempTableId(suId);//获取大库数据
//内存中比较中间库数据和本地临时表,临时表中没有此商品则添加,由此商品则修改。
Map<String, Map<String, List<?>>>
saveOrUpdateEntity = verSaveOrUpdate(ysbDB,tempTableId);
boolean result1 = false;
boolean result2 = false;
//插入需要插入的数据
result1 = synchronizeDBService.insertToTempTableOneByOne(saveOrUpdateEntity.get("insert"),suId);
//修改需要修改的数据
result2 = synchronizeDBService.updateToTempTable(saveOrUpdateEntity.get("update"),suId);
if(result1==true && result2==true){
Connection conns = null;
try {
conns = DBUtils.getConnection(url, user, password, driverName);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//如果修改插入都正确了,则修改中间库的时间表,更改时间为最新事件,中间库基本表没有修改则基本表中的时间比时间表的早,则下次插入修改不会有数据
synchronizeDBService.updatedate((new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(new Date()),conns);
}
}
}.start();</span>
上段代码是定时器中的主要逻辑,关于定时器如何配置和使用,我在其他文章中有详细介绍,我采用的是Spring + quartz定时器方案。
最后
以上就是凶狠香烟为你收集整理的多线程、quartz 定时器同步两个数据库,匹配数据表流程和详情的全部内容,希望文章能够帮你解决多线程、quartz 定时器同步两个数据库,匹配数据表流程和详情所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复