程序频繁读取数据库 ,有何改进方法没有????

ponydph 2014-04-25 05:16:37
整个系统是由 通讯程序(串口)+数据库Sqlserver2005+web监测 组成

通讯程序负责和下位机通讯,将读取到的数据保存到数据库中,然后web监测程序定时读取数据 显示。当在web上修改定义时。
需要将命令通过通讯程序发动到下位机
==============================
问题:由于通讯程序需要不断的读取数据库,扫描多个表。判断是否有变动,需要下发命令。
如果没有变动,则程序白做无用功。有何好的方法没有???
能实现如果有变动,则通知程序去读取。保证可靠。
...全文
652 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
dasdaasd1 2016-04-14
  • 打赏
  • 举报
回复
我感觉人家说的 很明白了,楼主你得好好理解下
ponydph 2014-04-30
  • 打赏
  • 举报
回复
没有你所谓的实时数据库的概念。 存储线程和通讯线程本来已经分开了。通过队列实现,一个添加,一个读取,然后删除。 不知道你所谓的转换线程是不是这个意思? 你的意思是 web定义后,直接通知通讯程序去读取? 如果不用扩展存储过程,你用什么方法实现交互。
ponydph 2014-04-29
  • 打赏
  • 举报
回复
引用 32 楼 BeanJoy 的回复:
看看这个: 数据库主动式通知编程
第二种方式还没有用过,哪位给介绍一下。使用情况
ponydph 2014-04-29
  • 打赏
  • 举报
回复
引用 31 楼 BeanJoy 的回复:
[quote=引用 30 楼 ponydph 的回复:] [quote=引用 26 楼 BeanJoy 的回复:] [quote=引用 24 楼 ponydph 的回复:] [quote=引用 23 楼 BeanJoy 的回复:] [quote=引用 18 楼 ponydph 的回复:] [quote=引用 15 楼 fqzlala 的回复:] 本方法一个:专门建立个表,设置更新状态,更新时,刷新这个状态。web监测时,只判断这个表的状态,决定刷不刷新
当然考虑过, 没有不是解决的根本方法,维护起来和吃力,因为你需要定义各种各样的事件 和标志 然后再翻译。 这样读取的表 少点。[/quote] 我倒觉得15的建议是个不错的选择。 定义一个单独的表,通讯程序对数据库的任何更改都记录到这个表中,相当于LOG。web或者其他直接查询这张表即可知道哪些表有变化。 变化的定义无非增、删、改这三个吧。这个单独的表中只记录表名、表名中相应自增ID的值(假如这样设计的)、相应记录的更改操作(增、删或改),如果有必要再记录时间即可吧。 我认为如果数据库有自动通知外部程序的功能,那么数据库通知外部程序的事件也不一定比你自己定的事件来得简单。[/quote] 这是个办法: web和通讯程序通讯 实际和IIS通讯。但是连接有时候不太可靠。而数据库的方式交互不成功的时候,还可以留下记录; 如果采用上述单独建个表的思路,单独扫描它。如果多个表修改了呢?? 还有一点,就是需要修改目前的web配置,每个表在更新的时候,都需要增加一个表修改标志到 单独表中去。 或者采用触发器的方式更新到表中去,反正web端的设计就比较复杂了。[/quote] web和通讯程序通讯,要考虑到连接异常、web异常等丢失信息的情况。 我举个例子: 报有表的改变都反应在这一个表中,每读取一行记录都知道是哪个表的哪个记录有什么改变,这样设计是否能行? 比如第2行,就知道在表1中增加了一行记录,这行记录的ID值为124,后面要做什么就由你自己控制了。 这样,扫描表的话,就只需扫描这一张表,我觉得简单多了。[/quote] ====================================================== 那现有的web程序需要修改,每次操作表的时候。都必须同时操作变动表。或者增加触发器的方式。 [/quote] 主动查询的方式怎么做都可以,就看你觉得那种方式简单。[/quote] 实现肯定可以,就是说的效率问题。
BeanJoy 2014-04-29
  • 打赏
  • 举报
回复
BeanJoy 2014-04-29
  • 打赏
  • 举报
回复
引用 30 楼 ponydph 的回复:
[quote=引用 26 楼 BeanJoy 的回复:] [quote=引用 24 楼 ponydph 的回复:] [quote=引用 23 楼 BeanJoy 的回复:] [quote=引用 18 楼 ponydph 的回复:] [quote=引用 15 楼 fqzlala 的回复:] 本方法一个:专门建立个表,设置更新状态,更新时,刷新这个状态。web监测时,只判断这个表的状态,决定刷不刷新
当然考虑过, 没有不是解决的根本方法,维护起来和吃力,因为你需要定义各种各样的事件 和标志 然后再翻译。 这样读取的表 少点。[/quote] 我倒觉得15的建议是个不错的选择。 定义一个单独的表,通讯程序对数据库的任何更改都记录到这个表中,相当于LOG。web或者其他直接查询这张表即可知道哪些表有变化。 变化的定义无非增、删、改这三个吧。这个单独的表中只记录表名、表名中相应自增ID的值(假如这样设计的)、相应记录的更改操作(增、删或改),如果有必要再记录时间即可吧。 我认为如果数据库有自动通知外部程序的功能,那么数据库通知外部程序的事件也不一定比你自己定的事件来得简单。[/quote] 这是个办法: web和通讯程序通讯 实际和IIS通讯。但是连接有时候不太可靠。而数据库的方式交互不成功的时候,还可以留下记录; 如果采用上述单独建个表的思路,单独扫描它。如果多个表修改了呢?? 还有一点,就是需要修改目前的web配置,每个表在更新的时候,都需要增加一个表修改标志到 单独表中去。 或者采用触发器的方式更新到表中去,反正web端的设计就比较复杂了。[/quote] web和通讯程序通讯,要考虑到连接异常、web异常等丢失信息的情况。 我举个例子: 报有表的改变都反应在这一个表中,每读取一行记录都知道是哪个表的哪个记录有什么改变,这样设计是否能行? 比如第2行,就知道在表1中增加了一行记录,这行记录的ID值为124,后面要做什么就由你自己控制了。 这样,扫描表的话,就只需扫描这一张表,我觉得简单多了。[/quote] ====================================================== 那现有的web程序需要修改,每次操作表的时候。都必须同时操作变动表。或者增加触发器的方式。 [/quote] 主动查询的方式怎么做都可以,就看你觉得那种方式简单。
ponydph 2014-04-29
  • 打赏
  • 举报
回复
引用 26 楼 BeanJoy 的回复:
[quote=引用 24 楼 ponydph 的回复:] [quote=引用 23 楼 BeanJoy 的回复:] [quote=引用 18 楼 ponydph 的回复:] [quote=引用 15 楼 fqzlala 的回复:] 本方法一个:专门建立个表,设置更新状态,更新时,刷新这个状态。web监测时,只判断这个表的状态,决定刷不刷新
当然考虑过, 没有不是解决的根本方法,维护起来和吃力,因为你需要定义各种各样的事件 和标志 然后再翻译。 这样读取的表 少点。[/quote] 我倒觉得15的建议是个不错的选择。 定义一个单独的表,通讯程序对数据库的任何更改都记录到这个表中,相当于LOG。web或者其他直接查询这张表即可知道哪些表有变化。 变化的定义无非增、删、改这三个吧。这个单独的表中只记录表名、表名中相应自增ID的值(假如这样设计的)、相应记录的更改操作(增、删或改),如果有必要再记录时间即可吧。 我认为如果数据库有自动通知外部程序的功能,那么数据库通知外部程序的事件也不一定比你自己定的事件来得简单。[/quote] 这是个办法: web和通讯程序通讯 实际和IIS通讯。但是连接有时候不太可靠。而数据库的方式交互不成功的时候,还可以留下记录; 如果采用上述单独建个表的思路,单独扫描它。如果多个表修改了呢?? 还有一点,就是需要修改目前的web配置,每个表在更新的时候,都需要增加一个表修改标志到 单独表中去。 或者采用触发器的方式更新到表中去,反正web端的设计就比较复杂了。[/quote] web和通讯程序通讯,要考虑到连接异常、web异常等丢失信息的情况。 我举个例子: 报有表的改变都反应在这一个表中,每读取一行记录都知道是哪个表的哪个记录有什么改变,这样设计是否能行? 比如第2行,就知道在表1中增加了一行记录,这行记录的ID值为124,后面要做什么就由你自己控制了。 这样,扫描表的话,就只需扫描这一张表,我觉得简单多了。[/quote] ====================================================== 那现有的web程序需要修改,每次操作表的时候。都必须同时操作变动表。或者增加触发器的方式。
ponydph 2014-04-29
  • 打赏
  • 举报
回复
引用 27 楼 gz_qmc 的回复:
你这张表用个链表做 不就是实时数据库了吗 要不然,在你们心里,实时数据库是个啥概念呢
没解决接口问题,再怎么做也得查询。
BeanJoy 2014-04-29
  • 打赏
  • 举报
回复
引用 27 楼 gz_qmc 的回复:
你这张表用个链表做 不就是实时数据库了吗 要不然,在你们心里,实时数据库是个啥概念呢
在web(IIS)未开启的情况下,请问通讯程序将操作数据库的结果放在哪里,才能让web再次开启就能访问到?在通讯程序进程空间内分配内存存链表,web开启后访问通讯程序内存的链表?通讯程序将链表数据放到硬盘文件上,然后web开启后访问这个文件?如果把链表放在内存中,是否要考虑程序突然崩溃而导致的数据丢失的情况?
gz_qmc 2014-04-29
  • 打赏
  • 举报
回复
你把上面图片中的上位去掉 并且把和他相关的线也去掉 你自己看看,Web和他们又毛的关系
gz_qmc 2014-04-29
  • 打赏
  • 举报
回复
Web就一显示数据用,就是所谓的上位 普通数据从SQL取 实时数据从实时数据库取 最多必要的时候发一两个指令而已,指令发到指令队列就完了 不知道老鸡巴去掺合整个系统的运行干毛
gz_qmc 2014-04-29
  • 打赏
  • 举报
回复
Web开启动,自动读一次SQL数据 Web开启后接到转换线程的通知就又读一次SQL Web关闭了 整个系统照常运行 连这都看不懂,郁闷
肆水東澤 2014-04-28
  • 打赏
  • 举报
回复
本方法一个:专门建立个表,设置更新状态,更新时,刷新这个状态。web监测时,只判断这个表的状态,决定刷不刷新
BeanJoy 2014-04-28
  • 打赏
  • 举报
回复
引用 12 楼 gz_qmc 的回复:
你没看明白一个地方 ...
还是没明白,请指教: 1.通讯程序从下位机获取到数据,然后将数据保存到数据库; 2.web定时读取数据库以获取数据进行显示; 3.web修改数据库中某些值,并设置相应状态为TRUE; 4.通讯程序不断读取数据库中相应状态为TRUE的记录; 5.通讯程序下发相应命令。 这个是楼主的模型吧,如果我没理解错的话。 这个过程中如何利用实时数据库(或者原理)来改善?或者web与通讯程序不依靠数据库来传递消息,通讯程序直接与web联系,web上有任何修改,就直接发送给通讯程序,通讯程序再发送相应命令给下位机。
LanglyTiger 2014-04-28
  • 打赏
  • 举报
回复
可以用事件通知,通信程序一直等在事件上,一旦得到通知再去扫描数据库变动。
gz_qmc 2014-04-28
  • 打赏
  • 举报
回复
你没看明白一个地方 楼主的模型: 通讯程序(串口)------> 数据库Sqlserver2005 <--------web监测 组成 推荐模型 : 通讯程序(串口)--------> 实时数据 ------> 数据库Sqlserver2005 <--------web监测 组成 通讯线程是不参与 数据库Sqlserver2005操作的 实时数据到数据库Sqlserver2005的转换和查表,是另外的线程来完成的 web只是单纯的反应 Sqlserver2005 的数据状况的 web是不必要直接向下位下达更新数据指令的 任何别人的实时数据库都是不靠谱的,因为任何一个人的实际工况都是不一样的 如果做为一个程序员同时搞上了工控行业,不会实时数据库是要吃亏的 一个简单的链表就可以是实时数据库,技术是没有难度的
BeanJoy 2014-04-28
  • 打赏
  • 举报
回复
引用 9 楼 gz_qmc 的回复:
楼主不会做实时数据库 如此而已
学习了。 不过我搜索了一下实时数据库,与传统的关系性数据相比,实时数据库最大特点在于实时,插入数据很快,并不能解决楼主的问题啊?如果表没有变化,程序还是要做无用功,还是要采用主动查询的方式才可知道表是否有变化。如果只是因为实时数据库实时性高,插入快等特点就改用实时数据库,我觉得有点不靠谱。关系性数据库与实时数据库应用领域不同,而且据我网上搜索,靠谱的实时数据库就那么几个,而且价格很贵,如果就因为实时性强,就改用实时数据库,是否得不偿失。
不败的拿破仑 2014-04-28
  • 打赏
  • 举报
回复
内存数据库?
gz_qmc 2014-04-28
  • 打赏
  • 举报
回复
楼主不会做实时数据库 如此而已
ponydph 2014-04-28
  • 打赏
  • 举报
回复
引用 4 楼 BeanJoy 的回复:
除了SQLServer,不知Oracle、DB2和MySql是否也是有相应的表改变事件进行通知外部程序? 请有研究过的@我哈。 我们项目用到了这四个数据库,用的是主动查询,虽然能达到目的,但一点儿不优雅,我一直耿耿于怀。 对于楼主的问题,如果不能用主动通知来实现,可以表中添加自动增长的ID,每次检索时应检索ID大于上次检索后最大ID的记录,效率应该不会太大。
多谢,也是一个思路,对于表的操作非常复杂。有添加、删除、修改操作。而且不是一个表,有多个。 目前的做法是: 1)web每次修改后,设置一个修改标志,比如为ture,负责通讯的程序根据读取的每条记录的标志去判断。 等操作完成后,再将标志设置为false。
加载更多回复(19)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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