PDA

View Full Version : حرفه ای: روش طراحی کلاینت و سرور و استفاده بانک اطلاعاتی به وسیله Indy



Delphi 2010
یک شنبه 31 شهریور 1392, 13:20 عصر
با عرض سلام و خسته نباشید خدمت دوستان و سروران گرامی

بنده نرم افزاری در دست ساخت دارم که کلاینت و سرور هست و برنامه سرور ارتباط با دیتابیس داره به وسیله ADO و چند تا AdoQuery و AdoTable دارم
توی Indy وقتی هر کلاینت به برنامه سرور اتصال میده یه Thread جدا بهش اختصاص میده و برای هر کلاینت به صورت جداگانه کدهای نوشته شده در سرور اجرا میشه
سوال های مطرح شده برای بنده که اصولی تر برنامه نویسی کنم و پیاده سازی بشه که بعدا مشکلی برام پیش نیاد در زمان اجرا و اتصال تعداد بالای کلاینت به سرور:

1- هر کدی که ما توی رویداد OnExecute در سرور مینویسیم به صورت جداگانه و واحد برای هر Thread و هر کلاینت توی Thread خاص خودش اجرا میشه؟


2- ما وقتی از شی AdoQuery که قبلا روی فرم گذاشتیم استفاده کنیم مشکلی پیش میاره وقتی تعداد زیادی کلاینت به سرور متصل میشن یا اینکه هر کدوم توی Thread خودشون از این شی استفاده میکنن و این شی پشتیبانی میکنه از تعداد زیاد Query که باهاش گرفته میشه یا اینکه باید به صورت RunTime این شی رو بسازیم توی OnExecute سرور و در نهایت Free کنیم؟؟

3- نحوه پیاده سازی چگونه باشه که سرور سریعتر جواب دهی داشته باشه به درخواست کلاینت ها (یادآور میشم ملزم هستیم به اینکه کلاینت همیشه وصل باید باشه به سرور)؟

hadisalahi2
یک شنبه 31 شهریور 1392, 15:42 عصر
در مورد سوال اول : بستگی داره ، تردها از چند تا برنامه به سرور وصل میشند
اگه از چند برنامه وصل بشند ، هر کدوم جداگانه اجرا میشند و باری روی همیدگه ندارند
اما اگه از یک برنامه متصل بشد ، مسلما روی سرعت تاثیر زیادی داره
من خودم با این مسئله دست به گریبانم

در مورد سوال دوم:
بستگی داره به تعداد درخواست هایی که به سمت سرور ارسال میشه و نوع پیچیدگی کدی که داخل هر کوئری هستش
همچنین به نسخه و نوع بانک اطلاعاتی هم ربط داره
مثلا با اکسس قاعدتا دسترسی محدود تر از SQL Server هستش
ولی اگه دستورات کوئری ساده و در حد select های معمولی باشه ، فکر نکنم مشکلی پیش بیاد


در ضمن نیازی به Free کردن نیست
اما یک روش مدیریت بهینه حافظه هستش


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

مثلا با اکسس قاعدتا دسترسی محدود تر از SQL Server هستش
ولی اگه دستورات کوئری ساده و در حد select های معمولی باشه ، فکر نکنم مشکلی پیش بیاد

در ضمن نیازی به Free کردن نیست
اما یک روش مدیریت بهینه حافظه هستش

Delphi 2010
یک شنبه 31 شهریور 1392, 17:05 عصر
به صورت مثال شما یه نرم افزار چت در نظر بگیرید که کلاینت و سرور هستش که سرور هم با بانک اطلاعاتی در ارتباطه

کلاینت ها از سیستم های مختلف متصل میشن به سرور و هر کدوم ممکنه درخواست متفاوتی داشته باشن

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

الان چند تا مسئله دوباره پیش میاد:
شما فکر میکنید یا مطمئن هستید چون براساس فرضیات نمیشه چیزی رو بنا کرد
خیلی این سوال ها مهم هست که در بالا نوشتم
سوال اول که کاملا مفهوم رو میرسونه
سوال دوم منظورم اینه که AdoQuery رو بسازم یا یه شی بزارم رو فرم و ازش استفاده کنم که وقتی 2000 تا کاربر وصل میشن به سرور کم نیاره و قاطی نکنه
سوال سوم منظورم اینه که از Generics.Collections ها استفاده میکنم توی برنامه برای کنترل رو اتصال ها. آیا نوع خاصی کد نویسی داره که بهتر انجام بده؟ به نظرتون وقتی درخواست زیاد میشه بیایم و به چند تا سرور لینک کنیم و برنامه های میان سرور درست کنیم؟ از اینطور راهنمایی ها نیاز دارم که به مشکل بر نخورم

ممنون میشم از اطلاعات دوستان عزیز بهره لازم رو ببرم

Delphi 2010
دوشنبه 01 مهر 1392, 07:46 صبح
یعنی دوستان نمیتونن از اصول Indy صحبت کنند؟

BORHAN TEC
دوشنبه 01 مهر 1392, 18:01 عصر
سلام
اینطور که معلومه شما قصد ساخت یک برنامه 3 ردیفه رو دارید. اگر قصد شما این است به نظر من از استفاده مستقیم از Indy و ADO مشکلاتی را به همراه دارد. در مورد کامپوننت های کار با بانک اطلاعاتی در این روزها بنده از FireDAC استفاده می کنم که استفاده از آن مزایای بسیار زیادی نسبت به ADO دارد، مثلاً در موقع اتصال به بانک اطلاعاتی برنامه هنگ نمی کند، سرعت کار بسیار بالاست، تنظیماتی فوق العاده جالبی دارد که در شبکه های غیر پایدار عالی عمل می کند، Automatic Connection Recovery و بسیاری از موارد دیگر. ADO هم بنا به دلایلی توصیه نمی شود، مثلاً از آنجا که ADO مبتنی بر COM است و برخی از نرم افزارهای امنیتی نسبت به این نوع اتصال حساسند و ممکن است اتصال را قطع کنند، از طرفی هم استفاده مستقیم از Indy برای رفع مشکلاتی از این دست نمی تواند روش مناسبی باشد. همانطور که می دانید ADO فقط مخصوص ویندوز است و استفاده از آن مزیت Cross-Platform بودن برنامه شما را تا حد بسیار بالایی زیر سوال می برد. توجه داشته باشید که FireDAC در کامپایلر FPC هم قابل استفاده است و با استفاده از آن می توانید از مزیت Cross-Platform برنامه هایتان بهره مند شوید.

در مورد ساخت برنامه های چند ردیفه استفاده مستقیم از Indy توصیه نمی شود و بهتر است که از ابزارهای دیگری نظیر DataSnap و یا RemObject DataAbstract و یا ... استفاده کرد. این مورد مزایای دیگری دارد مثلاً اینکه می توانید اطلاعات را به صورت کد شده رد و بدل کنید و این موضوع امکان به سرقت رفتن اطلاعات را تقریباً به صفر می رساند. از مزایای دیگر این است که راحتی کار بیشتری را برای شما فراهم می آورد. بنده به شخصه DataAbstract را توصیه می کنم.

اگر هم در حال توسعه یک برنامه قدیمی هستید و امکان بازگشت ندارید، بهتر است که دوستان دیگری شما را راهنمایی کنند، چرا که بنده از اول تجربه کار زیادی با ADO و این شیوه برنامه نویسی ندارم.

موفق باشید...

Delphi 2010
سه شنبه 02 مهر 1392, 08:46 صبح
ممنون از همکاری دوستان
Indy بصورت مستقیم در این برنامه ارتباط نداره با بانک اطلاعاتی و هر کدوم جدا هستند در برنامه.
به نظر دوستان تا چه تعداد کلاینت جواب میده برنامه بنده وقتی استفاده شده از Indy و ADO؟