2012-10-16 13 views
12

के लिए टाइमआउट कैसे सेट करें मैं अपने ओआरएम के लिए फ्लुएंट एनएचबर्ननेट का उपयोग कर रहा हूं। ऐसा करने में मैं LINQ की शक्ति के साथ डेटा का एक सेट लाने के लिए NHibernate LINQ वाक्यविन्यास का उपयोग करने का प्रयास कर रहा हूं। कोड जो मैंने काम किया है और अपवाद के साथ सही तरीके से निष्पादित करता है कि एक टाइमआउट फेंक दिया जाता है यदि इसे चलाने में लगभग 30 सेकंड लगते हैं। मेरे पास सवाल यह है कि मैं NHQernate के माध्यम से LINQ कथन के लिए डिफ़ॉल्ट 30 सेकंड टाइमआउट कैसे बढ़ा सकता हूं?NHibernate LINQ कथन

मैं पहले से ही पदों here, here, और here लेकिन पहले दो देखा है DataContext के समय समाप्त संपत्ति है, जो यहाँ लागू नहीं होता है की स्थापना का उल्लेख है, और तीसरे एक्सएमएल में टाइमआउट है, जो भी लागू नहीं होता स्थापित करने के लिए संदर्भित करता क्योंकि मैं फ्लाई पर एक्सएमएल उत्पन्न करने के लिए फ्लुएंट एनएचबेर्नेट का उपयोग कर रहा हूं। इतना ही नहीं, लेकिन पोस्ट 2 साल पुराना है और फ्लुएंट एनएचबर्ननेट बदल गया है।

ICriteria वस्तुओं और यहां तक ​​कि HQL मैं टाइमआउट निर्दिष्ट कर सकते हैं के साथ

, हालांकि उस लक्ष्य को यहाँ नहीं है। मैं जानना चाहता हूं कि उसी टाइमआउट को कैसे सेट करें और LINQ का उपयोग करें।

उदाहरण कोड:

using (var session = SessionFactory.OpenSession()) 
    using (var transaction = session.BeginTransaction()) 
    { 
     var query = (from mem in session.Query<Member>() 
        select mem); 
     query = query.Where({where statement}); 
     int start = (currentPage - 1) * max); 
     if (start > 0) 
      query = query.Skip(start).Take(max); 
     else 
      query = query.Take(max); 

     var list = query.ToList(); 
     transaction.Commit(); 
     return list; 
    } 

इस कोड (जहां बयान कोई फर्क नहीं पड़ता) जहां एक टाइमआउट होता है को छोड़कर सभी उद्देश्यों के लिए काम करता है।

किसी भी मदद की सराहना की जाती है। अग्रिम में धन्यवाद!

+0

kingpin2k द्वारा उत्तर देखें। मेरे लिए बहुत अच्छा काम किया। –

उत्तर

12

मैं धाराप्रवाह NHibernate के लिए विन्यास के लिए आदेश समय-समाप्ति सेट समाप्त हो गया। इसका नकारात्मक पक्ष यह है कि यह मेरे सभी डेटा एक्सेस कॉल के लिए टाइमआउट सेट करता है, न केवल एक।

उदाहरण कोड:

.ExposeConfiguration(c => c.SetProperty("command_timeout", (TimeSpan.FromMinutes(10).TotalSeconds).ToString())) 

मैं this वेबसाइट से इस सुझाव मिल गया।

+5

NHHernate गुणों को सेट करते समय आपको NHibernate.Cfg.Environment नेमस्पेस का उपयोग करना चाहिए। इस तरह यदि कुंजी बदलती है, तो आप पाठ को प्रतिस्थापित नहीं कर रहे हैं। कमांड टाइमआउट के लिए आप ब्रैंडन के सुझाव के अनुसार निम्न कार्य कर सकते हैं लेकिन निरंतर उपयोग कर रहे हैं: '।ExposeConfiguration (c => c.SetProperty (NHibernate.Cfg.Environment.CommandTimeout, TimeSpan.FromMinutes (5) .TotalSeconds.ToString()) ' –

+0

मैंने ऐसा करने का प्रयास किया। काम नहीं किया। यह अभी भी 30 का डिफ़ॉल्ट मान लेता है – Zuber

0

मैं सिर्फ इस के साथ लड़ रहे समय की उचित राशि खर्च की है बढ़ाया और कहा कि और उम्मीद है कि इस किसी और कुछ बचत होगी है पहर।

तुम बहुत अंतिम क्षण में .Timeout(120) विधि कॉल का उपयोग यकीन है कि यह प्रयोग किया जाता है बनाने के लिए करना चाहिए। TBH मैं ऐसा क्यों है पर यकीन है कि 100% नहीं कर रहा हूँ, लेकिन यहाँ कुछ उदाहरण हैं:

काम करेंगे

query = query.Where(x => x.Id = 123); 

var result = query.Timeout(120).ToList(); 

काम नहीं करता है

query.Timeout(120); 

query = query.Where(x => x.Id = 123); 

var result = query.ToList(); 

तो दूसरी तरह से किया (नहीं करता है ' टी काम) उदाहरण के लिए, ऐसा लगता है कि यह डिफ़ॉल्ट सिस्टम पर वापस आ गया है। ट्रांज़ेक्शन मैनेजर। डीफॉल्टटाइमआउट।

+0

क्वेरी के लिए हमारे काम पर काम करने के बाद – Malcolm

+0

किसी के लिए उचित परीक्षण के साथ मुझे गलत साबित करने के लिए खुश है, लेकिन मैंने इसे मैन्युअल रूप से कई बार किया और इसे हर बार पुन: उत्पन्न किया। मैं मानता हूं कि यह क्वेरी के बाद काम करेगा, जब तक आप अतिरिक्त क्लॉज जोड़ें और फिर 'टॉलिस्ट(); ' –

+2

मुझे लगता है कि आपको क्वेरी = क्वेरी के रूप में पुन: असाइन करने की आवश्यकता है। टाइमआउट (120); –