PDA

View Full Version : سوال: جلوگیری از پاک شدن اطلاعات در هنگام قطع برق



unique1984
سه شنبه 19 بهمن 1389, 07:54 صبح
سلام
فر ض کنید در یک برنامه (مثلا حسابداری فروشگاه) چندین فرم مهم داریم که اطلاعات ورودی در اونها هم تقریبا زیاده(مثلا فاکتور فروش یا خرید) حالا اگه در حین فاکتور زدن، برق قطع بشه و UPS هم نداشته باشیم اطلاعات وارد شده ، از بین میرن.
اگه خواسته باشیم بعد از وصل شدن برق همون فرم فاکتور باز بشه (با همون اطلاعاتی که وارد کرده بودیم)
چه راهکارهایی وجود داره؟
ممنون میشم با ارائه دلیل و مثال توضیح بدین.

FastCode
سه شنبه 19 بهمن 1389, 13:53 عصر
راهکار دیتابیسی ای که برای این کار وجود داره اینه که وقتی کاربر داره اطلاعات رو وارد میکنه شما اونها رو در دیتابیس ذخیره کنید و وقتی درخواست ثبت اطلاعات و داد فقط یک flag رو که نشون دهنده ثبت شدن اطلاعات هست رو عوض کنید.
مثلاً فکر کنید این یک کالا در یک فاکتور:
ID
Factor_Frosh_ID
Kala_ID
U_User_ID
Count
Price
Percent
Commited*
وقتی کاربر اطلاعات رو در برنامه وارد میکنه شما سطر ها رو در بانک وارد کنید و فقط ستون آخر رو که باید bit/bool باشیه رو 0 بزارید.
وقتی کاربر اطلاعات رو تایید کرد 0 ها رو بکنید 1.
وقتی بکاربر login میکنه, برنامه بین تمام اطلاعات وارد شده توسط کاربر(این کار رو احتمالاً باید برای همه/چند تا از table ها انجام بدید.) جست و جو کنه و سطرهایی رو که مشکل دارند رو در فرم مربوطشون باز کنه و از کاربر بخواد که ثبت اطلاعات رو تموم کنه.

نوشتنش زمان میبره ولی مسیر مشخصه و اگر چیزهایی رو که میخواهید خودتون روی کاغذ ببرید و دقیق روش کار کنید میتونید بدون مشکل یک برنامه خوب بنویسید.

saeidi.yusuf
سه شنبه 19 بهمن 1389, 14:05 عصر
دوست عزیز سلام:
در تکمیل حرف های دوستمون"fastcode" می تونید اطلاعات را به صورت local مثلا در یک سند xml ذخیره کنید تا هم بار روی سرور database کمتر بشه و هم مدیریتش راحتر باشه.هر وقت هم که کاربر خواست login کنه xml و چک کن اگر توش data بود اون وقت فرم با این اطلاعات پر کن.

shuriken
سه شنبه 19 بهمن 1389, 14:44 عصر
سلام
بنظر من روش دومی که ارائه شد بهتره
چون در روش اول سربار اطلاعاتن روی دیتا بیس زیاده و ممکنه اطلاعات اضافی زیادی روش
ذخیره بشه که اصلا نیاز نیستن و همیشه کاربر باید اطلاعات اضافی رو پاک بکنه که کار کاربر هم زیاد میشه.
اگه توجه کرده باشید برنامه های office هم از سیستم فایل برای ذخیره موقتی اطلاعات استفاده میکنه

ACorvinus
سه شنبه 19 بهمن 1389, 14:53 عصر
سلام. دوست عزیز بنظر منم روش دوم (استفاده از فایل XML) بهتر از روش اول هستش. روش اول اصلا منطقی نیست. بازم ممکنه روش های دیگه ای هم وجود داشته باشه.

FastCode
سه شنبه 19 بهمن 1389, 16:58 عصر
متاسفانه روش اول بهتره.چون فایلهای xml اگر قرار باشه اتفاقی براشون بیافته ۱۰۰٪ پاک میشن.ولی دیتابیسهای SQL خیلی بیشتر روشون کار شده تا failsafe باشن و البته از Disk Cache استفاده نمیکنن.

یه سوال دیگه؟
شما منظورتون از بار روی سرور چیه؟
همین مثال رو با هم حل میکنیم:
تا اونحایی که یادمه یک سطر داده توی این جدول ۷۲ بایته و اگر اون فیلد آخر اضافه بشه یک بایت اضافه میشه.
ولی در حالت xml
اتفاقی که میافته اینه که شما هر دفعه یک فایل xml چند کیلوبایتی رو از اول مینویسی.

shuriken
چهارشنبه 20 بهمن 1389, 08:13 صبح
منظور از بار اون تک فیلد نیست.
بلکه منظور بار پردازشی و اطلاعاتی که دیتا بیس باید بازای هربار ویرایش قبل از ثبت کاربر متحمل بشه
و این مسئله این ایدرو دچار اشکال میکنه.
و همچنین فرض کنین که برق رفت اطلاعات هم در دیتابیس ذخیره شده بود
دوباره بعد از راه اندازی مجدد برنامه. باید کل جدولهای دیتابیس بخاطر اطلاعات ثبت نشده وارسی بشه
در صورتی که با استفاده از فایل براحی اطلاعات ناقص قابل مشاهده هستند و در ضمن
روش دیتا بیسی فقط در مورد برنامه هایی میتونه کاربرد داشته باشه که خودشون از DB دارن استفاده میکنن
و نمیتونه روش مستقل و جامعی باشه.
هرچند برای این پروژخ کاربرد داره.

saeidi.yusuf
چهارشنبه 20 بهمن 1389, 08:57 صبح
دوستان سلام:
بار بیشتر بر روی سرور به معنی اطلاعات بیشتر بر روی پایگاه نیست شما اگر از sql2005 هم استفاده کرده باشید می تونید میلیون ها رکورد رو بدون افت عملکرد ثبت و باز یابی کنید.منظور از بار بر روی سرور همنطور که دوستمون shuriken گفت بار پردازشی هست که سرور برای انجام اعمال ثبت یا بازخوانی مجبور به انجام اون هست.برای روشن تر شدن مطلب از خود c# مثال می زنم.یکی از اهداف ساخت dataset در c# کم کردن بار بر روی سرور هست.C# با ایجاد یه پایگاه داده ی local سعی میکنه انتقال اطلاعات رو تا وقتی که داده ها به حجم قابل قبولی (یا به مرحله قابل اطمینان)نرسیده به صورت local نگهداری کنه و بعد به یکباره اطلاعات رو برای سرور database بفرسته.این مسئله وقتی اهمیت بیشتر پیدا می کنه که سرور شما بر روی شبکه باشه در این صورت با پر کردن هر فیلد نیاز به بر قراری ارتباط با سرور هست که این مسئله بار بر روی (به معنی حجم اطلاعات رد و بدل شده ) شبکه رو هم بیشتر میکنه.
در مورد xml یا کلا فایل ها شما می تونید اطمینان کاملی بهشون داشته باشی این اطلاعات بر روی هارد شما قرار می گیرند و با قطع برق هیچ صدمه ای بهشون وارد نمیشه و اگر قرار باشه هارد با مشکل روبرو بشه هاردی که database بر روی اون قرار داره هم ممکنه با مشکل روبرو بشه و اگر backup از دیتا بیس نباشه اطلاعات sql هم از بین می ره.
در اخر هم تغییر database یک برنامه باعث تغییر در تمام قسمت های برنامه میشه ولی خواندن نوشتن روی سند xml می تونه تو یه کلاس جدا بدون تغییر در قسمت های دیگه ی برنامه انجام بشه.

ACorvinus
چهارشنبه 20 بهمن 1389, 17:02 عصر
سلام.


اتفاقی که میافته اینه که شما هر دفعه یک فایل xml چند کیلوبایتی رو از اول مینویسی.

رفیق با کامپیوترهای امروزی دیگه بحث، بحث ترابایت هستش. کامپیوترهای امروزی یه فایل چند کیلوبایتی رو زودتر از اینکه یه عصب بخواد اطلاعاتی رو به مغز برسونه ذخیره می کنن.

FastCode
چهارشنبه 27 بهمن 1389, 14:43 عصر
مثل اینکه منظورم رو درست متوجه نشدید.
۱.
بار پردازشی ای در DB وجود نداره چون عملاْ شما از مقدار درون اون فیلد هیچ استفاده خاصی نمیکنی.
بار پردازشی در XML تا چند هزار برابر بیشتره.برای کسب اطلاعات بیشتر یه ASMXML مراجعه کنید.

۲.
مشکل این نیست که فایل چقدر طول میکشه که ذخیره بشه مشکل اینه که کی ذخیره میشه.
برای تست میتونید از یک ماشین مجازی استفاده کنید.(موقعی که فکر میکنید فایل ذخیره شده برنامه رو ببندید.)
این مشکل در دیتابیس ها وجود نداره برای اینکه اونها براینوشتن توی فایل از یک فیگی استفاده میکنن که اسمش رو یادم نبیست که به سیستم عامل دستور میده که عملیات نوشتن رو بدون وقفه انجام بده.


نکته دیگه اینکه چون سیستم عامل ها علاقه دارند فایل ها رو بدون دلیل cache نکنند, فایل XMLشما رو در حافظه نکه نمیدارن که شما بیای سراغش.ولی دیتابیس شما رو خود Database Engine در بهترین حالت ممکن cache میکنه تا هر موقع که خواستید اطلاعاتتون رو بردارید.

و نکته جدیدتری که یادم اومد اینه که اگر کاربر میخواست از یک سیستم دیگه استفاده کنه باید چکار کنه؟
و نکته جالبتر اینکه اگر بالایی مشکلش حل شد, توی log برنامه اسم کدوم کاررب رو میخواهید جلوی اون سطر بنویسید؟