PowerBuilder 12.1生产性能问题导致异步?

时间:2012-08-29 15:15:52

标签: performance oracle11g powerbuilder

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

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

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

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

最终用户的网络连接通常很迟钝,而且他们的硬件能力不比我们的要低。我想责怪网络,但我试图通过故意减慢SQL来自己在开发中重现这一点,以便我可以尝试点击按钮,但是一切都按照我的预期发生:点击按钮直到检索后才发生所有其他活动结束。

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

是否有任何方式Yield()会导致这些问题,而不会在测试环境中表现出来,即使人为地减慢了SQL?

1 个答案:

答案 0 :(得分:1)

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

开发事件的顺序是这样的

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

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

  • 摆脱跨事件依赖
  • 摆脱事件序列假设
  • 自己管理活动顺序
祝你好运,

特里


P.S。这里有一些你问题引用的引号让我想起了Yield()(并不是说我不喜欢跳过全部收益率() grin

  

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

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

  

我的直觉告诉我,由于某种原因,事情并没有发生   同时他们应该

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

你所说的内容没有任何确定性,但你确实询问Yield()。如果你可以用PBDEBUG追踪重现这个问题,那么确定这个问题真的很有意义。你会看到哪些事件让你感到惊讶。但是,PBDEBUG减慢速度会影响事件序列和排队,这可能会有所帮助,也可能没有帮助。