פתיחת מסד נתונים בכל קריאה
-
אני בונה שרת בGO עם מסד נתונים MYSQL (עם הרבה קריאות בו זמנית)
נראה לי שיש לי שתי אפשרויות- לפתוח את המסד נתונים כשהשרת קם ולהעביר את המשתנה לתוך כל הפונקציות
- לפתוח את המסד נתונים בכל קריאה בתוך כל פונקציה
מה עדיף?
האם יש בעיה להשאיר את המסד נתנוים פתוח כל הזמן ולסגור אותו רק כשהשרת נסגר?
-
זה שאלה מענינת,
ב PHP קיים פונקציה שמשחחרר את זיכרון השאילתא ע"יmysqli_free_result($result)
לכאורה כשתפתח כל הזמן חיבורים לוקח יותר תעבורה.
-
@nigun ההמלצה היא ליצור מאגר חיבורים ולהשתמש בו, חפש משהו כמו pool connection
-
@nigun ההמלצה היא ליצור מאגר חיבורים ולהשתמש בו, חפש משהו כמו pool connection
-
@nigun אם אני מבין נכון כתוב שם שזו ברירת המחדל של הדריבר והאו מנהל את המאגר, אתה רק מקצה משתנה גלובלי שמקבל את הערך מ
sql.Open
וזה מחזיק את המאגר -
@nigun אם אני מבין נכון כתוב שם שזו ברירת המחדל של הדריבר והאו מנהל את המאגר, אתה רק מקצה משתנה גלובלי שמקבל את הערך מ
sql.Open
וזה מחזיק את המאגר@יוסף-בן-שמעון
אני יודע שאני יכול לעשות את זה (לכן שאלתי)
השאלה היא מה ההשלכות? -
בכל הכלים המודרניים שיש היום, יצירת קונקשיים חדש עושה שימוש בconnection pull שזה אוסף של קונקשנים מנוהל.
שימוש באותו חיבור למסד, עושה בעיות במקביליות ובטרנזקציות נדמה לי ועוד כמה דברים שאינני מבין בהם. אני לא מבין בהם כי אין צורך, אני לא ממציא את הגלגל ואם אומרים לי ליצור חיבור כל פעם (עם מנהל שמאחורי הקלעים ממחזר אם צריך) אני מסודר.
תשובה יפה בנושא הזה, במקרה שם זה על דוטנט: https://softwareengineering.stackexchange.com/a/398790/112215 -
בכל הכלים המודרניים שיש היום, יצירת קונקשיים חדש עושה שימוש בconnection pull שזה אוסף של קונקשנים מנוהל.
שימוש באותו חיבור למסד, עושה בעיות במקביליות ובטרנזקציות נדמה לי ועוד כמה דברים שאינני מבין בהם. אני לא מבין בהם כי אין צורך, אני לא ממציא את הגלגל ואם אומרים לי ליצור חיבור כל פעם (עם מנהל שמאחורי הקלעים ממחזר אם צריך) אני מסודר.
תשובה יפה בנושא הזה, במקרה שם זה על דוטנט: https://softwareengineering.stackexchange.com/a/398790/112215 -
בכל הכלים המודרניים שיש היום, יצירת קונקשיים חדש עושה שימוש בconnection pull שזה אוסף של קונקשנים מנוהל.
שימוש באותו חיבור למסד, עושה בעיות במקביליות ובטרנזקציות נדמה לי ועוד כמה דברים שאינני מבין בהם. אני לא מבין בהם כי אין צורך, אני לא ממציא את הגלגל ואם אומרים לי ליצור חיבור כל פעם (עם מנהל שמאחורי הקלעים ממחזר אם צריך) אני מסודר.
תשובה יפה בנושא הזה, במקרה שם זה על דוטנט: https://softwareengineering.stackexchange.com/a/398790/112215 -
חשבתי שמפה כבר הבנת את המסקנא.
צור חיבור בכל מקם שאתה משתמש וסגור אותו מיידית.
זה מה שמוחלט גם שמה, ויש שמה עצה למקרים שבו רוצים לחסוך את זמן פתיחת החיבור מחדש ע"י הארכת משך הזמן שמאחורי הקלעים משאירים אותו חי. -
תפתח ותסגור כמו ילד טוב את המסד כל פעם וכל מקום שאתה משתמש בו.
בלי לחשוב/לדעת/להבין מה קורה (בינתיים)...
האם אתה מתקשה לעשות זאת? או שמשהו לא עובד כשורה? -
@dovid
לא
אמנם זה דרש פקודת החלף קטנה, אבל זה לא נורא
אבל השאלה שלי מה נכון לעשות.
(למה שאני יגלה את עמצי תקוע עוד שנה בגלל שיש מידי הרבה חיבורים תקועים) -
@nigun אז אני יכתוב ליתר בטחון שוב: זה בדיוק מה שהכי נכון לעשות.
אתה יכול ללכת בשמחה שאת הבעיה הזו פתרת בצורה הטובה ביותר! נקסט, לבעיות אחרות.@dovid חושבני שלא זו הכוונה, כשאתה פותח מאגר חיבורים מנוהל, אתה לא אמור לסגור אותו אחרי כל שאילתה, המאגר מנהל את יצירת החיבור וסגירתו.
אם הוא יסגור כל פעם את המאגר זה יצור עומס מיותר לחלוטין
לפי ההוראות בגיטהאב, וכך גם בלינק שהוא הביא מסטאק, צריך להגדיר משתנה גלובלי שמקבל את הערך מ sql.Open וזה מחזיק את המאגר המנוהל, מכאן ואילך הוא צריך לבקש מהמאגר חיבור פנוי ולתשאל אותו על ידי db.QueryRow וזהו -
לא ביקשתי שייצור מאגר, אם ככה היה נשמע זה ראיה טובה לזה שאני לא מכיר את go.
מה שאמרתי שצריך להיות ככה
--פתיחת חיבור
----תשאול
--סגירת חיבור
כל מקום ומקום שבשימוש. לגבי הבזבוז שבסגירה יש את ניהול הpool שאמרתי בבטחון שהוא לבטח קיים בgo (שזה אומר שהחיבור לא נסגר ומתי שפותחים חיבור חדש בעצם ייעשה בו שימוש חוזר).
אני לא יודע איך בגו פותחים חיבור, ייתכן שזה אוטומטי כפי שאתה אומר אני לא יודע.
ממילא אם השאלה של @nigun זה מה לעשות תכלס אני יענה לעבור לC#כי אני לא מכיר go.
-
לא ביקשתי שייצור מאגר, אם ככה היה נשמע זה ראיה טובה לזה שאני לא מכיר את go.
מה שאמרתי שצריך להיות ככה
--פתיחת חיבור
----תשאול
--סגירת חיבור
כל מקום ומקום שבשימוש. לגבי הבזבוז שבסגירה יש את ניהול הpool שאמרתי בבטחון שהוא לבטח קיים בgo (שזה אומר שהחיבור לא נסגר ומתי שפותחים חיבור חדש בעצם ייעשה בו שימוש חוזר).
אני לא יודע איך בגו פותחים חיבור, ייתכן שזה אוטומטי כפי שאתה אומר אני לא יודע.
ממילא אם השאלה של @nigun זה מה לעשות תכלס אני יענה לעבור לC#כי אני לא מכיר go.
@dovid אכן, עכשיו אני מבין שנכנסתי לסוגיא בראש של נוד, אם אתה עושה close אתה הורג את המאגר, צחוק הגורל שדוטנט השפה הכי עילית שרק עושים פווו ויש לך אפליקציה, דוקא הם לא טרחו להסתיר ממך את המימוש של סגירת חיבור והחזרתו למאגר, ואילו בנוד ובגו שלכאורה הרבה יותר "ברזליות", המימוש הזה מוסתר מעיני המפתח
-
@dovid אכן, עכשיו אני מבין שנכנסתי לסוגיא בראש של נוד, אם אתה עושה close אתה הורג את המאגר, צחוק הגורל שדוטנט השפה הכי עילית שרק עושים פווו ויש לך אפליקציה, דוקא הם לא טרחו להסתיר ממך את המימוש של סגירת חיבור והחזרתו למאגר, ואילו בנוד ובגו שלכאורה הרבה יותר "ברזליות", המימוש הזה מוסתר מעיני המפתח
@יוסף-בן-שמעון
אז מה אני אמור לעשות?- ליצור משתנה גלובלי
2.לבצע פתיחה רק פעם אחת
- ליצור משתנה גלובלי
-
@יוסף-בן-שמעון
אז מה אני אמור לעשות?- ליצור משתנה גלובלי
2.לבצע פתיחה רק פעם אחת
- ליצור משתנה גלובלי