EM0*_*EM0 9 .net sql postgresql plpgsql npgsql
我有一个C#客户端应用程序,它使用Npgsql在PostgreSQL 9.1.4中调用plpgsql函数.该功能需要很长时间,我想以某种方式向客户报告进度.我该怎么做?
LISTEN/NOTIFY机制听起来很完美,除了整个事务在事务内部运行并且NOTIFY事件直到事务结束才发送,这对我来说是无用的.
我尝试过的另一件事是RAISE NOTICE,我可以在客户端上处理,但即使是那些通知似乎也会缓冲一段时间并分批发送.它总比没有好,但不理想.有什么方法可以"冲洗"它们,所以它们会立即发送给客户吗?
除了@ Pavel的优点之外RAISE NOTICE,还有另一种经典技术用于监控Pg中的查询进度.这有点像黑客,但它非常有效.
您可以利用这样一个事实,即序列的更改会立即在所有位置都可见,以便将函数的进度暴露给外部.使用硬编码序列并确保不同时调用该函数,或将进度监视序列名称传递给函数.
您的函数可以nextval(seqname)在每次迭代时调用,并且感兴趣的各方可以SELECT last_value FROM seqname从另一个会话检查序列的状态.
您可以通过设置顺序使顺序倒计时到完成
create sequence test maxvalue 2147483647 increment by -1;
Run Code Online (Sandbox Code Playgroud)
并setval('seqname', num_items)在你的功能开始时调用.然后每次nextval通话都会倒数到零.顺便说一句,2147483647是maxint.
毋庸置疑,这不是便携式的,并且无法保证SELECT序列中的输入始终以这种方式工作.但它很方便.
| 归档时间: |
|
| 查看次数: |
2188 次 |
| 最近记录: |