我们有一个带有 Oracle 11g 后端的旧版 PowerBuilder 12.1 Classic 应用程序,并且在生产中遇到了我们无法在测试环境中重现的性能问题。
有问题的窗口具有共享网格/自由格式 DataWindows 和用于打开其他响应窗口的按钮,这些响应窗口在关闭时会导致网格重新检索。
网格背后有一个非常昂贵的查询,几列从函数调用中接收它们的值,其中包含一些非常密集的 SQL,但它仍然在几秒钟内运行,即使在生产中也是如此。
错误发生时间的唯一一致性是,如果他们试图快速导航到其他窗口,似乎更有可能发生。打开所述窗口的按钮假定使用网格中焦点行中的适当值设置某个实例变量。但是,在这种情况下,尚未设置实例变量,即使看起来行焦点发生了变化。这导致了不应出现的空引用异常。
最终用户的网络连接通常很慢,他们的硬件能力也不比我们差。我想责怪网络,但我试图通过故意减慢 SQL 来在开发中重现这一点,以便我可以尝试单击一个按钮,但是一切都按我的预期发生:直到检索和所有其他事件都完成了。
我的直觉告诉我,由于某种原因,事情并没有在它们应该同步运行的时候同步运行,我能想象的唯一因素是 SQL 的速度,无论是查询速度慢还是网络速度慢,但是当我尝试复制时那个效果的事情仍然以正确的顺序发生。唯一可疑的代码是数据窗口祖先发布了一个名为ue_post_rfc
from的用户事件rowfocuschanged
,而该事件执行了一个Yield()
. ue_post_rfc
是代码而不是rowfocuschanged
.
有没有什么方法Yield()
会导致这些问题,而不在测试环境中表现出来,即使 SQL 被人为减慢?