(C#+MSSQL 2008) 关于委托性质的数据监控和数据运算同步

需求大致是这样的:现在有一台 A服务器 和 ERP服务器,系统中存在一套算法,在某个模块被运行的时候(ASP.NET)会根据A服务器和ERP服务器的数据跑一遍这个算法,得到我们想要的数据。(MSSQL 2008)
但是这样有个问题,因为数据的不断积累,运算会变得越来越慢,而且每次运行相关模块都会需要跑一整套算法,效率很低。

现在想要对这个模块进行整改。

要求是
尽量小的修改现有业务逻辑的代码,因为代码量很大,数据也很多。曾经做过期初,但效果不明显;
数据必须是实时的,前后差不能超过10秒;
尽量高的性能和可靠性;
数据系核心业务数据,可靠性高于性能。

环境:
方案(ASP.NET)环境是.NET FRAMEWORK 2.0
数据库是MSSQL 2008

我初步的想法是在A服务器的库和ERP服务器的库,那些与业务相关的表有增删改查操作时,用C#写监控配合MSSQL触发器,将增删改查的详细操作和运行算法的最后结果写到另外两个表中,用户看到的最终数据以这两个表为准。

这样问题就变成:A ERP B三个服务器 Aa ERPa Ba三个数据库的跨服务器跨库的数据同步(其实不能算同步,算是数据运算的后的结果和详细记录。)

我现在没有什么思路,其实就是想的用winform或者wpf写一个多线程监控,timer,在mssql中写触发器,方案中写service,配合实现。但是这样很麻烦,工作量很大,而且用timer的性能损耗也不会低。
A服务器a表 同步到B服务器a表,运算到B服务器b表。
这样唯一的好处就是数据实时性凑合,不需要对现有代码做大的改动。

不知道大家有什么好的实现方法?给个思路也行!!!

是谁讲的不可以,用.NET平台搭建C/S三层架构.
1. 创建连接数据库类,和异常捕捉类库生成系统dll
2. 创建软件逻辑层,运算类和应用层的衔接
3. 关键在与创建表示层,以窗口或者网页的形式创建数据库服务器的终端.在这个终端里你可以把变量作为指针来操作数据库.
比如你可以自定义一个删除、更新选定数据表的动作.三个服务器也完全可以同步,有很多办法,比如OpenDataSource可以做到,ODBC、JDBC都可以做到.我这里介绍一个最简单的.
利用ACCESS软件的ODBC库同步操作远程N个服务器上N个表:
用C#举例,在类中写连接代码,连接相对路径ACCESS数据库,ACCESS建好就取个名字放在应用程序相对目录下,C#就连接一个空的ACCESS数据库,我是要把他作为工具来用.
using System.Data.OleDb;
....
//类里写
Public void Link(string i)
{
OleDbConnection A =new OleDbConnection();
A.ConnectionString=i;
try{A.Open();}
catch{A.Close();}
finally{A.Close();}
}
//窗体里先引用类库,再调用类
String C;
C="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +System.Widows.Forms.Application.StartupPath+ combBox1.Text.Trim();
//组合框里放的就是ACCESS数据库名称
类库名.类名 D =new 类库名.类名;
D.Link.(C);
//这就连接上了ACCESS数据库,下面用他的ODBC功能连SQL,跨三个库SQL语句要拼接,
String tb1, tb2, tb3, sql;
//定义三个变量,就把他们当成拼接语句里的查询表名称
tb1="(Select * from A表名称 IN [ODBC][ODBC;Driver={SQL Server};uid=sa;pwd=111;DataBase=A服务器]) As 查询1"
tb2="......"
tb3= .......
//看到没,我用到了ACCESS的ODBC连接表功能,三个在不同服务器上的不同的表可以同步在一个SQL语句里执行操作
//我还需要在类库里写拼接字符串的规则,拼接字符串是要插入查询?是要删除数据?是要...都要写好函数,在应用程序里调用函数,把窗体上的控件作为变量参数就可以操作函数进行数据库维护.淡然你也可以模拟ACCESS的查询设计器,同过拖放自定义控件用方法参数传值去响应函数过程.从而简单地进行维护数据库操作.我没时间去写类库.直接写SQL语句给你看吧:
sql="Select From " + tb1 + " Inner Join ((Select * from " + tb2 + ") Union (Select * from " + tb3 + ")) ON 查询1.列名=查询2.列名 Where ((查询1.列名) Is Not Null)";
看到没,我这句意思其实很简单,就是查询ERP数据库表和B数据库表联合后的总表 ,让他去匹配查询A服务器里的表.我这个例子是要做一个查询.最主要的是对数据库的操作,你同时更改几个数据库数据完全可以啊.
//维护起来还是不方便,所以我上面要你写三层结构,你要写这个运算字符串和操作异常处理的逻辑.SQL语句写好后我就操作他了,.NET后续操作正常进行.
//让他显示出来刚才的查询看一下效果
DataSet s = new DataSet();
OleDbDataAdapter t =new OleDbDataAdapter(sql,C);
t.Fill(s,"查询范例");
//拖一个dataGridView看一下数据
dataGridView.RecordSource=s.Tables[0];
//这样你看一下是不是跨了服务器查询到了数据库数据,并且对他们进行了同步关系查询.
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-19
1、给需要频繁查询的表增加索引,提高检索速度;
2、分表,按照设备或者日期纵向、横向分解;
3、优化算法,压榨CPU的微秒级资源;对整体架构也无影响;追问

但是这样随着数据量的累积,还是会越来越慢的。
这个怎么解决?我想的是,随着业务产生的时候,就开始记录、计算。
所以想用触发器和多线程监控。

追答

看你的算法里是不是用到了日积月累的这些数据,否则数据增量不会影响算法的性能。

追问

肯定用到了,所以我才想着每次增加/修改/删除数据的时候都会把详细信息和结果计算到另一个表。

本回答被提问者和网友采纳
相似回答
大家正在搜