我曾在几个桌面应用程序上工作,这些应用程序使用表来对数据库表中的信息进行分组。但是保持这些信息的更新使我破解了不同的解决方案,比如每隔X秒更新一个执行查询的表的工作线程,或者只是刷新视图的按钮。我甚至看过一个应用程序,它会使用鼠标移动事件刷新表格。所以我的问题是,这是你首选的方法。有没有“完美”的方式实现这一点,我在大学里睡觉? 感谢人们的回复。
答案 0 :(得分:3)
你想要完成什么?
它是某种实时监控应用程序,如股票交易,工厂监控软件,还是您想在某些CRUD应用程序中自动更新网格?
如果这是 crud应用程序,那么我要做的第一件事就是检查要求:
如果你确实需要接近你所描述的方法,那么你做得很好 - 你可以使用计时器或其他一些事件(按钮,鼠标移动......)刷新数据。当然,随着用户数量的增加,不断的重新查询将成为性能问题。
如果实时监控软件包含大量数据,则不应将数据库放在系统中心。您应该拥有客户端通过TCP(或某些类似协议)连接的中央服务。中央服务应该保持最新的系统状态(加上一些历史记录)。客户端可以附加到服务和服务应该在有新数据时通知客户端,以便您避免持续轮询。数据库应该用作应用程序用于分析过去事件的日志,但不能用于实时显示。
修改:
关于Andrej的回答:我不确定这是否能解决你的问题。 Observer模式通常使用subscribe / notify机制实现,因此数据源可以在数据更改时通知所有观察者。 问题是RDBMS通常没有可以通知您数据更改的机制。即使它们有,也不实用,因为在短时间内可能会有大量的变化。想想第二次数十或数百次更新 - RDBMS应该多久通知客户有关更改的信息?如果有数百个网络速度慢的客户端怎么办?如果您有多个用户,事情会变得复杂。
数据绑定正在进行中 - 您无法将网格直接绑定到数据库中的表。首先需要将应用程序中的数据导入到可绑定到GUI的对象(数据集,列表......)
答案 1 :(得分:2)
一些编程语言/框架已经构建了对数据绑定的支持。数据绑定将同步视图(表组件)和数据(数据库表)。
例如,Flex,具有绑定内置,javafx,对于常规java,您可以使用jgoodies绑定,或oracle的adf数据控件和数据绑定。如果您的语言没有标准的绑定解决方案,那么查看现有语言的实现方式可能会很有用,例如jgoodies绑定(它的开源)。
顺便说一句,大多数绑定框架都基于一些默认设计模式,如观察者模式:视图组件需要订阅自己以获知数据更新。
编辑:
关于数据库更改的好处。那有点难了。从技术上讲,应该可以使用触发器来通知客户端。例如,在Oracle中,触发器可以使用高级排队在消息队列上发布数据更改事件消息,感兴趣的客户端可以监听。我在实践中没有看到这一点。您通常不希望将有关gui客户端的知识放入数据库中。
最好是使用轮询定期更新数据收集。此数据集合将使用绑定绑定到视图组件。
答案 2 :(得分:0)
完美特定于您的需求,但许多网站只需在您对单元格进行更新后更新表格。这会产生大量流量。也许您可以使用例如事务对更新进行排队,然后在用户关闭给定表时提交,按 save 或超时到期?
我认为这完全取决于您的具体应用。
答案 3 :(得分:0)
最简单的方法是使用一些可配置的计时器线程来更新查询(前提是每秒都不会发生超时)。您还可以显示最新数据收集的时间戳,并为需要当前数据的用户提供“刷新”按钮。
答案 4 :(得分:0)
非常有帮助Andrej。当您有机会使用数据绑定时,数据绑定似乎很容易。
哦是的,观察者模式:
其中的软件设计模式 object维护一个列表 家属并通知他们 任何状态变化的自动 通常通过打电话给他们之一 方法。它主要用于 实现分布式事件处理 系统
我发现C#使用委托声明新事件的方式非常方便。
感谢您的非常好的答案。
答案 5 :(得分:-1)
对于网络应用来说,这很酷。但我们所说的桌面应用程序即使在空闲时也应该不断更新数据库中的信息。 这是一个设计问题,而不是编程问题。