PDA

View Full Version : پروسه امن و طولانی



FreeMagic
یک شنبه 15 بهمن 1391, 00:22 صبح
سلام
توی قسمتی از پروژه من یه پروسه طولانی دارم.
برنامه حدود 1000 بار باید اطلاعات رو دیتابیس بگیره و محاسبات رو انجام بده و دوباره اطلاعات جدید رو ذخیره کنه. وسط اجرا پیغام خطا میده و از برنامه خارج میشه و هر بار هم در به مرحله از برنامه خارج میشه و هیچ وقت در یک مرحله خاص نبوده.
کسی راهی میشناسه که کلا این پروسه به صورت امن و کامل اجرا بشه؟
چون اگه ناقص اجرا بشه به هیچ دردی نمیخوره و کل داده های دیتابیس رو بهم میریزه

JaVa
یک شنبه 15 بهمن 1391, 00:24 صبح
سلام
توی قسمتی از پروژه من یه پروسه طولانی دارم.
برنامه حدود 1000 بار باید اطلاعات رو دیتابیس بگیره و محاسبات رو انجام بده و دوباره اطلاعات جدید رو ذخیره کنه. وسط اجرا پیغام خطا میده و از برنامه خارج میشه و هر بار هم در به مرحله از برنامه خارج میشه و هیچ وقت در یک مرحله خاص نبوده.
کسی راهی میشناسه که کلا این پروسه به صورت امن و کامل اجرا بشه؟
چون اگه ناقص اجرا بشه به هیچ دردی نمیخوره و کل داده های دیتابیس رو بهم میریزه

از چند نخی استفاده کنید .

انجام هر عملیات رو بسپارید به یک نخ که براتون انجام بده. البته بصورت موازی.

FreeMagic
یک شنبه 15 بهمن 1391, 00:32 صبح
اگه منظور شما از نخ همون tread هست یه چیزایی خوندم ولی مشکل اینه که پروسه ها نباید به طور موازی اجرا بشن. پروسه ها باید یکی یکی و پشت سر هم اجرا بشن. اگه یه tread بزارم این تضمین میکنه که همه پروسه ها دقیقا اجرا بشن؟ یا مثل دستورات حلقه ممکنه وسط کار مشکل بسازن؟
چون من الان برای انجام اونا از حلقه ساده for یا while استفاده میکنم و همیشه وسط کار پیغام خطا میده

plus
یک شنبه 15 بهمن 1391, 00:37 صبح
پروسه شما تا وقتی از طریق ویندوز بسته نشه، سیستم روشن باشه (Stand By شدن میتونه یک موضوع باشه)، خطایی در برنامه پیش نیاد، و یا منابع سیستم کم نیاد (رم و ...) قرار نیست مشکلی براش پیش بیاد...
اگه به دنبال این هستین که در صورت بروز خطا بتونید با دوباره باز کردن برنامه کار رو ادامه بدین، باید اول ببینید کاری که میکنید قابلیت این موضوع رو داره یا نه (State less هست یا نه، قالیت تقسیم پذیری داره یا نه)، اگه داره، در حین کار با توجه به کاری که میکنید، آخرین وضعیت رو ذخیره کنید.
TRANSACTION هم قابلیت دیتابیس هست که وقتی عملیاتی که درون یک TRANSACTION انجام میشه، یا همش انجام میشه، یا اگه یک جایی خطا ایجاد شد، کل سیستم به وضعیت قبل از TRANSACTION برمیگرده (RollBack).
اگه بتونید کارتون رو بخش بخش کنید، هر بخش رو توی یک TRANSACTION انجام بدین، و بعد از انجام هر بخش، آخرش بخش موفق رو جایی ذخیره کنید، در صورت بروز خطا وسط کار میتونی از جایی که مشکل پیش اومده ادامه بدین...

plus
یک شنبه 15 بهمن 1391, 00:39 صبح
اگه منظور شما از نخ همون tread هست یه چیزایی خوندم ولی مشکل اینه که پروسه ها نباید به طور موازی اجرا بشن. پروسه ها باید یکی یکی و پشت سر هم اجرا بشن. اگه یه tread بزارم این تضمین میکنه که همه پروسه ها دقیقا اجرا بشن؟ یا مثل دستورات حلقه ممکنه وسط کار مشکل بسازن؟
چون من الان برای انجام اونا از حلقه ساده for یا while استفاده میکنم و همیشه وسط کار پیغام خطا میده
خوب پیغام خطا که میده باید پیغام رو بررسی کنید. درست متوجه نمیشم دنبال چی هستین.

FreeMagic
یک شنبه 15 بهمن 1391, 00:47 صبح
پروسه شما تا وقتی از طریق ویندوز بسته نشه، سیستم روشن باشه (Stand By شدن میتونه یک موضوع باشه)، خطایی در برنامه پیش نیاد، و یا منابع سیستم کم نیاد (رم و ...) قرار نیست مشکلی براش پیش بیاد...
اگه به دنبال این هستین که در صورت بروز خطا بتونید با دوباره باز کردن برنامه کار رو ادامه بدین، باید اول ببینید کاری که میکنید قابلیت این موضوع رو داره یا نه (State less هست یا نه، قالیت تقسیم پذیری داره یا نه)، اگه داره، در حین کار با توجه به کاری که میکنید، آخرین وضعیت رو ذخیره کنید.
TRANSACTION هم قابلیت دیتابیس هست که وقتی عملیاتی که درون یک TRANSACTION انجام میشه، یا همش انجام میشه، یا اگه یک جایی خطا ایجاد شد، کل سیستم به وضعیت قبل از TRANSACTION برمیگرده (RollBack).
اگه بتونید کارتون رو بخش بخش کنید، هر بخش رو توی یک TRANSACTION انجام بدین، و بعد از انجام هر بخش، آخرش بخش موفق رو جایی ذخیره کنید، در صورت بروز خطا وسط کار میتونی از جایی که مشکل پیش اومده ادامه بدین...

قبلا یه چیزایی در مورد این tranaction خوندم که فکر کنم مخففش همون tsql باشه. ولی الان هیچی در موردش یادم نمونده
و این tsql یکی از کاربردهایی هست که توی sql server میشه استفاده کرد. من وقتی از C#‎ استفاده میکنم چه طوری ازش استفاده کنم؟
کل کار من یه چیزی شبیه این هست:
1- خوندن اطلاعات هر رکورد
2- انجام پردازش
3- بعضی جاها ویرایش رکورد و بعضی جاها اضافه کردن رکورد و بعضی جاها هردو
تعداد رکوردها تقریبا 1000 تاست
اگه قراره از چند نخی استفاده کنم چه طوری تقسیم بندی کنم؟
اگه قرار از transaction استفاده کنم که کلا نمیدونم چهطوری استفاده کنم
ضمنا سیستم های client و server یکی نیستن و بعدا دائما باید برای کارهای sql باید وصل بشن به یه سیستم دیگه

plus
یک شنبه 15 بهمن 1391, 00:57 صبح
خوب باید ببینید مشکل چی هست تا ببینید اصلا نیازی به Transaction یا MultiThreading دارید یا نه؟
اگه با خطای خاصی مواج میشید که باید خطا رو بررسی و رفع کنید.اگه کد صحیح باشه معمولا نباید خطایی پیش بیاد.
اگه میخوایین در صورت بروز خطایی که انتظارش رو نداشتین در حین کار، دیتابیس به حالت قبل برگرده، میتونید از Transaction استفاده کنید، در صورتی که فقط با 1 کانکشن کار کنید، در مورد کلاینت سرور بودن مشکلی نیست و میتونید از SqlTranscation استفاده کنید:

using (SqlConnection cn = new SqlConnection(ConfigurationManager.AppSettings["T3"])) {
cn.Open();
using (SqlTransaction tr = cn.BeginTransaction()) {
//some code
tr.Commit();
}
}

لینک در MSDN (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.aspx)
---
در مورد MultiThreading هم، منظورتون رو از تقسیم بندی نمیفهمم.کاری که میشه کرد اینه که در صورتی که واسط کاربری دارین، میتونین کل کار رو توی یک Thread دیگه انجام بدین تا UI هنگ نکنه...

FreeMagic
یک شنبه 15 بهمن 1391, 01:23 صبح
خوب باید ببینید مشکل چی هست تا ببینید اصلا نیازی به Transaction یا MultiThreading دارید یا نه؟
اگه با خطای خاصی مواج میشید که باید خطا رو بررسی و رفع کنید.اگه کد صحیح باشه معمولا نباید خطایی پیش بیاد.
اگه میخوایین در صورت بروز خطایی که انتظارش رو نداشتین در حین کار، دیتابیس به حالت قبل برگرده، میتونید از Transaction استفاده کنید، در صورتی که فقط با 1 کانکشن کار کنید، در مورد کلاینت سرور بودن مشکلی نیست و میتونید از SqlTranscation استفاده کنید:

using (SqlConnection cn = new SqlConnection(ConfigurationManager.AppSettings["T3"])) {
cn.Open();
using (SqlTransaction tr = cn.BeginTransaction()) {
//some code
tr.Commit();
}
}

لینک در MSDN (http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.aspx)
---
در مورد MultiThreading هم، منظورتون رو از تقسیم بندی نمیفهمم.کاری که میشه کرد اینه که در صورتی که واسط کاربری دارین، میتونین کل کار رو توی یک Thread دیگه انجام بدین تا UI هنگ نکنه...
خطایی که پیش میاد به احتمال 99 درصد به خاطر کمبود منابع سیستم هست. چون وقتی برنامه به تنهایی اجرا میشه تقریبا وسطش پیغام میده ولی وقتی برنامه های دیگه ای هم باز میکنم به طور میانگین خیلی زودتر پیغام میده
ضمنا از این قطعه کدتون هیچی متوجه نشدم:گریه:
میشه یه توضیح کوتاه در مورد using بدید؟ این کد چندمین بار هست که کارم رو راه میندازه ولی هربار کپی پیست کردم و متوجه کارش نشدم
اون قسمت که شما ConfigurationManager.AppSettings["T3"] نوشتید قبلا con str بود ولی الان یه چیز دیگست. این چیه؟
کلا هیچی از کد متوجه نشدم که بخوام بعدا دستورات خودم رو جایگزینش کنم:گریه:

FreeMagic
یک شنبه 15 بهمن 1391, 01:27 صبح
در ضمن منظور من از تقسیم بندی این بود که چون 1000 تا رکورد هستن به طور مثال هر 200 تا رکورد برن توی یک tread و پردازش بشن. که اگه قرار بود این کار رو بکنم چه طوری باید مشخص میکردم که کدوم 200 تا برن توی یک tread ؟

plus
یک شنبه 15 بهمن 1391, 03:48 صبح
اون قسمت Connection String هست شما باید جاش مال خودتون رو بگذارید.
تقسیم بندی هم سودی نداره به نظرم.
بعدم شما باید بررسی کنید علت رو، با Debug برنامه...وقتی خطایی پیش اومده که نباید بگید احتمالا...منابع سیستم هم برای کاری که شما میخواین بکنید بعید میدونم کم بیاد مگر اینکه کد شما ایرادی داشته باشه.