2009-07-24 23 views
10

दुर्भाग्य से सेटटाइमआउट जेडीबीसी/पोस्टग्रेस के लिए लागू नहीं किया गया है। क्या कोई तरीका है जिसे मैं अनुकरण या कामकाज कर सकता हूं? कार्यात्मक रूप से मैं क्वेरी को निष्पादित करना चाहता हूं और फिर ब्रेक लगाना चाहता हूं यदि यह एन सेकंडजेडीबीसी पोस्टग्रेस एक टाइमआउट

+0

मुझे यह प्रश्न मिला और मुझे एक पायथन/psycopg2 समस्या का सामना करने में भी मदद मिली। Psycopg2 ने कनेक्शन समय पर टाइमआउट सेटिंग की अनुमति दी है, लेकिन यह इंटरफ़ेस मेरे मामले में दूर किया गया था। SO पर खोज करने वाले अन्य लोगों को लाभ पहुंचाने के लिए इस टिप्पणी को जोड़ना। – SetJmp

उत्तर

17

"statement_timeout" आप जो चाहते हैं उसे दिखता है।

SET statement_timeout TO 1000; -- for a second 
<your_query_here>; 
RESET statement_timeout; -- reset 
+3

आप RESET कथन_टाउटआउट का उपयोग कर बेहतर हैं; क्वेरी पूरी होने के बाद - यदि कोई डिफ़ॉल्ट मान है ... –

+0

अब फिक्स्ड, धन्यवाद! –

+0

ने इसे pgAdmin3 पर परीक्षण किया। केवल तब काम किया जब एसईटी कथन_टाउटआउट वास्तविक क्वेरी से अलग से निष्पादित किया जाता है। जब एक साथ निष्पादित किया जाता है, तो pgAdmin3 जो भी टाइमआउट मान पहले से सेट किया गया था और क्वेरी के साथ प्रदान किए गए किसी का उपयोग नहीं करता है। – Babar

1

एक टाइमर क्लास में क्वेरी चलाने का प्रयास करने का एक तरीका हो सकता है। टाइमर समाप्त होने के बिना समाप्त होने पर अपवाद फेंको।

Hibernate और JDO ऐसे निर्माण की आपूर्ति। शायद वे आपके लिए अच्छे विकल्प होंगे।

+0

आपको सावधान रहना होगा कि यह कैसे लागू किया गया है; यदि गलत किया गया है, तो आप SQL कनेक्शन वाले कई अवरुद्ध धागे के साथ समाप्त होते हैं जिन्हें अभी अनदेखा किया जा रहा है। इस मुद्दे का एक हिस्सा यह है कि यदि आप कुछ करने के बीच में हैं तो आप एक अपवाद फेंकने के लिए थ्रेड को मजबूर नहीं कर सकते हैं। –

0

क्या होगा यदि आप अपने डेटा स्रोत के लिए c3p0 का उपयोग करना चाहते थे? इसमें बहुत से कॉन्फ़िगर करने योग्य विकल्प हैं, और क्रैकी डेटाबेस और नेटवर्क के लिए, उदाहरण के लिए, अधिग्रहण रीट्रीएट्सप्ट्स, अधिग्रहण रीट्रीडेले, और ब्रेकएफ्टरएक्वायरफेलर।

0

स्थानीय कीवर्ड का उपयोग वर्तमान लेनदेन में statement_timeout के दायरे को सीमित करता है। इस तरह, अगर कुछ भी गलत हो जाता है (उदा। यह समय समाप्त हो जाता है) टाइमआउट रीसेट हो जाता है।

BEGIN TRANSACTION; 
SET LOCAL statement_timeout TO 1000; -- one-second timeout 
SELECT COUNT(*) FROM really_huge_table; -- your slow query 
ROLLBACK;        -- reset