PDA

View Full Version : هماهنگ سازی بانک کلاینت ها و سرور در دلفی و mysql



takfanar
جمعه 18 تیر 1389, 09:37 صبح
سلام خدمت دوستان عزیز
یک نر افزار وجود داره که قرار در کشور توضیح بشه و تر هر شهر یک نسخه لکال نصب شه هر تغییر در کلاینت ها انجام شد باید به سرور انتغال پیدا کنه ! بدون ثبت رکورد تکراری! نوع بانک اطلاعاتی mysql است چه راهکاری را پیشنهاد می کنید

tdkhakpur
جمعه 18 تیر 1389, 17:35 عصر
نوع بانک اطلاعاتی mysql است چه راهکاری را پیشنهاد می کنید
در چه مورد؟
مگر داخل تصویر راهکار نشان داده شده است؟

takfanar
جمعه 18 تیر 1389, 22:57 عصر
منظورم این با چه روشی با کمترین فشار به سرور میشه این کارو کرد شما فکرش رو بکن 2 میلیون نفر عضو داره با کلی تیبل! هر فیلدی تغییر کنه باید هماهنگ بشه با سرور حتما یه چیزای برای این جور موارد بهرنج و جود داشته باشه نمیشه که تک تک فیلد ها رو چک کرد

tdkhakpur
جمعه 18 تیر 1389, 23:50 عصر
شما فکرش رو بکن 2 میلیون نفر عضو داره با کلی تیبل! هر فیلدی تغییر کنه باید هماهنگ بشه با سرور حتما یه چیزای برای این جور موارد بهرنج و جود داشته باشه نمیشه که تک تک فیلد ها رو چک کرد

همه این موارد را سرور mysql یا sql برای شما انجام خواهد داد-توضیح مختصر اینکه به فرض 20 نفر تقاضای دسترسی به یک رکورد از یک جدول را بدهند این تقاضاها بصورت کوئری به سرور ارسال میشود و داخل صف عملیاتی سرور قرار میگیرند تا به ترتیب این کارها انجام بگیرند.
ولی در داخل برنامه نویسی اینگونه سیستمها حتما از طریق کوئری دسترسی را انجام بدید بخصوص در مورد اعمال محاسبات برای فیلدهای عددی.

vcldeveloper
شنبه 19 تیر 1389, 04:34 صبح
یک نر افزار وجود داره که قرار در کشور توضیح بشه و تر هر شهر یک نسخه لکال نصب شه هر تغییر در کلاینت ها انجام شد باید به سرور انتغال پیدا کنه !
1- چرا یک نسخه Local برای هر کلاینت وجود داره؟
2- علت استفاده از MySQL چی بود؟
3- حجم تقریبی داده هایی در کلاینت ذخیره میشند، تا به سرور ارسال بشند، را چقدر تخمین می زنید؟

اگر قرار باشه با هر تغییری در سمت کلاینت، تغییر بلافاصله در بانک سرور منعکس بشه، دیگه چه نیازی به اون بانک کلاینت هست؟! بانک Local زمانی استفاده میشه که کلاینت شما دسترسی پیوسته به سرور نداشته باشه، در نتیجه در زمان هایی که به سرور متصل نیست، کاربر داده را در بانک Local ذخیره میکنه، و هر زمان که اتصال به سرور برقرار شد، تغییرات به سرور منتقل میشند.

takfanar
شنبه 19 تیر 1389, 11:22 صبح
سلام خدمت جناب آقای کشاورزی عزیز
- چرا یک نسخه Local برای هر کلاینت وجود داره؟

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

- علت استفاده از MySQL چی بود؟
سایت آماده شده تغریبا و دوستان بخش طراحی سایت تسلت کافی به دیگر بانک های اطلاعاتی رو ندارن همچنین سرور اصلی سایت یک سیستم به os لینوکسه

- حجم تقریبی داده هایی در کلاینت ذخیره میشند، تا به سرور ارسال بشند، را چقدر تخمین می زنید؟

- حجم تقریبی داده هایی در کلاینت ذخیره میشند، تا به سرور ارسال بشند، را چقدر تخمین می زنید؟
واقعا نمیدونم ولی توی شهرستان های بزرگ باید تعداد فیلد های خیلی زیاد باشه

اگر قرار باشه با هر تغییری در سمت کلاینت، تغییر بلافاصله در بانک سرور منعکس بشه، دیگه چه نیازی به اون بانک کلاینت هست؟! بانک Local زمانی استفاده میشه که کلاینت شما دسترسی پیوسته به سرور نداشته باشه، در نتیجه در زمان هایی که به سرور متصل نیست، کاربر داده را در بانک Local ذخیره میکنه، و هر زمان که اتصال به سرور برقرار شد، تغییرات به سرور منتقل میشند.

شما کاملا درست می فرماید ولی بانک قرار چند روز یکبار آپدیت بشه بلافاصه نیست خیلی جا ها ممکن ماه هانه باشه یا هفتگی یا بر روی لپتاب به جا های سعبل عبور حمل بشه

vcldeveloper
شنبه 19 تیر 1389, 13:23 عصر
ولی بانک قرار چند روز یکبار آپدیت بشه بلافاصه نیست خیلی جا ها ممکن ماه هانه باشه یا هفتگی یا بر روی لپتاب به جا های سعبل عبور حمل بشه
نرم افزارهایی مثل MS SQL Server خودشان قابلیتی با عنوان Replication دارند، که میشه با تنظیم آن، بانک کلاینت ها را با با سرور اصلی یکسان سازی کرد.

برای MySQL، تا جایی که من اطلاع دارم، همچین چیزی وجود نداره، و باید خودتون یک راهکار برای آن طراحی کنید.

مکانیزمی که برای نگهداری داده ها به صورت Local استفاده می کنید، بستگی به نوع طراحی شما، و حجم داده ها داره. یک راه حل میتونه این باشه که برنامه شما به صورت سه لایه طراحی بشه، و کلاینت ها به جای اتصال مستقیم به بانک اطلاعاتی، به یک لایه میانی (که میتونه روی سیستم سرور نصب باشه) متصل بشند، و اون لایه میانی با بانک اطلاعاتی در ارتباط باشه. در این حالت، اگر بخواید از مکانیزمهای موجود در دلفی استفاده کنید، در لایه میانی یک DatasetProvider خواهید داشت، و در سمت کلاینت، هم یک یا تعدادی ClientDataset. کاربر در برنامه با داده های ClientDataset کار خواهد کرد، و ClientDataset در صورت نیاز، به DatasetProvider در لایه میانی متصل میشه، و داده ها را از آن درخواست میکنه. زمانی که مقداری را در سمت کلاینت تغییر میدید، ClientDataset به طور خودکار، فقط مقدار تغییر داده شده را به سرور ارسال میکنه، در نتیجه داده غیر ضروری رد و بدل نمیشه. اگر اتصال به سرور برقرار نباشه، ClientDataset میتونه تغییرات را در یک فایل در سیستم کلاینت ذخیره کنه، و بعدا داده ها را از همین فایل لود کنه. هر زمان که اتصال به سرور برقرار شد، ClientDataset میتونه تغییرات اعمال شده را به سرور ارسال کنه. اگر میخواید از این روش استفاده کنید، باید درباره ClientDataset, DatasetProvider و به طور کلی تر، DataSnap در دلفی تحقیق کنید. اگر مایل بودید که از این شیوه استفاده کنید، ولی به هر دلیلی نخواستید از DataSnap که راهکار پیش فرض دلفی برای این منظور هست، استفاده کنید؛ می تونید از کامپوننت های سایر شرکت ها برای تولید نرم افزارهای چند لایه استفاده کنید؛ مثل مجموعه DataAbstract از شرکت RemObjects که برای همین منظور ساخته شده.

hamid-nic
شنبه 19 تیر 1389, 13:52 عصر
حجم تقریبی داده هایی در کلاینت ذخیره میشند، تا به سرور ارسال بشند، را چقدر تخمین می زنید؟
سلام آقای کشاورز
چطوری می تونیم حجم تقریبی را محاسبه کنیم ؟


نرم افزارهایی مثل MS SQL Server خودشان قابلیتی با عنوان Replication دارند، که میشه با تنظیم آن، بانک کلاینت ها را با با سرور اصلی یکسان سازی کرد.
با این روش در فرایند یکسان سازی ، اگر خطایی در حین یکسان سازی اتفاق بیفته تکلیف داده ها چی میشه ؟ مثلاً توی پروژه ی این دوستمون که قراره جدول رکورد تکراری نگیره ، بطور مثال چند تا از کلاینت ها چون با سرور آنلاین نیستند رکوردی را می گیرند که تکراری است و قبلا در سرور اصلی ثبت شده حالا با عملیات یکسان سازی تکلیف اون داده هایی که کلاینت ها ثبت کردند چی میشه ؟ و یا مواردی از این قبیل . . .
ممنون .

tdkhakpur
شنبه 19 تیر 1389, 14:09 عصر
میتونه تغییرات را در یک فایل در سیستم کلاینت ذخیره کنه، و بعدا داده ها را از همین فایل لود کنه. هر زمان که اتصال به سرور برقرار شد، ClientDataset میتونه تغییرات اعمال شده را به سرور ارسال کنه

این تحلیل برای زمانی هست که مشتری بخواهد بر روی رکوردی دسترسی داشته باشد که قبلا ایجاد شده باشد.


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

بستگی به نوع خطا دارد که با تحلیل میشود این مشکل را با اجرای نسخه های آزمایشی حل کرد.

مثلاً توی پروژه ی این دوستمون که قراره جدول رکورد تکراری نگیره ، بطور مثال چند تا از کلاینت ها چون با سرور آنلاین نیستند رکوردی را می گیرند که تکراری است و قبلا در سرور اصلی ثبت شده حالا با عملیات یکسان سازی تکلیف اون داده هایی که کلاینت ها ثبت کردند چی میشه ؟ و یا مواردی از این قبیل . . .

در حالت کلی همچین نرم افزار و یا تحلیلی برای اینکه بدون اعمال شرایط- به درستی داده ها را به سرور ارسال کند وجود ندارد مثال همین کارتهای سوخت که کار مشابه خواسته جناب takfanar را انجام میدهند
به همین دلیل برای یکسانسازی و دقت عملیات از کارت سوخت به عنوان شرطی برای استفاده یک شخص در واحد زمان از منبع استفاده میشود.
تقریبا هیچ راهی تضمین شده ای برای فرار از ورود داده های تکراری و یا کارهایی از این دست نیست مگر شرایطی را اعمال کنید یعنی نتیجه پس از یکسانسازی در سرور اصلی به مشتری اعلام شود که این نتیجه طی فرایند کد رهگیری قابل انجام هست.

vcldeveloper
شنبه 19 تیر 1389, 18:11 عصر
این تحلیل برای زمانی هست که مشتری بخواهد بر روی رکوردی دسترسی داشته باشد که قبلا ایجاد شده باشد.
نیازی به وجود داده از قبل نیست. ClientDataset خودش Update و Insert رکورد را به درستی مدیریت میکنه؛ لزومی نداره که داده ایی از قبل وجود داشته باشه.


چطوری می تونیم حجم تقریبی را محاسبه کنیم ؟
حجم تقریبی داده ارسالی در شبکه توسط برنامه را نگاه کنید؛ یا با توجه به تعداد رکوردهایی که تصور می کنید به طور تقریبی ارسال بشند، و حجم تقریبی هر رکورد (از روی حجم فیلدهای آن).


با این روش در فرایند یکسان سازی ، اگر خطایی در حین یکسان سازی اتفاق بیفته تکلیف داده ها چی میشه ؟
اگر خطایی در حین کار Replication پیش بیاد، این به SQL Server مربوط میشه؛ می تونید در تالار SQL Server سوال کنید که Replication با خطاهای رخ داده چه برخوردی میکنه.

اگر از DataSnap استفاده کنید، خودش قابلیت Reconcile داره؛ و در صورت بروز خطا در زمان رویداد خاصی فراخوانی میشه که متن خطا، مقدار فیلدهای تغییر یافته، و مقدار فعلی فیلدها در سرور را به شما برگشت میده، و شما می تونید تصمیم بگیرید که اون رکورد خاص تغییراتش اعمال بشه، یا ازش صرفنظر بشه.