数据同步问题?

今天我看别的论坛看到有人问如下问题:

该企业使用Oracle和SqlLite数据库搭配,终端用户方只能通过页面访问并更新Oracle数据库,所有最新的数据都在Oracle数据库里面。为了提高查询效率,该企业用SqlLite数据库作为缓存性质的中间介质,然后问我”如何通过SqlLite查询到Oracle的实时数据?“,我说了三个解决办法,一是需要程序员写程序的时候同时更新这两个库,二是使用类似Oracle GoldenGate的解决方案,三是不用SqlLite,使用缓存设置较小的过期时间,但还是会有延迟。对方说我的第一方案不行,因为这就成了两份同样的数据,第二个方案也不对,第三个方案不符合实时性要求。我说不这样做这个实时查询的功能实现不了啊,对方说可以做,而且他们已经做出来了。我马上虚心请教,对方态度较高傲,说这个不方便讲。

因为我对SqlLite也不熟悉,所以不好说什么。现虚心请教各位专家,这个东西是到底是怎么做的?真的能做出来么?

在了解缓存和数据库同步之前,先看看缓存的几种应用模式:
1.Write-through 立即写
2.Write-behind 后写 先写缓存,将写事件放入Queue,再写数据库
3. Eviction Policies 驱逐策略 缓存更新策略 直接删除缓存中数据,等下次读取时更新。
4. Replication 复制
5. Peer-To-Peer (P2P)

缓存更新我认为实际是CAP定理中的更新一致性问题,缓存和数据库实际是两处数据,相当于两个数据库,是一种分布式数据库的问题,一般这种更新同步在NoSQL中已经被整合入数据库内部机制,无需开发人员关心,可以借鉴的方式如:

1.Vector Clock ,通过一个时间戳机制能够实现更新之间的因果关系。

2.Gossip : 是一种在多服务器之间广播状态的P2P方式
每个节点选择其他一个节点通讯,对来自其他节点的信息标注时间戳。更新信息在多个这样节点轮回中进行通讯,以至于最终所有节点都更新到最新状态。

当然这两种适合大批单机之间快速同步,是一种最终一致性,如果需要严格的一致性,那么就需要牺牲分区性,可伸缩性会很差,特别是类似楼主这种缓存和数据库只有两个数据点同步,很多特殊性策略都可以使用,比如使用数据库触发引擎进行缓存更新等等。

但是根据我个人经验,每一种同步方式都有其弱点,都有在某种情况下不好使,让人抓耳挠腮情况。


[该贴被banq于2012-11-18 10:06修改过]

接触java开发一年多了,从同学那听到了jdon,说里面的人写的程序都有自己的思想.今特意注册,发达一下我这菜鸟的想法.
里面写程序一碰到问题就google,总想别人把代码贴出来,copy运行,测试没错就放到程序上,运用下班出去high.
现在觉得那些传授思想的人那值得尊敬.