数据实时监视如何实现最小资源消耗?

pfworld 2010-05-05 05:17:28
数据实时监视发现有三种方法:
(1)timer
(2)Socket
(3)Sql 触发+Dll

请问 2、3如何实现?或者大家有别的方法?
...全文
348 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
pfworld 2010-05-24
  • 打赏
  • 举报
回复
再次UP一下!!想多了解大家的解决方案!!
pfworld 2010-05-20
  • 打赏
  • 举报
回复
再次UP一下!!想多了解大家的解决方案!!
afeng124 2010-05-19
  • 打赏
  • 举报
回复
我说一下第3种的实现方式,我的例子是sql server 的。使用了扩展存储过程.

-----------------------------存储过程调用COM+组件-------------------------------
ALTER proc Proc_SendMsgToClient(@MsgContext varchar(4000))
/*
使用COM+发送局域网广播消息
@MsgContext varchar(4000) 消息内容
返回值: Send Message OK.表示发送成功
*/
as

DECLARE @object int
DECLARE @hr int
DECLARE @property varchar(255)
DECLARE @return varchar(255)
DECLARE @src varchar(255), @desc varchar(255)

EXEC @hr = sp_OACreate 'SQLInterop.RMSMessageSendCOM', @object OUT
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
RETURN
END

EXEC @hr = sp_OASetProperty @Object, 'MsgContext', @MsgContext
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
RETURN
END


EXEC @hr = sp_OAMethod @object, 'SendMsgToClient', @return OUT
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
RETURN
END
PRINT @return

EXEC @hr = sp_OADestroy @object
IF @hr <> 0
BEGIN
EXEC sp_OAGetErrorInfo @object, @src OUT, @desc OUT
SELECT hr=convert(varbinary(4),@hr), Source=@src, Description=@desc
RETURN
END
-----------------------------------C#写的COM+组件-----------------------------------
using System;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Net;
using System.Net.Sockets;
using System.Text;

[assembly: AssemblyTitle("Shining Res Msg Server")]
[assembly: AssemblyDescription("Msg Server")]
[assembly: AssemblyVersion("1.0.0.1")]
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("MsgSendKey.snk")]
namespace SQLInterop
{
public interface IResMsg
{
string SendMsgToClient();
}

[ClassInterface(ClassInterfaceType.AutoDual)]
public class RMSMessageSendCOM : IResMsg
{
public string MsgContext = "";
public string SendMsgToClient()
{
//初始化一个Scoket实习,采用UDP传输
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
//初始化一个发送广播和指定端口的网络端口实例
IPEndPoint iep = new IPEndPoint(IPAddress.Broadcast, 6888);
//设置该scoket实例的发送形式
sock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
IPHostEntry ipHost = Dns.Resolve(Dns.GetHostName());
IPAddress ipAddr = ipHost.AddressList[0];
//string msg = Encoding.GetEncoding("GBK").GetString(buffer,0,buffer.Length);
byte[] buffer = Encoding.GetEncoding("GBK").GetBytes(MsgContext);
sock.SendTo(buffer, iep);
sock.Close();
return "Send Msg OK!";
}
}
}
--------------在数据库表的触发器里调用存储过程,通知其他程序数据已经改变------------------

ALTER TRIGGER [Tgr_SendMenuChgMessageToPOS] ON [dbo].[RMSMenu]
FOR UPDATE,INSERT
AS

declare @MessageText varchar(4000)
declare @TmpStr varchar(100)
declare @MenuID varchar(10)
DECLARE @MenuIDSTR varchar(4000)
declare @cnt int

select @cnt = count(*) from inserted
if @cnt = 0
begin
select @cnt
return
end
select @TmpStr ='3|all|192.168.0.198|update+1+['


select @MenuIDSTR=''
declare Cur_Meunu CURSOR FOR select MenuID from inserted
OPEN Cur_Meunu
FETCH NEXT FROM Cur_Meunu INTO @MenuID
WHILE @@FETCH_STATUS=0
BEGIN
if @MenuIDSTR=''
SELECT @MenuIDSTR=@MenuID
else
SELECT @MenuIDSTR=@MenuIDSTR+','+@MenuID
FETCH NEXT FROM Cur_Meunu INTO @MenuID
END
CLOSE Cur_Meunu
DEALLOCATE Cur_Meunu

if @cnt<50
begin
SELECT @MessageText = @TmpStr+@MenuIDSTR+']'
exec Proc_SendMsgToClient @MessageText
end
else
begin
--需要更新的菜品太多,通知更新全部
exec Proc_SendMsgToClient '3|all|192.168.0.198|update+1'
end



Forrest23 2010-05-17
  • 打赏
  • 举报
回复
帮你顶下
pfworld 2010-05-17
  • 打赏
  • 举报
回复
自己UP一下!!
dlsgliss 2010-05-11
  • 打赏
  • 举报
回复
对于我这个菜鸟来说,这个问题有点深奥,学习并帮顶!
qiqishardgel 2010-05-11
  • 打赏
  • 举报
回复
学习了,顶!
pfworld 2010-05-11
  • 打赏
  • 举报
回复
自己UP一下!!
pfworld 2010-05-10
  • 打赏
  • 举报
回复
自己UP一下!!UP又分呀!!(可以看我以前的帖子)
pfworld 2010-05-08
  • 打赏
  • 举报
回复
谁有socket 通信的例子?
yyz985 2010-05-07
  • 打赏
  • 举报
回复
通知机制
悔说话的哑巴 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 pfworld 的回复:]
引用 20 楼 chichenzhe 的回复:
引用 18 楼 pfworld 的回复:
12客户端 总共5000数据 外部
每年300W数据 本地统计分析查看!

客户端上传数据到服务器内,服务端进行数据实时监控,需要监控查看实时客户端数据。


我再确认一个问题:
到底是1:
client ---上传数据提交到SQL--> sqlserver2005 然后 再在 sqlse……
[/Quote]
你是自己写,还是买? 怎么看不懂你说的话呢?
悔说话的哑巴 2010-05-07
  • 打赏
  • 举报
回复
chichenzhe 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 pfworld 的回复:]
引用 20 楼 chichenzhe 的回复:
引用 18 楼 pfworld 的回复:
12客户端 总共5000数据 外部
每年300W数据 本地统计分析查看!

客户端上传数据到服务器内,服务端进行数据实时监控,需要监控查看实时客户端数据。


我再确认一个问题:
到底是1:
client ---上传数据提交到SQL--> sqlserver2005 然后 再在 sqlse……
[/Quote]

呵呵 既然确认了问题那这就好办了.

有2个办法
1: client和server 都改代码.
client 每次和数据库同步成功之后 都通知server一次(如果你不会写socket那么你写http吧,会简单很多)
这样的话就回到我提的方案2的轨道上来了,你只需要在夜晚让server何sqlserver进行同步即可,数据库压力小很多.并且程序压力也不大每秒处理5个HTTP请求对你的server端来讲也没什么问题.

2:只改server端
就是server端每间隔N秒就去数据库同步 一次数据.这样的话你最好是设计成日表/月表 机制(如果你设计了日表的话就可以只取最近1天的数据,历史数据不用每N秒取1次,)

最后说下数据库优化.
考虑到将来维护,其实月表机制是很不错的办法.(不过程序就得大改了)
如果不用日表月表,那么至少得每个月都把历史数据移到备份库
ztenv 2010-05-07
  • 打赏
  • 举报
回复
我们公司也在做类似的东西,就是监控主机及进程的资源(cpu,内存,虚拟内存,网卡流量等),刚刚把系统设计做完,通讯你肯定要用socket了,
chichenzhe 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 pfworld 的回复:]
socket 客户端、服务端如何实现远程通信,安全如何?效率如何?
[/Quote]
你自己实现http server 阻塞+多线程 也是从socket层来实现的,只不过是短连接处理而已.
安全性没必要考虑,非要考虑安全的话就加密数据包(这个实在无必要.)
skep99 2010-05-07
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 pfworld 的回复:]
socket 客户端、服务端如何实现远程通信,安全如何?效率如何?
[/Quote]

效率最高,安全性不在这层实现
pfworld 2010-05-07
  • 打赏
  • 举报
回复
socket 客户端、服务端如何实现远程通信,安全如何?效率如何?
ldwang 2010-05-06
  • 打赏
  • 举报
回复
我来学习一下!
落伍了。
Hidden518 2010-05-06
  • 打赏
  • 举报
回复
每天回帖有分
加载更多回复(22)

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧