1

我们有一个带有 Oracle 11g 后端的旧版 PowerBuilder 12.1 Classic 应用程序,并且在生产中遇到了我们无法在测试环境中重现的性能问题。

有问题的窗口具有共享网格/自由格式 DataWindows 和用于打开其他响应窗口的按钮,这些响应窗口在关闭时会导致网格重新检索。

网格背后有一个非常昂贵的查询,几列从函数调用中接收它们的值,其中包含一些非常密集的 SQL,但它仍然在几秒钟内运行,即使在生产中也是如此。

错误发生时间的唯一一致性是,如果他们试图快速导航到其他窗口,似乎更有可能发生。打开所述窗口的按钮假定使用网格中焦点行中的适当值设置某个实例变量。但是,在这种情况下,尚未设置实例变量,即使看起来行焦点发生了变化。这导致了不应出现的空引用异常。

最终用户的网络连接通常很慢,他们的硬件能力也不比我们差。我想责怪网络,但我试图通过故意减慢 SQL 来在开发中重现这一点,以便我可以尝试单击一个按钮,但是一切都按我的预期发生:直到检索和所有其他事件都完成了。

我的直觉告诉我,由于某种原因,事情并没有在它们应该同步运行的时候同步运行,我能想象的唯一因素是 SQL 的速度,无论是查询速度慢还是网络速度慢,但是当我尝试复制时那个效果的事情仍然以正确的顺序发生。唯一可疑的代码是数据窗口祖先发布了一个名为ue_post_rfcfrom的用户事件rowfocuschanged,而该事件执行了一个Yield(). ue_post_rfc是代码而不是rowfocuschanged.

有没有什么方法Yield()会导致这些问题,而不在测试环境中表现出来,即使 SQL 被人为减慢?

4

1 回答 1

1

虽然您的消息可能没有提供足够的信息来为您提供解决问题的方法,但它确实给了我一个提示,即我在 PowerBuilder 系统中经常看到的难以诊断的故障的共同点。

开发事件的顺序是这样的

  • 开发人员开发的代码依赖于一个事件在另一个事件之前触发,通常依赖于实例或全局变量
    • 此事件序列是开发人员观察到的,但未记录为保证序列(如 AcceptText() 序列或 Update() 序列已记录)
    • 我在发布的事件中发现了很多,而且我不是在谈论从event 发布 post - event 的eventpost- event,而是在post-ItemChangedpost-GetFocus之间
  • 有些东西改变了事件的顺序,破坏了代码。我看到的改变非保证事件序列的事情包括:
    • PowerBuilder 版本变更
    • 操作系统变化
    • 硬件变更
    • 与其他应用程序一起运行的应用程序会占用系统资源
  • 现在负责解决这个问题的人不知道发生了什么或如何处理它,所以他们开始在代码中添加 Yield() 语句(我确实看到 Yield() 旁边的注释说“我不知道为什么会这样,但它解决了问题 X ")
    • 请注意,Yield() 允许处理消息队列中的任何和所有事件,而该开发人员实际上只希望一个特定事件通过
    • 另请注意,在我的职业生涯中常见的 DO ... LOOP UNTIL (NOT Yield()) 可能会在重负载系统上无限循环
  • 发生了一些事情再次改变了事件顺序
  • 现在当 Yield() 发生时,队列中有不同的消息序列要处理,而不是开发人员想要处理的消息
  • 事情又开始失败了

我摆脱这个问题的建议(如果这是你的问题)是:

  • 摆脱跨事件依赖
  • 摆脱事件顺序假设
  • 自己管理事件序列

祝你好运,

特里


PS这是你问题中的几句话,让我想起了 Yield() (并不是说我不喜欢跳到 Yield()咧嘴一笑的机会)

错误发生时间的唯一一致性是,如果他们试图快速导航到其他窗口,似乎更有可能发生。

当用户尝试非常快速地启动(例如)两个动作时看到这一点。如果第一个动作的脚本包含 Yield(),则第二个动作的脚本将在第一个动作完成之前开始和结束。对于用户操作的任何组合(例如,按钮单击、菜单单击、选项卡、窗口关闭......您编写的代码可能在 Yield() 完成后窗口不再存在,对吧?如果没有,加入 99% 的代码 Yield(),不要,并且生活危险)和系统事件(例如 GetFocus、Deactivate、Timer)

我的直觉告诉我,由于某种原因,事情没有在应该同步的时候同步运行

你是对的。PowerBuilder(除非你强制它)同步运行。但是,如果一个事件在另一个事件完成之前开始(见上文),那么您将获得看起来像异步行为的行为。

您所说的没有确定的内容,但是您确实询问了 Yield()。确定这一点的真正关键是您是否可以使用 PBDEBUG 跟踪重现它;你会看到哪些事件让你感到惊讶。但是,PBDEBUG 减慢速度的数量会影响事件序列和排队,这可能有帮助,也可能没有帮助。

于 2012-08-30T14:13:03.313 回答