数据同时存到两个数据库(200分)

  • 主题发起人 主题发起人 ABLE
  • 开始时间 开始时间
A

ABLE

Unregistered / Unconfirmed
GUEST, unregistred user!
用D4作了一个基于DCOM的3层应用程序,
为了防止数据库故障(也有可能是通讯线路故障或应用服务器程序非正常终止)导致系统瘫痪,准备在系统中应用两个数据库(内容应该保持一致);
每次保存数据时,要分别写相同的数据到两个库中,这样即使一个库有问题,还可以保证切换到另一个继续工作。
现在的问题是:
1.工作中怎样检测通讯线路故障?或应用服务器程序非正常终止?或数据库故障?(try except end不能识别这些错误类型吧?)
2.怎样实现写相同的数据到两个库?写数据库触发是否相对容易实现?
我感觉直接在程序里控制不方便(例如:前台录入了新数据,首先ApplyUpdates到中间层,此时再往第二个库中ApplyUpdates,这样没有意义,因为系统认为更新的数据已经提交,所以不会对第二个库有所动作)
说了罗里罗嗦一大堆,希望那位大虾能帮助解决,多谢!
 
2: 如果是SQL Server7,可利用它的复制功能.
 
用的是Oracle8.0.5
并且,即使是SQL Server7有复制功能也没帮助,
因为我有一个中间层,为了提交到数据库中,必须走两步:
1.ApplyUpdates到中间层,此时将数据暂存在中间层,而没有保存到库
1. 调用中间层提供的ApplyUpdates,此时才将数据存入库中;
为了存入2个库,只能先存1个,再存另1个
那么存完第一个后(注意,此时是第一步,即仅仅存到了中间层),
再次ApplyUpdates到第二个,可是系统Apply什么哪?因为他认为已经Apply完了嘛?!所以这时Apply,只能是空,问题就在于次!!
 
如果不嫌煩的話,可以在beforeupdaterecord中寫段代碼,捕獲每條要保存的記錄,
這樣你想寫多個地方都可以.最后把applied:=True.
 
也许要换一下思路了,否则没有好办法.
 
先更改后台数据库,得到确认后,
再更改前台
否则报错
 
你这样做增加了客户端的工作量,会影响到系统性能,还增加了通讯量。
甚至还有一个更大的隐患:这样更新两次,只要任何一个数据库更新失败,
系统就会报错,而不是起到增加安全性的作用。实际上是把程序可靠性降低了。
我个人觉得还是在后台数据库中使用Trigger比较好。让数据库做
自动更新的工作。这样效率是最高的。也安全些。
 
你需要改变以下思路
同时写入两个数据库
关键是写入处理会变的很麻烦
很多东西需要手工处理
 
我现在使用的方法是:在应用服务器上实现一个函数,
由它来负责写入两个库
 
还是我那条看法:不论你在哪儿更新两次,只要任何一个数据库更新失败,
系统就会报错。没有起到增加数据安全的作用。实际上是把程序可靠性降低了。
感觉还是用数据库自己带的同步功能比较好。同步由数据库自己来完成,
减低工作站的负载,效率、安全都可以兼顾到。
 
用Delphi5吧。
在中间服务器处理这个函数。
 
我现在也有这个问题,现有的见过的解决方案是另外写一个数据库代理程序,
负责把每一个提交给数据库的操作向两个数据库提交.
但是这种办法对网络连接要求很高,其实最好还是用磁盘阵列做数据库服务器.
 
用中间表的方法可以吗?
操作时用中间表,最后提交时再从中间表读出分存两个库
 
我目前的做法是:
1。前台把数据暂存到中间层
2。中间层实现一个函数,将这些暂存的数据更新到一个库
3。中间层再Apply暂存的数据到这些数据被请求出来的那一个库
 
有这样专用的系统,好象是ibm的叫什么“海狼”的集群技术,
可以实现实时热备份(应该是接管了i/o),并且在发生故障
时保护环境然后自动转换到另外的一台机器上去,是一两年前
的一次ibm的产品发布会上听到的
 
1:将TRY的范围内放入连接即
try
SocketConenction.Active:=True;
expect
...
...
2:通过数据库去实现吧!现在很多数据库都可以这样做的了。
 
你的数据存贮没有用存贮过程吗?
在数据保存时用存贮过程不就解决了吗?
管它是在那实现,这样还能解决两个数据库的数据完全一致。
 
基于效率的问题,应该通过数据库或系统提供的功能进行实现,
例如前面说的SQL Server或IBM的技术,才能达到要求.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
730
SUNSTONE的Delphi笔记
S
后退
顶部