"unable to open database file" ב sqlite

כרמית ש1

New member
"unable to open database file" ב sqlite

שלום,
לא יודעת אם זה הפורום הנכון לשאול בו...
יש לי אפליקציה שכתובה בשפת C על מכשיר עם מערכת הפעלה אובונטו.
בסיס הנתונים של האפליקציה SQLITE.
האפליקציה כל הזמן אוספת נתונים (מהמשתמש) ושומרת לטבלאות בבסיס הנתונים.
ייתכנו ביום מאות פעמים של איסוף נתונים ושמירה לבסיס הנתונים (למשל כמו קופה בחנות ששומרת עסקאות).
הבעייה שלעיתים באחת השמירות לבסיס הנתונים - הפעולה נכשלת ואני מקבלת שגיאה (sqlite3_errmsg) של "unable to open database file". בשמירה הבאה הכל נראה כרגיל ועובד תקין.
מה יכולה להיות הבעיה?
לא תתכן בעייה של מקום בדיסק. כי הרי הפעולות הבאות מצליחות.
בעייה של העדר Handles במערכת נבדקת...
מה עוד יכול לגרום לתקלה כזו? זה לא מפרט למה הוא לא מצליח לפתוח את בסיס הנתונים...
אשמח לכל עצה/תגובה/המלצה...
תודה רבה!
 
נשמע שאת "מניחה הנחות". את מהנדסת - אל תניחי.

תבדקי.
יתכן שיש בעיית זכרון - that's what df is for
יתכן שיש בעייה של מצביעים לקבצים - that's what lsof is for
לא ציינת באיזה locking mode את עובדת (אני לא יודע אם זה רלוונטי, זה פשוט הדבר הראשון שהייתי מנסה לשנות).
 

כרמית ש1

New member
לתגובתך...

תודה על התגובה!
לגבי בעיית זיכרון - כבר שמתי פקודת DF לבדיקה.
לגבי בעיית מצביעים - שמתי פקודה לבדיקת ניצול ה- handles במערכת (sysctl fs.file-nr). זה לא מכסה את העניין של מצביעים?
מה זה בדיוק ה - locking mode? אין לי שום הגדרה כזו בקוד. האם זה אומר שאני עובדת ב locking_mode=NORMAL?
תודה רבה!!!!!!
 
נשמע שהגיע הזמן עבורך לקחת כוס קפה ולהתחיל לקרוא

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

* השגיאה שהראית אינה מצביעה על בעיית נעילות. היית אמורה לקבל הודעה ברורה בסגנון SQLITE_LOCKED.
 

פרסאוס

New member
כמה אפשרויות:

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

כרמית ש1

New member
נעילות...

תודה על התגובה !!
איך אני בודקת נעילות?
והאם יתכן שבאותה הפעולה שאני מבצעת פעמיים - פעם אחת יהיה נעול ופעם אחת לא?
תודה רבה!!
 
זה אפשרי אם תהליך נוסף ניגש לבסיס הנתונים

בתזמונים שונים, ואם יש גישה כפולה, הגישה השניה "ננעלת".
&nbsp
פתרון אפשרי:
try & catch כאשר בcatch תפעילי timer עם מספר אקראי של אלפיות שניה (לא פחות מ-40, לא יותר מזמן המחזור של התוכנה שלך) שינסה לכתוב שוב. אם נכשל שוב - אז לצאת.
&nbsp
לחליפין - לדאוג שרק קוד יחיד יגש לבסיס הנתונים בכל המערכת, להוסיף api שינהל תור.
 
למעלה