同步大数据的表

  接到一个需求,同步对方的18张表,而且还是视图。从程序端做。

首先写了另外一个jdbc的链接到人家的数据库读取视图。也就是我们程序同时连接2个不同的数据库。2个不同的jdbc.properties,2个不同的getconnection,2个不同的excuteQuery.等等。

但是光是读取一张180万数据的表,就内存溢出,结果集关闭了。存取数据的集合是JSONARRAY。于是我们跟业务联系,幸好别人只会修改2个月之前的数据,再以前的数据就会封账,即不会修改数据。还好我们能只取2个月的数据比较就行了。不过这也有十几万数据了......

我们想到了用多线程,因为他们的表没有主键ID(好坑啊!)。但是实际上测试的时候发现多线程并不能提高速度。这个问题很简单,你的瓶颈根本不在内存里的数据处理,而在于你的磁盘IO性能,所以多线程根本起不了什么作用,甚至会导致并发的IO操作而降低性能。 就好比你急着往一个U盘上拷五部电影,你五个文件都复制黏贴,五个对话框同时拷贝,说不定比你一个一个拷贝还慢。。。

于是我想到了比较结果集的方法。从jdbc底层入手。首先循环A结果集,遍历,如果B结果集包含A的对象a,A.remove(a);这是我试过效率比较高的方法。

if(!zhihua.equals(vip)){
//如果zhihua集合里面存在vip的集合,则直接过滤掉
for (Object object : vip) {
JSONObject djobject=(JSONObject)object;
zhihua.remove(djobject);
}
}

还有一种就是,A.removeAll(B).得到结果集A。这种jdbc自带的方法虽然简单,但效率不高。

if(!zhihua.equals(vip)){
//如果zhihua集合里面存在vip的集合,则直接过滤掉
zhihua.removeAll(vip);
}

于是解决同步的问题。其实这个量级我知道充其量也就是百万级的,上了百万就内存不足了。这个问题其实也是可以解决的。那是后话啦~~

你可能感兴趣的:(大数据的同步)