none
time out RRS feed

  • שאלה

  • ש לי פונקציה שאוספת עבור ID מסויים נתונים מכמה טבלאות ומחזירה אותם במבנה של טבלה.
    אני מפעילה את הפוקנציה הזו מתוך פרוצדורה עבור רשימה של IDs.
    את הפרוצדורה אני מפעילה מקוד C#. 
    על 70 IDs זה מצליח. על 100 אני מקבלת הודעת timeOut.
    (כמובן שהגדלתי את הגדרת הtimeOut בconnectionString.)
    האם זו מגבלה של הsqlServer? האם יש אפשרות לשנות את זה?
    יום ראשון 15 מרץ 2015 09:29

תשובות

  • לילה טוב שרה,

    אני קצת עסוק ואין לי שמן לחפש מדריך טוב לנושא.

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

    דרך אגב, אני אשמח לראות את חברי הפורום באים לשמוע!
    שמתי הזמנה עם פרטים בהודעה בראש הפורום. זו הרצאה באינטרנט ולכן אין סיבה לא להגיע בעקרון :-) לא צריך לצאת מהבית אפילו

    לגבי השאלה שלך:

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

    2. קשה לי מאוד לעבוד עם הודעות שגיאה בשפות מוזרות כמו עברית. אני חושב שכבר המלצתי לך פעם לנסות לעבור למערכת אנגלית. זה יקשה עלייך לבצע חיפוש בגוגל למשל וזה מאוד לא מומלץ למפתחים.

    בכל מקרה הודעת השגיאה המקבילה באנגלית היא למשל:
    System.ComponentModel.Win32Exception: The wait operation timed out
    את יכולה לחפש עוד חומר גם בגוגל.

    3. ההודעה שצירפת וגם אני שמתי כא מעל היא לא כל ההודעה אלא רק החלק המקוצר. עלייך למצוא את ההודעה המקורית המלאה בקובץ הלוג.

    4. אם את מנסה להעביר תוכן רב מהשרת אל האפליקציה אז הבעיה יכולה להיות בכך ולא בזמן הרצת השאיתה עצמה.

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

    5. יש למשל אפשרות לקבוע את הזמנים גם ברמת ה COMMAND עצמו.

    e.Command.CommandTimeout = 60

    6. בכל מקרה כשאי להריץ את השאילתות גם דרך ה SSMS ולבדוק את ההתנהגות.


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]


    • נערך על-ידי pituachMVP, Editor יום ראשון 15 מרץ 2015 23:07
    • סומן כתשובה על-ידי Eran Sharvit יום רביעי 18 מרץ 2015 11:31
    יום ראשון 15 מרץ 2015 23:06
    מנחה דיון

כל התגובות

  • שלום שרה,

    בדרך כלל כאשר את רוצה לזאול "האם זו מגלבה של SQL Server" אז עלייך לזכור ששרתי SQL נועדו לעבוד עם מסדי נתונים בגודל של חצי מליארד גיגה בייט. לכן כניראה שהבעיה לא קשורה למגבלות של השרת :-)
    תעברי על הקישור הבא, רק כדי לקבל מושג ככללי על יכולות השרת
    שרתי SQL יכולים גם להרית שאילתות שלוקח כמה ימים (היו לי שאילתות שהיינו מריצים ביום שישי כדי לקבל תשובה ביום ראשון).

    על מנת לבדוק מה קורה אצלך אנחנו צריכים לבדק את הנתונים הרלוונטיים כמובן ואת הקודים הרלוונטיים ולראות את מבנה מס הנתונים. בלי מידע אנחנו רק יכולים לשחק במשחק הניחושים :-(

    מעל הכל אנא צרפי הודעות שגיאה מדוייקות שאת מקבלת כדי שנוכל לכוון טוב יותר.

    ** הודעת ה timeout יכולה לנבוע מ timeout של האפליקציה שממתינה לקבל תשובות מהשרת או מההתחברות לשרת. את יכולה להגדיר בשרשרת התחברות 
    Connect Timeout=120
    אם את רוצה לתת זמן ארוך יותר (זמן ארוך יותר אומר תפיסת משאבים ליותר זמן).


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]

    • הוצע כתשובה על-ידי Eran Sharvit יום ראשון 15 מרץ 2015 11:34
    יום ראשון 15 מרץ 2015 10:48
    מנחה דיון
  • הודעת השגיאה שאני מקבלת היא:
    System.ComponentModel.Win32Exception: ‏‏פג תוקפו של פסק הזמן שהוקצב לפעולת ההמתנה

    הגדרת הconnection  שלי נראית כך:
    Data Source=PC\SQLEXPRESS;Initial Catalog=XXXX;Integrated Security=True;MultipleActiveResultSets=True;Connect Timeout=6000000

    ההודעה נזרקה אחרי פחות מדקה.

    קשה עד בלתי אפשרי לצרף את כל מבנה הנתונים שלי.

    היכן עוד ניתן להגדיר את משך זמן הפעולה?

    אודה לעזרתך.

    יום ראשון 15 מרץ 2015 11:55
  • לילה טוב שרה,

    אני קצת עסוק ואין לי שמן לחפש מדריך טוב לנושא.

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

    דרך אגב, אני אשמח לראות את חברי הפורום באים לשמוע!
    שמתי הזמנה עם פרטים בהודעה בראש הפורום. זו הרצאה באינטרנט ולכן אין סיבה לא להגיע בעקרון :-) לא צריך לצאת מהבית אפילו

    לגבי השאלה שלך:

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

    2. קשה לי מאוד לעבוד עם הודעות שגיאה בשפות מוזרות כמו עברית. אני חושב שכבר המלצתי לך פעם לנסות לעבור למערכת אנגלית. זה יקשה עלייך לבצע חיפוש בגוגל למשל וזה מאוד לא מומלץ למפתחים.

    בכל מקרה הודעת השגיאה המקבילה באנגלית היא למשל:
    System.ComponentModel.Win32Exception: The wait operation timed out
    את יכולה לחפש עוד חומר גם בגוגל.

    3. ההודעה שצירפת וגם אני שמתי כא מעל היא לא כל ההודעה אלא רק החלק המקוצר. עלייך למצוא את ההודעה המקורית המלאה בקובץ הלוג.

    4. אם את מנסה להעביר תוכן רב מהשרת אל האפליקציה אז הבעיה יכולה להיות בכך ולא בזמן הרצת השאיתה עצמה.

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

    5. יש למשל אפשרות לקבוע את הזמנים גם ברמת ה COMMAND עצמו.

    e.Command.CommandTimeout = 60

    6. בכל מקרה כשאי להריץ את השאילתות גם דרך ה SSMS ולבדוק את ההתנהגות.


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]


    • נערך על-ידי pituachMVP, Editor יום ראשון 15 מרץ 2015 23:07
    • סומן כתשובה על-ידי Eran Sharvit יום רביעי 18 מרץ 2015 11:31
    יום ראשון 15 מרץ 2015 23:06
    מנחה דיון
  • הי,

    הבעיה נמצאת בקוד. את מריצה פרוצדורה מהאפליקציה. בתוך הפרוצדורה את עושה כל מיני דברים, בין היתר את קוראת לפונקציה בתוך לולאה, ובכל איטרציה הפונקציה אוספת נתונים מכמה טבלאות. כל הסיפור הזה נשמע מאוד לא יעיל, ולא פלא שהוא לוקח הרבה זמן, ובסופו של דבר נכשל בגלל Timeout. זה גם הגיוני שזמן הריצה מתנהג באופן ליניארי. כלומר: עד כמות מסוימת של IDs הפרוצדורה מצליחה לסיים לפני ה-Timeout, ומעל זה כבר לא.
    הפתרון הנכון הוא, כמובן, לשכתב את הקוד. צריך לנסות להגיע למצב שהפרוצדורה אוספת נתונים לכל ה-Ids ביחד ללא הלולאה וללא הפונקציה. ברגע שתצליחי לעשות את זה, הקוד שלך יטוס ביחס למה שקורה עכשיו, והוא גם יהיה סקלבילי. הוא יטוס גם עבור 70 IDs, גם עבור 100 IDs וגם עבור 10,000 IDs.
    מקווה שעזרתי...

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    http://www.madeirasql.com


    יום שלישי 31 מרץ 2015 05:48
    מנחה דיון
  • [+1] זו הערה כללית מאוד נכונה ומאוד חשובה, אבל יש כמה סייגים ממנה, כקביעה כללית, כאשר אנחנו דנים בפיתוח אפליקציות ולא רק בצד של ה DBA.

    ישנם מספר ORM כמו למשל EF אשר מכירים בייתרונות השונות של השיטות להבאת הנתונים, ולכן מציעים לנו שימוש בדרכים שונות. יש סיבה שהדברים המובנים שם מאפשרים שיטות שונות. למשל אני מציע לקרוא על ההבדלים בין:
    Explicit Lazy Loading and Implicit Lazy Loading ובין  eager loading

    * יותר מכך, גם במבט הכללי מבחינת הלוגיקה של אפליקציה לגשת בכלל לנתונים יש להתחשב בגורמים שונים. אפליקציית WEB כמו פורום היא דוגמה טובה מאוד לכך שלעיתים אנחנו נרצה קודם לטעון את הודעות האב, ורק אחרי כן לטעון את הודעות הבנים אולי. שיטה אחרת היא לטעון הודעה אחרי הודעה (או קבוצות של X הודעות בכל פעם) כמו למשל בפייסבוק. צריך לזכור שהאפליקציה יכולה לנהל משימות מרובות בו זמנית ולהתחיל לעבד תוצאות שמגיעות תוך כדי בלי צורך להמתין לסיום. כך למשל בפייסבוק כאשר אנחנו גוללים למטה ניתן לראות שהודעות נוספות "מגיעות". האפשרות לטעון הודעה אחרי הודעה מאפשרת לנו לקבל תצוגה בסיסית של העמוד מהר בלי להמתין... נכון, זה אומר שאנחנו פונים למסד הנתונים יותר פעמים. צריך לזכור שאפליקציות מרוחקות סובלות מזמן העברת הנתונים ולא רק מזמן הרצת השאילתה על השרת מסד הנתונים, ולעיתים גם מהצורך לעבד את המידע שהגיע תוך כדי בלי צורך להמתין לסיום. לכן הקביע צריכה להיות לכל מקרה לגופו של עניין, תוך כדי אפיון של המערכת.

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


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]

    יום שלישי 31 מרץ 2015 06:23
    מנחה דיון