And*_*ice 10 sql database oracle monitoring plsql
我是使用Oracle数据库的Web应用程序的开发人员.但是,UI通常会触发需要一段时间才能处理的数据库操作.因此,当这些情况发生时,客户端会想要一个进度条.
我最近发现我可以从第二个连接查询V $ SESSION_LONGOPS,这很棒,但它只适用于花费超过6秒的操作.这意味着我无法更新UI中的进度条,直到6秒过去.
我已经对V $ SESSION中的等待时间进行了研究,但就我所见,这还不包括等待查询.
有没有办法获得当前正在运行的会话查询的进度?或者我应该隐藏进度条直到6秒过去?
这些操作是Pl/SQL调用还是只是长时间运行的SQL?
通过PL/SQL操作,我们可以SET_SESSION_LONGOPS()在DBMS_APPLICATION_INFO包中编写消息.我们可以监控这些消息V$SESSION_LONGOPS. 了解更多.
为此,您需要能够以工作单位量化操作.这些必须是具体的迭代,数字而不是时间.因此,如果操作是插入10000行,则可以将其拆分为10个批次.该totalwork参数是批次(即数量10),并调用每1000行后SET_SESSION_LONGOPS()递增sofar参数.这将允许您渲染10块温度计.
这些消息是基于会话的,但没有自动的方法来区分当前消息与来自同一会话和SID的先前消息.但是,如果为context参数指定UID,则可以使用该值过滤视图.
这对于单个长时间运行的查询不起作用,因为我们无法将其分成块.
多年来我已经完成了大量的 Web 开发Oracle,发现大多数用户更喜欢不确定的进度条,而不是不准确的确定进度条(几乎所有Microsoft's进度条都让我烦恼不已),不幸的是没有绝对可靠的方法来准确确定查询进度。
虽然您对长操作能力的研究令人钦佩,并且肯定有助于使数据库查询的进度更加可靠,但它无法考虑可能/将影响 Web 操作的事务进度(网络负载)的无数其他变量、数据库负载、应用程序服务器负载、客户端数据解析、用户单击提交按钮 1,000 次等等)。
我会坚持使用 Javascript 回调的不确定进度方法。它更容易实施,并且会适当地管理用户的期望。