none
פתיחת connection בlinq RRS feed

  • שאלה

  • שלום לכולם!!

    אני מריצה script שעושה הרבה דברים, ומאד כבד.

    כדי ליעל אותו פתחתי את sql profiler, ואני רואה המון פתיחות של connections וסגירות שלהם.

    בגלל שאני עובדת עם linq אני לא מטפלת בזה, זה אוטומטי.

    אשמח אם משהו יוכל להסביר לי לפי מה linq מחליט מתי לפתוח ולסגור את הconnection/

    זה נראה שעל כל פעולה פשוטה של select או update נפתח ונסגר connection.

    אולי אני עושה משהו לא בסדר, או שיש לי אפשרות להגדיר....

    אשמח לשמוע חוות דעת.

    תודה!!!!!

    שרה.

    יום רביעי 11 ספטמבר 2013 07:57

תשובות

כל התגובות

  • בוקר טוב

    הנה כמה נקודות שיכולות לעזור אני מקווה (דרך אגב, השאלה יותר מתאימה לפורום דוט נט)

    1. גם בעבודה עם LINQ יש לך שליטה מלאה על הדברים ולא חייבים לעבוד בברירת המחדל. LINQ היא בסך הכל שפת שאילתות שהיתרון האמיתי הגדול והיחיד שלה הוא בכך שמי שלומד אותה יכול להישתמש בה לגישה לנתונים בכל פלטפורמה כמעט ולא רק למסדי נתונים בניגוד לשפת SQL שנועדה לעבודה מול מסדי נתונים בלבד. LINQ מאפשרת למשל גישה לקבצים, גישה לנתונים במערך או לכל אוסף שהוא למעשה, ובפרט לעבודה מול נתונים במסדי נתונים.

    2. שימוש בפרופיילר של SQL SERVER במקביל לעבודה מול מסדי נתונים ברמת הפיתוח היא תמיד פעולה חכמה, אבל צריך להבין מה את מנטרת. את לא מנטרת כלום שקשור ל LINQ מכיוון שהשרת SQL לא מכיר את השפה. את מנטרת רק את התרגום הסופי והפניות (אני רק מדגיש למי שלא יודע ואני דיי בטוח שאת מבינה מה עשית.. לא הרבה פותחים פרופיילר לצערי). זה לא הניטור ממנו יש להתחיל והוא אינו הניטור הבסיסי מבחינת פיתוח תוכנה אלא רק ניטור המצב הכללי ואיתור הקביעה שיש כניראה בעיה...

    3. לא ציינת באיזה ORM את עובדת. LINQ היא רק השפה אבל קיים קשר למסד הנתונים דרך ORM כלשהו כמו entity framework למשל. זה חשוב מכיוון שה ORM אחראי על התרגום ועל הגישה למסד הנתונים עצמו.

    4. העבודה עם LINQ היא עבודה של המפתח ולא קשורה ל DBA ולכן ניטור העבודה הוא חלק מעבודת המפתחים. ישנם כלים רבים לניטור LINQ ברמת הפיתוח והם הדרך הנכונה לביצוע הניטור עליו את מדברת. הניטור ברמת השרת SQL צריך להגיע רק ברמה השנייה של העבודה ובדרך כלל לא נגיש למפתחים אלא ל DBA (אלא אם יש מנהל CTO או מי שמחזיק בידע של מספר כובעים)

    5. הנקודה הכי חשובה היא לעבור לעומק ולהבין מה קורה באפליקציה שלכם ומה ההבדל בין למשל eager loading לעומת lazy loading. ייתכן מאוד שהמפתח שלכם עובד בצורה לא נכונה ופונה למסד הנתונים יותר מדי פעמים או לחילופין פחות מדי פעמים בשאילתות שמשאירות את הקשר למסד הנתוניפם פתוח יותר זמן.

    https://www.google.co.il/webhp?sourceid=chrome-instant&ie=UTF-8&ion=1#q=eager+loading+vs+lazy+loading

    דרכים לניטור LINQ (דגש חזק על האופציה הראשונה)

    * http://miniprofiler.com/
    The profiler is available in NuGet under the name MiniProfiler and is licensed under Apache License, Version 2.0.
    A simple but effective mini-profiler for .NET and Ruby

    THIS IS MY PREFERRED PROFILER!

    * The Entity Framework ObjectContext.ToTraceString Method
    http://msdn.microsoft.com/en-us/magazine/gg490349.aspx

    SqlServerQueryVisualizer.dll

    http://dotnetstories.wordpress.com/2008/11/19/how-to-monitor-and-debug-linq-to-sql-queries/

    * LINQ to Entity Visualizer

    VS add-in. Visualizer to see what queries will be issued based on your ObjectQuery (LINQ to Entities) query. You can also preview the results.

    http://visualstudiogallery.msdn.microsoft.com/99468ece-689b-481c-868c-19e00e0a4e69/

    * linqtosql profiler
    NOT FREE
    http://www.hibernatingrhinos.com/products/l2sprof
    http://www.youtube.com/watch?v=c_taW3C4o4M

    * SQL Server profiler
    create a new trace in profiler
    go to the Event Selection tab and uncheck all the events
    select show all events 
    find the event which says SQL:StmtCompleted 
    check the column of TextData to be display.

    signature

    יום ראשון 15 ספטמבר 2013 07:34
    מנחה דיון
  • דבר ראשון תודה על התגובה המפורטת!!!!

    זה לא ברור מאליו!!!!!!!!

    אני עובדת כרגע עם entity framework.

    עד היום הגישה לDB הייתה אצלי דרך stored procedure של SQL.

    ניסיתי את linq to entity רק בגלל הנוחות.

    נגשתי לprofiler כדי לבדוק את איכות השאילתות שהlinq מיצר, וראיתי שיש  פתיחה וסגירה של connecrions כל הזמן.

    אין לי מושג איך מגדירים לlinq להשאיר את הconnection פתוח, ניסיתי לפתוח אותו בתחילה הפעילות בצורה ידנית ולסגור בסוף (ObjectContext.Connection.Open()) אבל כנראה שזו לא הצורה...

    יש לי הרגשה שאני הולכת לוותר על linq to entity, נראה לי שהוא טוב לDB קטן ונחמד, אבל כשמתעסקים עם משהו גדול עם יותר צרכים משתנים זה כבר מדי גדול עליו. :(:(:(

    אני טועה?

    שוב תודה!!!!! על הרצון והנכונות, ועל הזמן שהשקעת בקריאה ובתשובה!!!!!!!

    שרה.

    יום שני 16 ספטמבר 2013 07:51
    • סומן כתשובה על-ידי ssfrank יום שני 16 ספטמבר 2013 11:43
    יום שני 16 ספטמבר 2013 11:23
  • נכון, זו התשובה.

    גם אני מצאתי את זה לפני כמה דקות...

    תודה!!!!!!!!!!!

    שרה.

    יום שני 16 ספטמבר 2013 11:43