PDA

View Full Version : بهبورد کار رایی بانک اطلاعاتی برای ساختن یک چت



khadem1386
یک شنبه 27 شهریور 1390, 01:31 صبح
با سلام:
می خواستم در مورد performance استفاده از یک بانک اطلاعاتی من را راهنمایی کنید. سوال من بیشتر در مورد بهروه وری است. تا نرمالایز البته اگر درمورد نرمالایز هم بگیرد هم بد نیست.

سناریو:
می خواهم یک چت بسازم که این چت ها ممکن است تا چند روز باز باشد. بنا براین کل دیالوگ را می خواهم داخل دیتابس قرار دهم.

خوب بطور ساده یک چت در دوقسمت تشکیل شده
قسمت اول لیست مکالمات قبلی است.
و قسمت دوم یک textbox است.با دکمه send

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

اما موضوع سر این است که سرور که نمی توانه اطلاعات را ارسال کنه بلکه باید کلاینت دائما درخواست بکنه که: سرور گرامی لطفا هر چه اطلاعات از این دیالوگ داری برای من بفرست.

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

با توجه به اینکه فکر می کنم ارسال کوئری به دیتابیس در هر دقیقه 30 تا 50 بار بوسیله تایمر درخواست می شود و باتوجه به اینکه مخاطب من هم این در خواست را انجام می دهد و با توجه به اینکه کلی افراد دیگه هم هستند که ممکنه دارند توی این سرور باهم دیالوگ و چت دارند . فکر می کنم باید در مورد performance کار با اساتید مشورت کنم. .

مثالا :
1 اگر بتونم یک کوئری بفرستم که فقط متن ها و massage های را که تابحال توی کامپیوتر من ارسال نشده را فقط ارسال کنه ( چه کویریquery و روشی را پیشنهاد می کنید. که من هر دفعه کن مسیج های را نگیرم. و فقط massage های جدید را تشخیص بدم و جدید ها را دانلود کنم)?؟

2- من یک تایمر دارم که دائما به سرور کوئری می فرسته بنظر شما آیا راهی هست که خیلی سرور دیتا بیس اذیت نشه ( مثلا یک می نی کوئری) تا چیزی شبیه این.؟

3- اصلا می شه از تایمر استفاده نکرد؟ ( نمی شه که یک دکمه refresh بگذاریم ضایع است)

خیلی ممنون از تمامی اساتید

حمیدرضاصادقیان
یک شنبه 27 شهریور 1390, 08:58 صبح
سلام.
یک راه این هست که فیلدی تعبیه کنید که رکوردهایی که ارسال نشده اند مقدار آن 0 باشد و رکوردهای ارسال شده مقدار آن 1 باشدو موقع ارسال فقط رکوردهایی با مقدار 0 رو ارسال کرده و مقدار اونو به یک تبدیل کنید.به جای این که کد رو ارسال کنید کافیه یک SP بنویسید و در سمت کلاینت فقط این SP رو اجرا کنید که هردفعه مقادیر 0 یا 1 رو ارسال کنه.به جز این وقتی SP رو نوشتید میتونید یک Job درست کنید و هر 1 دقیقه یک بار این اطلاعات رو برای کاربر بفرستید و نیازی به استفاده از کدهای Java در سمت Client نیست.با این روش دیگه از Timer هم استفاده نخواهد شد.

khadem1386
یک شنبه 27 شهریور 1390, 17:51 عصر
خیلی ممنون دوست عزیز :
منطورتون از sp همان stored procedure هست؟

نکته بعدی اینکه کن job را نمی دونم چیه ؟ چطور sql مستفیما اطلاعاتش رو مستقیم به کلاینت می فرسته؟

و اصلا نمی دونم چطور ممکنه بدونه اینکه client درخواستی را بفرسته خود server مطلب را بفرسته ( البته می دونم که این ربطی به دیتابیس نداره)


هر یک دقیقه یکبار این اطلاعات را بریا کاربر بفرستیدفکر نمی کنید کم باشه؟ من فکر می کنم اگر یک حالت عادی داشته باشه حد اقل باید دقیقه ای 40 -50 بار این اتفاق بی افته.



موقع ارسال فقط رکوردهایی با مقدار 0 رو ارسال کرده و مقدار اونو به یک تبدیل کنید.
یعنی بعد از ارسال تمام رکورد های 0 بلافاصله همه رکوردهایم را بر روی 1 تنظیم کنم. ؟ و اما ، ولی از کچا بفهم که ارسال درست انجام شده
می شه یک کم کد سمپل هم بگذارید؟ مرسی

من خیلی تازه کارم لطفا تحملم کنید ! )

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

khadem1386
یک شنبه 27 شهریور 1390, 18:23 عصر
من الان با بخش تکنیکال سرور صحبت کردم می گه :
You can install sql server agent on your pc and then try to connect to the
and
I am sorry but we provide cronjob tool on a Linux servers only

این یعنی چی ، یعنی هاستی که من خریدم توی MS sql آن اجازه فعال کردن Agent را نمی ده و یعنی نمی تونم job درست کنم؟

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

( راستی من از SQL Server Management Studio Express 2005 استفاده می کنم)

مرسی

حمیدرضاصادقیان
دوشنبه 28 شهریور 1390, 10:43 صبح
منظور از SP همان Stored Procedure هست. البته توضیحی که من دادم این بود که Job سمت Client طراحی بشه. چون سمت سرور شما نمیتونید چیزی ارسال کنید. سمت Client شما داخل SP خودتون از سرور آخرین اطلاعاتی که فیلد مورد نظر 0 هست رو میگیرید. ولی الان نکته ای که اینجاست اینه که سمت Client دیگه SQL Server نصب نیست. در اینجا میشه برنامه به شکل سرویس باشه.
یعنی شما یک برنامه سه لایه درست میکنید تمام Client ها به لایه میانی وصل هستن و لایه میانی مستقیما با سرور در ارتباطه. در لایه میانی هروقت اطلاعات جدیدی اومد میتونه به تمام Client ها ارسال کنه. با استفاده از قابلیتهای زبانی که دارید برنامه نویسی میکنید این امکان هست.
در این صورت میشه زمان کمتر بشه. دیگه نیازی به استفاده از Job هم نیست. چون شما دارید از سمت سرور با کاربر دیگه ارتباط برقرار میکنید یک ذره کارتون مشکل میشه. وگرنه اگر مستقیما دوکاربر رو بهم متصل کنید میتونید Log متن اونها رو به صورت فایل روی سیستم خودشون ذخیره کنید دیگه نیازی به دیتابیس هم نیست.
چیزی مثل یاهو مسنجر.

khadem1386
سه شنبه 29 شهریور 1390, 11:49 صبح
یکم عذاب وجدان دارم. که در دقیقه 50 بار تقاضای اجرای sp را داشته باشم . تازه اون طرف هم باید همین کار را بکنه

یعنی اگر دونفر دارند روی web با هم تقاضای چت می کنند. و البته چتشون هم داره توی دیتابیس ذخیره می شه.

هر کدوم باید در دقیقه 50-60 بار در خواست بکنند تا کوئری های داخل sp هاشون اجرا بشه. خد-اوکلی خد-ا را خوش می یاد؟

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

parcosoft
سه شنبه 29 شهریور 1390, 13:31 عصر
راستش من خودم رو اونقدر توی SQL قوی نمی دونم . اما قبلاً همچین برنامه ای برای محیط شبکه ی داخلی کارخونمون نوشتم ...
من از تایمری استفاده می کردم که زیاد روی صفحه تاثیر نمی ذاشت.
فقط تعداد پیام های توی اون query که برای اون کاربر بود رو می خوند، اگر بیشتر از تعداد قبلی بود، اونوقت صفحه رو Refresh می کرد و پیام جدید نمایش داده می شد.
از این رو عذاب وجدان زیاد قوی نیست :چشمک:

حمیدرضاصادقیان
سه شنبه 29 شهریور 1390, 14:58 عصر
ببینید لایه میانی یک برنامه ای جدای از برنامه اصلی شماست و تقریبا تمام ارتباط کلاینتها وسرور با این برنامه هست.
این برنامه هم میتونه روی سرور باشه.
این برنامه هر تغییری که توسط کاربری بهش ارسال بشه به دیتابیس میفرسته بعد این قابلیت عرض کردم در اکثر زبانهای برنامه نویسی هست که مثلا چیزی شبیه Notification باشه و به کاربر پیغام بده اطلاعات شما بروز شد یا درخواست های جدید رو براش ارسال کنه
اگر در مورد برنامه های N-Tier یا چند لایه مطالعه کنید کاملا متوجه عرایض بنده میشید.
در سایت هم در این مقوله خیلی زیاد صحبت شده.

khadem1386
پنج شنبه 31 شهریور 1390, 12:30 عصر
راستش من خودم رو اونقدر توی SQL قوی نمی دونم . اما قبلاً همچین برنامه ای برای محیط شبکه ی داخلی کارخونمون نوشتم ...
من از تایمری استفاده می کردم که زیاد روی صفحه تاثیر نمی ذاشت.
فقط تعداد پیام های توی اون query که برای اون کاربر بود رو می خوند، اگر بیشتر از تعداد قبلی بود، اونوقت صفحه رو Refresh می کرد و پیام جدید نمایش داده می شد.
از این رو عذاب وجدان زیاد قوی نیست :چشمک:
ببیند دوست عزیز شما از یک وب پیج لوکال یا محلی استفاده می کردید.
ولی من دارم از اینترنت استفاده می کنم. ممکنه در آن واحد کلی آدم درحال چت کردن باشند . اونوقتت اون سرور بدبخت باید هر ساعت 10هزار بار به هزار تا یوزر خودش هی بگه " بگذار ببینم ، پیغام جدیدی ندارید ، نه پیغم جدیدی ندارید.
شما حساب کن در دقیقه 50 بار بخوای به یک نفر دیگه بگی نه پیغام نیومده پیغام نیومده پیغام نیومده خوب خسته می شی عزیز برادر!

بعد هم اینکه وقتی بخواید ببیند که تعداد با دفعه قبل فرقی کرده یا نه خوب باید باز هم یک کوئری از دیتابیس خود بگیری مثلا ببینی count چقدره؟
برای 1000تا چتی و هر چت 50 بار در ثانیه برای دو نفر 1000* 50 *2 :بیچاره سرور!!


راستی این لایه های میانی مثل N-Tierیا Notification که کلاینت را از سمت خودشون وادار می کنند که دیتا را نمایش بده با زبان asp همخوانی داره؟

حمیدرضاصادقیان
پنج شنبه 31 شهریور 1390, 17:07 عصر
شما میتونید لایه میانی رو با زبان C# بنویسید و به صورت یک نرم افزار روی سرورتون نصب کنید . بعد با اون از طریق ASP ارتباط برقرار کنید.
در تالار دات نت در این مورد کامل بحث شده است.