ورود

View Full Version : ارتباط سنگين شدن بار شبكه با ADO



diamond_guilan
یک شنبه 01 اردیبهشت 1392, 09:53 صبح
سلام خدمت دوستان عزيز؛
يه برنامه نوشته شده كه چندين كاربر با سطح دسترسي هاي مختلف داره، بانك اطلاعاتيش كه SQL2000 هست تو يه سروري Attach هست و كاربران connection مربوط به ado رو اون كامپيوتري كه sql داره وارد ميكنن... از عنصرهاي ADOconnection, ADOtable, ADOqouery استفاده شده تو كل برنامه براي ارتباط با بانك. در ابتداي برنامه ADOconnection فعال ميشه و LoginForm ظاهر ميشه، كاربر مشخصات ورود به سيستم رو ميده و بعد تو يه فرم ديگه تمام جداول بانك اطلاعاتي باز ميشه، حدود 30 تا جدول.
چندتا مسئله واسم پيش اومده، از دوستاي عزيز خواهش ميكنم كمك كنن، پيپاپيش ممنون از لطفتون...

1. آيا اين كار بار شبكه رو سنگين ميكنه؟ (باز كردن تمامي جدولها در ابتداي برنامه)
2. وقتي همه كاربرا، برنامه شونو اجرا ميكنن، وقتي يكيشون عمليات درج توي بانك رو انجام ميده بقيه سيستم ها متوجه نميشن!
براي مثال توي يه دكمه نوشتم كه بره آخرين ID رو از جدول بخونه و يه دونه بهش اضافه كنه تا ID جديد بدست بياد، وقتي يه كاربري يه مقداري رو درج ميكنه، كاربر ديگه وقتي ميخواد درج كنه پيغام خطلاي PrimeyKey ميده، يعني با اينكه ميگم دوباره بره بانك رو بخونه و چك كنه، اما متوجه نميشه!
وقتي قبل از خوندن ID از جدول مربوطه، ADOtable رو Close و Open ميكنم درست ميشه! با Refresh حل نميشه! اين واقعا بايد همين كارو كرد؟! يعني هربار بانك رو بست و دوباره باز كرد؟!

ميشه كسايي كه تو اين زمينه كار كردن و جواب گرفتن، يه راه حل منطقي و درست پيش روم بزارن.

:: تشكر ::

hakim22
یک شنبه 01 اردیبهشت 1392, 10:26 صبح
1- باز کردن همه ی جدول ها کار بیهوده ای هست و حتما برنامه ی شما رو سنگین می کنه ، مخصوصا اگر رکوردهای زیادی توی برنامه قرار بگیره
2- کلا شما در این روش بهتره که همیشه بلافاصله بعد از بازکردن جدول و خوندن اطلاعات مورد نظر اونو close کنید . باز نگه داشتن بانک هیچ کمکی به برنامه ی شما نمیکنه.
اصولا در استفاده از ADO برقراری ارتباط باید لحظه ای باشه و با اطلاعات به صورت آفلاین کار بشه و سپس تغییرات ارسال بشه. در غیر این صورت سنگین میشه.

من خیلی وقته که استفاده از ADO رو کنار گذاشتم و از EF استفاده می کنم. حتی استفاده از Strongly typed dataset ها رو به روشی که در ADO هست ترجیح میدم. مخصوصا EF کاراییشو در چند پروژه ی بزرگ به خوبی نشون داده .

diamond_guilan
یک شنبه 01 اردیبهشت 1392, 10:47 صبح
ممنون دوست عزيز؛
اگه كلا با ADOqouery كلا كار كنم چطور؟
يعني اصلاي با عنصر ADOtable كاري نكنم. كليه عمليات درج، حذف و ويرايش رو با ADOqouery انجام بدم. بنظر شما اين بهتر و منطقي تره؟
بعد از انجام هر عمليات چيكار كنم با ADOqoury؟ مقدار SQL رو Clear كنم يا كلا Close كنم؟ براي مثال واسه جستجو و نمايش داده ها به كاربر؛ بعد از اينكه Qoury را گرفتم اگه ADOqoury باز بمونه سنگين ميشه برنامه؟
::در ضمن من با دلفي 7 برنامه رو نوشتم::

یوسف زالی
یک شنبه 01 اردیبهشت 1392, 12:53 عصر
سلام.
کار کردن با ADOQuery رو جز در مواقع خاص درست نمی دونم.
به نظر من بهتره که با ADOStoredProc کار کنید. سلکت ها تون رو هم با همون بگیرید.

diamond_guilan
دوشنبه 02 اردیبهشت 1392, 09:34 صبح
اول؛ تشكر ميكنم از همه دوستايي كه بهم تو اين تاپيك كمك كردن، دستتون در نكنه...
با جستجو و تحقيقاتي كه كردم متوجه شدم كه مناسب ترين راه براي چنين برنامه هايي استفاده از StoredProcedureهاست. توي خود سرور اجرا ميشه و به همين دليل فكر كنم رو شبكه هم تاثيري نزاره... منم همين روش رو انتخاب كردم.
اگه دوستان باز نظري دارن و روش بهتري رو سراغ دارن لطفا پيشنهاد كنن.
.:. ممنون .:.

vcldeveloper
پنج شنبه 05 اردیبهشت 1392, 22:46 عصر
با جستجو و تحقيقاتي كه كردم متوجه شدم كه مناسب ترين راه براي چنين برنامه هايي استفاده از StoredProcedureهاست. توي خود سرور اجرا ميشه و به همين دليل فكر كنم رو شبكه هم تاثيري نزاره... منم همين روش رو انتخاب كردم.
فرق Stored Procedure با یک کوئری معمولی که توسط AdoTable یا AdoQuery به سرور ارسال میشه، از نظر مصرف پهنای باند شبکه بسیار ناچیزه؛ مگر اینکه بخواید یک کوئری خیلی بزرگ (از لحاظ دستورات کوئری، نه خروجی آن) را صدها و یا هزاران بار در شبکه اجرا کنید! پس Stored Procedure به خودی خود مزیت خاصی در زمینه کاهش پهنای باند مصرفی شبکه برای شما ایجاد نمیکنه. مزیت Stored Procedure از نظر کارایی در کاهش زمان آماده سازی برای اجرای یک کوئری در سمت سرور هست، که ربطی به شبکه شما نداره.

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

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

soft-c
جمعه 06 اردیبهشت 1392, 10:42 صبح
2. وقتي همه كاربرا، برنامه شونو اجرا ميكنن، وقتي يكيشون عمليات درج توي بانك رو انجام ميده بقيه سيستم ها متوجه نميشن!
برای این مشکل از transaction استفاده کن .
برای کار با سرور هم از adodataset استفاده کن و تنظیمات اون را روی storedprocedure قرار بده .