数据传输需求:
将A服务器的Oracle数据库数据(注,该表的数据量巨大,检索都比较慢,不考虑再优化),抽取符合要求的数据通过网络传输到异地的B数据库服务器。那么如何保证数据传输的正确性,可靠性呢?
根据理解,主要有以下几点需要关注的问题:
1、直接从A服务器抽取数据通过网络传输到B,由于整个过程花费时间过长,容易导致Session失效,不合适。
2、整个过程任意一个过程发生异常,处理起来比较复杂,无法或者说很难准确定位异常的发生的具体时间和具体的数据。
3、B服务器入库过程中,如果需要检查数据的重复性,也是额外的时间消耗。
4、整个过程不能在一个事务中完成,否则,就会出现2的过程。
5、其它问题,无法保证数据的可靠性、有效性;即使能够保证也要花费较大的代价(时间、空间)去完成。
解决方案:
根据要求,我们可以将整个过程分为五个阶段,各个阶段都相对独立,只有少量的数据交互。
通过上图,我们增加临时表和缓存技术,
整个过程是清晰的,透明的。
具体的实现:
三、具体的实现
1事务一:A服务器数据表到临时表的过程,如下图所示(这里,我们将下面的从原始表到临时表的状态定义为“OtoT”——Origine to Temp):
2事务二:A临时表到服务端缓存的过程,如下图所示(这里从临时表到缓存的计数器定义为TtoC——Temp to Cache):
在临时表取数据的过程中,通过参数设置可以定义批次的数据量,假设定义的数据量为100,那么每次从临时表取100条数据,并压缩成一个byte[]数据流。计数器是按照byte[]的个数决定的,而非原始数据100决定。
3事务三:A端缓存到B端缓存过程如下图所示(B端缓存的计数器为CtoC):
4事务四:B段缓存到B端临时表的过程如下图所示:
5事务五:B临时表到目的表过程如下图所示(这里,我们将下面的从临时表到目的表的状态定义为“TtoT”——Temp to Target):
转载请注明:www.blog.csdn.net/coolwzjcool