PDA

View Full Version : سوال: قطع کردن ارتباط و آزاد کردن پورت



gbg
سه شنبه 24 آبان 1390, 02:01 صبح
سلام
شاید سوالم کمی گنگ باشه ولی نمی دونم چطور بپرسم که واضح باشه!
ولی چون گذاشتن کد اینجا سخته توضیح میدم
من تعداد زیادی اطلاعات دارم که باید در دیتابیس ذخیره بشه و این دیتا هر لحظه اضافه میشه و تمومی نداره

یه روتین برای چک کردن وجود دیتای جدید دارم که اگه تشخیص بده دیتای جدید آمادست رو تین ذخیره سازی رو اجرا میکنه.
در روتین ذخیره سازی یه ADOQuery ایجاد میشه
و در داخل یه حلقه for اطلاعات با دستور Insert ذخیره میشه میشه
بعد از پایان حلقه ADOQuery رو free می کنم.
و دوباره میرم به روتین چک کردن

و حالا مشکل :
مشکل اینجاست که هربار که query اجرا میشه یه پورت بهش اختصاص داده میشه و متاصفانه این پورت بسته نمیشه و آزاد نمیشه اینقدر این پورت ها اضافه میشه تا جایی که سیستم پورتی نداره که به برنامه تخصیص بده و برنامه از کار میوفته
وقتی که برنامه رو میبندم بعد از مدتی پورت ها آزاد میشن ، حالا می خواستم بدونم موقع اجرا چطور می تونم پورت ها رو آزاد کنم در ضمن freeandnil هم کمکی نکرد.

BORHAN TEC
سه شنبه 24 آبان 1390, 09:19 صبح
بعد از پایان حلقه ADOQuery رو free می کنم.
چه لزومی داره که این کار رو بکنید؟! :متفکر:

gbg
سه شنبه 24 آبان 1390, 12:14 عصر
خب خودم Create کردمش و اگه آزادش نکنم مطمعن دچار کمبود حافظه میشم

مثلا در عرض یک دقیقه حدود 2000 رکورد به دیتا بیس اضافه میشه و من خودم حداکثر تعداد کانکشن های پورت رو به صورت دستی به 65534 تغیر دادم و این کار فقط کمک می کنه مدت زمان بیشتری برنامه کار کنه

Felony
سه شنبه 24 آبان 1390, 13:10 عصر
حداکثر تعداد کانکشن های پورت رو به صورت دستی به 65534 تغیر دادم

کدوم پورت ؟!
با توجه به توضیحاتی که دادی ADOQuery داده ای داخل خودش نداره که بخواد حافظه رو grow کنه ، شما فقط داری یکسری عملیات Insert رو به وسیله اون انجام میدی ، بنابراین میتونی آخر کار برنامه آزادش کنی ؛ البته من نمیدونم برنامه شما چی هست و قراره چی کار کنه و چه طور تحلیل و پیاده سازیش کردین ولی با همین توضیحاتی که دادی میگم بدون شک تحلیل برنامت مشکل داره و اون روش برنامه نوشتن 100% غیر فنی هست ...

gbg
سه شنبه 24 آبان 1390, 18:12 عصر
ممنون از توضیحت ولی من اصلا اینجوری فکر نمی کنم.

Felony
پنج شنبه 26 آبان 1390, 05:42 صبح
ممنون از توضیحت ولی من اصلا اینجوری فکر نمی کنم.

مشکل اینجاست که هربار که query اجرا میشه یه پورت بهش اختصاص داده میشه و متاصفانه این پورت بسته نمیشه و آزاد نمیشه اینقدر این پورت ها اضافه میشه تا جایی که سیستم پورتی نداره که به برنامه تخصیص بده و برنامه از کار میوفته
ولی من فکر نمیکنم تخصیص دادن تمام پورت های موجود روی سیستم به یک برنامه کار فنی باشه !

Mask
پنج شنبه 26 آبان 1390, 13:13 عصر
من هر چی پستتون رو خوندم نفهمیدم چرا از پورت استفاده شده.؟

gbg
جمعه 27 آبان 1390, 15:05 عصر
هربار که یه کوری رو Excute می کنین خودش یه پورت روی کامپیوتر مبدا باز میکنه و بوسیله اون به پورت sqlserver وصل میشه
و این کار اتوماتیک صورت میگیره

gbg
شنبه 28 آبان 1390, 12:47 عصر
خب چندتا عکس هم بزارم
این عکس پورت های قبل از اجرای برنامه
78064

بعد از اینکه روتین درج 73 بار اجرا شد تعداد 15375 بار درج انجام داد وضعیت پورت ها به این صورت هستش

78063

بعد از اینکه روتین درج 123 بار اجرا شد تعداد حدود0 2200 بار درج انجام داد وضعیت پورت ها به این صورت هستش
78062

تعداد پورتها زیاد میشه تا در نهایت همه پورت ها استفاده میشه
وقتی که برنامه بسته میشه از وضعیت established به حالت close_wait میره و هر پورت بعد گذشت 4 دقیقه آزاد میشه که بعد از بستن برنامه عکسش رو می گیرم و همین پست رو آپدیت می کنم

در ضمن از adoconnection هم استفاده نکردم و مقدار conectionstring مربوط به query رو پر کردم

firststep
شنبه 28 آبان 1390, 13:18 عصر
سلام دوست عزیز من با شناختی که از شما دارم مطمئنم که همیشه گزینه های خوبی رو انتخاب می کنین ولی شاید از مثلاً از روش ها و تکنولوژی های همچون com+ استفاده مس کردین بهتر نیود؟
و البته شاید یک روش ابتکاری این باشه که توسط زیر برنامه هایی پورتها رو اشغال کنین و سپس زیر برنامه رو ازاد کنین :لبخند: البته شاید فنی نباشه

gbg
شنبه 28 آبان 1390, 13:28 عصر
آره الان یه برنامه دارم که این برنامه رو اجرا میکنه و بعد از اینکه برنامه اطلاعاتی برای درج نداشت بسته میشه و برنامه ای دیگه بعد از 5 دقیقه برنامه رو دوباره اجرا می کنه و منتظر می مونه تا برنامه خاتمه پیدا کنه ، اینجوری صورت مسئله رو پاک کردم ولی همچنان دنبال راه حل هستم چون روش کارم مسخره شده و اصطلاحا کلنگی هستش
من تست کردم وقتی با Indy به آی پی و پورتی وصل میشم و اطلاعات میگیرم و پورت رو می بندم ، پورت به وضعیت close_wait میره و بسته میشه ولی در مورد کامپوننت های ado این اتفاق نمی یوفته و هر بار که ExecSQL انجام میدم یه پورت باز میشه و دیگه بسته نمیشه تا زمانی که برنامه رو ببندم.
با com+ هم نی دونم چطور میشه به sqlserver متصل شد ولی خود کامپوننت ado از این روش استفاده می کنه

gbg
شنبه 28 آبان 1390, 13:45 عصر
این هم بعد از بستن برنامه
78067
این هم بعد گذشت چند دقیقه از بستن برنامه
78066

firststep
شنبه 28 آبان 1390, 14:06 عصر
با com+ شما می تونین یک مونش درست کنین و بعد بوسیله حالا درست کردن یک صف اینهارو یک یه یک بفرستین فر5ق انچنانی نمکنه چون اونجوری هم یک به یک فرستاده میشه

اما در باره ado عجیبه درمورده ado commend هم همینطوره؟

gbg
شنبه 28 آبان 1390, 14:30 عصر
adocommend رو تست نکردم
اون تست می کنم

y_ziaee
شنبه 28 آبان 1390, 15:01 عصر
سلام دوست من:
1 - برنامه را با چه زبانی نوشته اید؟
2 - آیا میتوانید قسمت کوچکی از برنامه را در اینجا قرار دهید؟

gbg
شنبه 28 آبان 1390, 16:26 عصر
از دلفی استفاده کردم و قسمتی کوچیک کد چه کمکی می خواد بکنه؟

gbg
شنبه 28 آبان 1390, 17:41 عصر
برنامه رو تغییر دادم و از adocommend استفاده کردم
فکر می کنم خیلی بهتر شده و شاید بشه گفت حل شدش
حالا فردا وقت میکنم تست اساسی کنم میگم