现在有程序A,该程序负责采集和计算数据,然后定时将数据保存到数据库。
程序B,根据需要定时从数据库取程序A保存的数据用来显示。
程序C(web),根据需要定时从数据库取程序A保存的数据用来显示。现在为了提高效率,想改掉通过数据库传递数据的方式,重新设计一下程序的架构,大家有什么好的建议???现在使用数据库方式的缺点:
1、当只有程序A运行时,程序B、C不运行,程序A定时保存数据没有必要,浪费系统和网络资源。
2、当数据库中保存的数据没有变化时,而程序B、C还是定时从数据库读取数据,浪费系统和网络资源。
新的架构应该实现的功能:
1、当程序B、C向程序A取数据时,程序A才将数据发送到B和C。
2、当数据变化时A,才将数据发送到B、C,而不是定时将数据发送到B、C。
3、程序A能根据程序B、C各自需要的数据不同,将不同的数据发送到B和C,而不是将全部数据发到B和C。
4、考虑到扩展性,当以后增加了程序D、E、F时,程序A的接口不需要要变化,也能将数据发送到D、E、F。
希望大家多提宝贵意见,谢谢大家了。

解决方案 »

  1.   

    分布式异构系统的数据传输,可考虑使用MSMQ.
    对你的需求不是很清楚,不好有定论。
    使用MS SQL 2005的扩展存储过程和触发器来监控数据表数据的变化情况并发消息到MSMQ
    其它程序通过Receive消息队列而获取变化了的数据情况。
      

  2.   

    其实我这就是一个简单的数据采集监控系统。程序A负责采集和监控数据。程序B、C作为监控机根据需要监控采集数据的变化。而且数据量有时会很大。
      

  3.   

    为了避免大量数据的反复读写,建议在A采集的同时将数据发送到MSMQ,其它系统不需要再从数据库中获取数据,这边传到MSMQ的数据是指及时的数据,如果需要历史记录,可开发数据库接口让其它程序调用
      

  4.   

    public interface ISendData
    {
       void SendInformation(object data);
    }public interface IGetData
    {
       object GetInformation();
    }A:IGetData要发送的对象B,C:IGetDataB,C获取数据调用IGetData接口注册多个对象
    Hashtable[key(对象.GetType().FullName()]=对象;批量发送
    将注册的对象调用ISendData其它方法(减少网络传送,不影响B,C等要发送数据到程序的方法)
    将ISendData去掉
    public interface IDataProcessor
    {
        object GetInformation(object sender);  //将对象A当参数调用,整理好此对象要发送的数据返回
        void SendInformation(object data);   //将整理好的数据调用发送方法(网络传送或其它处理)
    }您可以B,C其它扩展对象实现IDataProcessor对象,也可以做对应的对象来完成,但注册时两者名称相同而且唯一。

    B对应写一个类BDataProcessor:IDataProcessor
    在SendInformation(object data)方法中将数据发送给B程序,但注册时B对象有Name与BDataProcessor.Name属性相同值。
    扩展可以通过配置文件的方法将BDataProcessor,CDataProcessor..等等类注册到主程序中。