2011-07-07 14 views
20

क्या कोड की न्यूनतम राशि मैं एफई 4.1 से एक भी कॉलबैक कि निम्नलिखित प्रदान करता है पाने के लिए लिख सकते हैं:मैं एंटिटी फ्रेमवर्क को सही ढंग से कैसे प्रोफाइल करूं?

  • OnSQLExecuted(DbCommand cmd, DateTime start, double durationMS, string stacktrace)

फिलहाल हम चाहते हैं कि प्रतीत हो रहा है एक बुरा हैक का उपयोग प्रदर्शन को लीक करना, मैं उत्सुक हूं कि हम इस कॉलबैक को ऐप पर कम से कम प्रभाव के साथ कैसे प्राप्त कर सकते हैं।


हम इस hacking around द्वारा Mini Profiler में तार करने में सक्षम हैं - शुरू में हम Database.DefaultConnectionFactory बदल तथापि mucking डिफ़ॉल्ट कारखाने के साथ मतलब है कि आप दो रूपरेखा कारखानों एक ही समय में जा रहा नहीं हो सकता। तो हम अधिक आक्रामक मार्ग गए।


तकनीक आमतौर पर इस्तेमाल किया सुंदर सीधे आगे है, तो आप को लागू: DbProviderFactory, IDbConnectionFactory, DbProviderServices, DbConnection, DbCommand और DbDataReader इस तरह से है कि वे कॉल और प्रोफ़ाइल अवरोधन में।

अब तक, आसान ... लेकिन यह गंदा हो जाता है जब आप इस ऊपर तार करने की कोशिश:

FileLoadException: The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047):

try 
    { 
     // ensure all the factories are loaded 
     DbProviderFactories.GetFactory("..."); 
    } 
    catch (ArgumentException) 
    { 
    } 

    Type type = typeof(DbProviderFactories); 

    DataTable table; 
    // SUPER UGLY - Can this be done in another way? 
    object setOrTable = (type.GetField("_configTable", BindingFlags.NonPublic | BindingFlags.Static) ?? 
        type.GetField("_providerTable", BindingFlags.NonPublic | BindingFlags.Static)).GetValue(null); 
    if (setOrTable is DataSet) 
    { 
     table = ((DataSet)setOrTable).Tables["DbProviderFactories"]; 
    } 

    table = (DataTable)setOrTable; 

    foreach (DataRow row in table.Rows.Cast<DataRow>().ToList()) 
    { 
     DbProviderFactory factory; 
     try 
     { 
      factory = DbProviderFactories.GetFactory(row); 
     } 
     catch (Exception) 
     { 
      continue; 
     } 

     var profType = typeof(MvcMiniProfiler.Data.EFProfiledDbProviderFactory<>).MakeGenericType(factory.GetType()); 


     DataRow profiled = table.NewRow(); 
     profiled["Name"] = row["Name"]; 
     profiled["Description"] = row["Description"]; 
     profiled["InvariantName"] = row["InvariantName"]; 
     profiled["AssemblyQualifiedName"] = profType.AssemblyQualifiedName; 
     table.Rows.Remove(row); 
     table.Rows.Add(profiled); 

    } 

यह कुछ प्रतिबिंब हैक्स और एफई के नवीनतम संस्करण पर पूरी तरह से बम की आवश्यकता है

यह Frans और Ayende दोनों द्वारा प्रलेखित किया गया था।

मैं अपने प्रोफाइलिंग कारखानों और परिवार को एक मजबूत और सुरुचिपूर्ण तरीके से कैसे तारूं?
क्या मेरा कॉलबैक पाने का कोई और तरीका है?

उत्तर

9

सबसे आसान तरीका Entity Framework tracing wrappers का उपयोग करना और EFTracingConnection के CommandFinished में उपयोग करना सबसे आसान तरीका है। यह आपको प्रारंभ समय नहीं देता है, लेकिन यह आपको अवधि देता है (जो, Now से घटाया गया है, संभवतः पर्याप्त निकट है)।

मैं कोड प्रभाव को "मध्यम" कहूंगा, क्योंकि आपको मौजूदा संदर्भ वर्ग में संदर्भ बदलना होगा। हालांकि, यह बहुत सरल है।

यदि आप केवल ट्रेसिंग चाहते हैं और वास्तविक कॉलबैक की आवश्यकता नहीं है, तो NuGet पैकेज में simple default tracing system है।

संपादित करें (स्टैक ट्रेस जोड़ा गया): ईएफ ट्रेसिंग रैपर आपको स्टैक ट्रेस नहीं देते हैं। आप स्रोत प्राप्त कर सकते हैं और बिना किसी कठिनाई के इसे जोड़ सकते हैं, लेकिन मुझे लगता है कि प्रदर्शन पर असर पड़ेगा।

+0

प्रश्न EFv4.1 का उल्लेख कर रहा है। मुझे यकीन नहीं है कि ट्रेसिंग रैपर डीबीकॉन्टेक्स्ट एपीआई के साथ काम करता है या नहीं। मैं इसे लंबे समय तक आजमाने की कोशिश करता हूं लेकिन मैंने अभी भी इसे जांच नहीं लिया है। –

7

हालांकि यह एक वाणिज्यिक उत्पाद है, मैं दृढ़ता से EF Prof को देखने की भी सिफारिश करता हूं। इस उपकरण को आयुन्डे (ओरेन ईनी वर्तनी?) द्वारा विकसित किया गया है, जिन्होंने अन्य उत्पादों के बीच एनएच प्रोफेसर, उबर प्रोफेसर (एनएच + ईएफ प्रोफेसर) और रावेनडीबी भी बनाया है।

अपने एनएच प्रोफेसर को खरीदने के बाद, एनएच को ट्यून करते समय यह अमूल्य था और मुझे उम्मीद है कि ईएफ प्रोफेसर क्रमशः मूल्यवान होगा।

+1

हमारे पास पहले से ही एक ओपन सोर्स अर्ध कामकाजी समाधान है, http://code.google.com/p/mvc-mini-profiler/source/browse/MvcMiniProfiler/Data/ProfiledDbConnection.cs समस्या यह है कि यह perf leaks और plays पहले ईएफ कोड के साथ। मुझे पूरा यकीन है कि आयुर्वे के पास एक ही समस्या है। पूर्ण संदर्भ के लिए स्टीफेंस उत्तर पर मेरी टिप्पणी देखें। –

+0

@ सैम केसर मैंने आपके उत्तर पर एक नज़र डाली लेकिन मुझे वास्तव में कुछ भी ऐसा नहीं लगता जो ईएफ प्रोफेसर से संबंधित है। यह बहुत अच्छी तरह से हो सकती है, लेकिन शायद आपको ईएफ प्रोफेसर को आजमाएं और पता लगाना चाहिए? या सीधे Ayende के साथ बात करते हो? वह निश्चित रूप से अपने ब्लॉग और Google समूहों के माध्यम से उपयोगकर्ताओं के सवालों का जवाब देता है। –

+0

उपरोक्त ईएफप्रोफ सिफारिश में 2 -1 वोट हैं, जबकि ईएफप्रोफ की सिफारिश में 7 +1 वोट हैं। मुझे लगता है कि मैं पागल गोलियाँ ले रहा हूँ! –

0

पहला: यदि आप कस्टम कार्यान्वयन की तलाश में हैं, तो आप सीधे ईएफ में अपना स्वयं का कार्यक्रम ट्रिगर कर सकते हैं। एडीओ.NET टीम किसी भी तरह के विस्तार बिंदुओं को लागू करने के लिए भूल गई है और वे किसी भी लॉगिंग को लागू करने के लिए भी भूल गए हैं (ObjectQuery/DbQuery को एसक्यूएल में परिवर्तित करने के अलावा, लेकिन यह आलसी लोडिंग या डेटा संशोधनों को संभाल नहीं करता है)।

मैं एफई के साथ प्रयोग किया हर अनुरेखण कार्यान्वयन कस्टम DbProviderFactory जो वास्तविक कारखाने लपेटता है और लपेटता असली Connection, Command, आदि यही कारण है कि बहुत स्पष्ट रूप से उल्लेख किया अनुरेखण रैपर में वर्णन किया गया बनाने के द्वारा किया जाता है विश्वास करते हैं।

वाणिज्यिक उपकरण जो पहले से ही तुम क्या चाहते

  • उल्लेख किया एफई प्रोफेसर महान उपकरण है करने के लिए कर रहे हैं, लेकिन यह सीट प्रति $ 300 लागत।
  • वैकल्पिक Huagati Query Profiler है। विशेष रूप से this screen shot ऐसा लगता है कि आप क्या देख रहे हैं। कीमत बहुत कम है (प्रति सीट $ 40) और यह लिंक-टू-एसक्यूएल, एंटिटी फ्रेमवर्क और एलएलबीएलजेन का समर्थन करती है।

दोनों टूल्स में नि: शुल्क परीक्षण है ताकि आप उन्हें डाउनलोड कर सकें और उन्हें आजमा सकें।

बीटीडब्ल्यू। यदि आपके पास वीएस 2010 अल्टीमेट है तो शायद आप इंटेलि ट्रेस से बहुत सारी जानकारी प्राप्त कर सकते हैं। आप MSDN Magazine में वर्तमान में उपलब्ध सभी विकल्पों के बारे में पढ़ सकते हैं।

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

+0

मैं इसे dbcontext के साथ काम करना चाहता हूं ... यह काम एमवीसी मिनी प्रोफाइलर के लिए है, स्टीफेंस उत्तर पर टिप्पणियां देखें ... –

+0

बस यह कहना है कि ईएफ 6 के साथ अब आपके पास इंटरसेप्शन पॉइंट हैं और आप टाइमर और लॉगर्स जोड़ सकते हैं। IDbCommandInterceptor पर एक नज़र डालें।मैं 'लंबे समय से चलने वाले' प्रश्नों का पता लगाता हूं और एक चेतावनी के साथ पूर्ण एसक्यूएल लॉग करता हूं ताकि उन्हें लॉग से उठाया जा सके। –

0

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

http://efprof.com/

+0

मैं एक प्रोफाइलर की तलाश नहीं कर रहा हूं, मैं एक तकनीक की तलाश में हूं जो प्रोफाइलर उपयोग कर सकते हैं। –

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