2012-08-15 14 views
9

को लंबे समय से चल PostgreSQL समारोह से प्रगति की रिपोर्ट कैसे मैं Npgsql का उपयोग करता है PostgreSQL 9.1.4 में एक plpgsql समारोह कॉल करने के लिए एक सी # क्लाइंट अनुप्रयोग है। फ़ंक्शन में बहुत लंबा समय लगता है और मैं किसी भी तरह से क्लाइंट को प्रगति की रिपोर्ट करना चाहता हूं। मुझे यह कैसे करना चाहिए?ग्राहक

लिस्टेन/नोटिफ़िक तंत्र इसके लिए बिल्कुल सही लगता है, सिवाय इसके कि पूरी चीज एक लेनदेन के अंदर चलती है और नोटिस घटनाएं लेनदेन के अंत तक नहीं भेजी जाती हैं, जो मेरे लिए बेकार है।

दूसरी बात मैं कोशिश की है नोटिस है, जो मैं ग्राहक पर संसाधित कर सकते हैं उठाते हैं, लेकिन फिर भी वे नोटिस थोड़ी देर के लिए बफ़र और बैचों में भेजे जाने के लिए लग रहे हैं। यह कुछ भी नहीं है, लेकिन आदर्श नहीं है। क्या कोई तरीका है कि मैं उन्हें "फ्लश" कर सकता हूं, इसलिए उन्हें तुरंत ग्राहक को भेजा जाता है?

उत्तर

6

रायस नोटिस से बेहतर कुछ भी नहीं है।

इन संकेतों बफ़र नहीं कर रहे हैं - और वे अतुल्यकालिक कर रहे हैं - आप शायद अपने आवेदन में नोटिस प्रसंस्करण में समस्या आ रही है।

+0

PostgreSQL 8.4 और इससे ऊपर के साथ आप RAISE नोटिस में एक त्रुटि कोड भी प्रदान कर सकते हैं, जिससे प्रगति संदेशों और अन्य नोटिस के बीच अंतर बताना आसान हो जाता है। –

+0

आप सही हैं, यह पता चला है कि नोटिस * को उठाए जाने के रूप में वितरित किया जा रहा था, लेकिन समारोह में एक बहुत अजीब मंदी थी, जो तब नहीं हुआ जब मैं एक ही प्रश्न सीधे चलाता था। मैंने अब इसके लिए एक समाधान तैयार किया है। – EM0

+0

रायइस नोटिस के सापेक्ष महत्वपूर्ण ओवरहेड है - यह क्लाइंट और सर्वर के बीच नेटवर्क हैंडशेक है। मैं आमतौर पर हर पुनरावृत्ति नोटिस नहीं बढ़ाता, लेकिन मुझे हर हज़ार पुनरावृत्ति दिखाई देता है। –

1

simpliest रास्ता अनेक उप कार्यों में अपने pgsql समारोह विभाजित करने के लिए, की तुलना में उन्हें क्रमिक फोन, आवेदन-साइड, आवेदन में लेन-देन गुंजाइश प्रबंध किया जाएगा।

+0

धन्यवाद, लेकिन इस विशेष मामले में यह आसान नहीं होगा, मैं आपको आश्वस्त कर सकता हूं। :) कोई अन्य तरीकों? – EM0

+0

ऐसा नहीं है कि मैं सोच सकता हूं, क्षमा करें – mathieu

7

@ के बारे में RAISE NOTICE, वहाँ एक और क्लासिक पृष्ठ में क्वेरी प्रगति की निगरानी करने के लिए इस्तेमाल तकनीक है पावेल उत्तम बिंदु के साथ साथ। यह एक हैक का थोड़ा सा है, लेकिन यह काफी प्रभावी है।

आप तथ्य यह है कि दृश्यों में परिवर्तन दोहन कर सकते हैं तुरंत हर जगह दिखाई दे बाहर करने के लिए एक समारोह की प्रगति का खुलासा कर रहे हैं। या तो हार्ड-कोडेड अनुक्रम का उपयोग करें और सुनिश्चित करें कि फ़ंक्शन को समवर्ती रूप से नहीं कहा जाता है, या फ़ंक्शन में प्रगति निगरानी अनुक्रम नाम पास करें।

आपका फ़ंक्शन प्रत्येक पुनरावृत्ति पर nextval(seqname) पर कॉल कर सकता है, और इच्छुक पार्टियां किसी अन्य सत्र से SELECT last_value FROM seqname के साथ अनुक्रम की स्थिति की जांच कर सकती हैं।

आप

create sequence test maxvalue 2147483647 increment by -1; 

के साथ स्थापित करने और अपने कार्य के शुरू में setval('seqname', num_items) फोन करके अनुक्रम पूरा होने से एक गिनती-डाउन कर सकते हैं। इसके बाद यह प्रत्येक nextval कॉल के साथ शून्य की ओर गिना जाएगा। 2147483647 रास्ते में maxint है।

यह कहने की जरूरत नहीं है कि यह पोर्टेबल नहीं है, और कोई गारंटी नहीं है कि अनुक्रम से SELECT आईएनजी हमेशा इस तरह से काम करेगा। हालांकि, यह आसान काम है।

+0

+ 1 अच्छा चाल, धन्यवाद। – EM0

0

तुम भी उपयोग कर सकते हैं:

EXECUTE 'COPY (SELECT ''progress: ' || progress_variable || ''') TO ''d:\progress.txt'''; 

अपने समारोह के अंदर किसी पाठ फ़ाइल में वर्तमान प्रगति लिखने के लिए।

संबंधित मुद्दे