# فناوری جاوا > برنامه‌نویسی جاوا > بحث و گفتگو در مورد فناوری های مرتبط با جاوا > سوال: مقایسه servlet و CGI

## adamak88

سلام به همه دوستان
من به تازگی با servlet آشنا شدم، 
سوالم اینه که servlet چه مزیتهایی و چه عیبهایی نسبت به CGI دارد و هر کدومشون برا چجور پروژه هایی مناسبترند

----------


## manatech

با سلام.
CGI شاید یکی از مزیت هاش این باشه که تقریباً بر هر زبان برنامه نویسی می توان براش برنامه نوشت (معروفترین این زبان ها Perl و Shell Script هستند ولی از C یا ++C یا حتی Java نیز میشه استفاده کرد). همچنین صفحات وب توسط CGI به صورت پویا تولید میشه. CGI می تونه به منابع خارج از سیستم از جمله بانک اطلاعاتی نیز دسترسی داشته باشه.

*و اما معایب CGI:*


برای هر درخواست یا request ای که به سرور ارسال مجبور میشه، سیستم عامل مجبوره یک فرآیند یا پردازش منحصر به فرد ایجاد کنه و این کار معمولاً سربار زیادی به وب سرور تحمیل می کنه.برای هر request وب سرور مجبوره برنامه ها رو در حافظه بارگذاری کرده و اجرا کنه و این هم سربار زیادی داره.شما نیاز به نوشتن کدهای بسیار پیچیده و تکراری برای رمزگشایی درخواست ها و اداره ی پروتکل های شبکه دارین.
دو عمل نامبرده در اول چرخه های زیادی از CPU و حافظه رو به خودشون اختصاص می دند و اگر در یک زمان تعداد درخواست ها زیاد باشه وب سرور ممکنه سرریز (Overload) کنه!

متأسفانه استفاده از زبان Java برای نوشتن CGI مشکلات رو چند برابر می کنه. تجربه ثابت کرده که CGI های نوشته شده به زبان جاوا بسیار کند و بدون کارایی کافی عمل می کنند و در بسیاری مواقع به خاطر سرریز وب سرور crash می شن.

عدم کارایی جاوا در نوشتن CGI از اونجا ناشی میشه که کد های نوشته شده به زبان جاوا باید تفسیر بشن و چرخه ی ایجاد یک پردازش جدید، آغاز به کار JVM در این پردازش و اجرای تنها یک برنامه CGI نوشته شده در جاوا در JVM مربوطه سربار بسیار سنگینی رو به وب سرور تحمیل می کنه.

*بهینه کردن CGI های مبتنی بر جاوا : استفاده از Servlet ها*

اگر سربارهای تحمیل شده به وب سرور که قبلاً نام بردیم رفع شوند اونوقت CGI های مبتنی بر جاوا نیز بهینه میشن. اگر راهی وجود داشته باشه که برای همه ی درخواست های ارسال شده فقط یک پردازش ایجاد بشه سربار های تحمیل شده نیز از بین می ره!
از اونجا که پلتفورم جاوا این قابلیت رو داره که کلاس های جدید رو در زمان اجرا به صورت پویا در حافظه بارگذاری کنه می توان از این قابلیت برای بارگذاری برنامه های جدید برای همه ی درخواست های ورودی استفاده کرد. به عبارت دیگه فقط یک پردازش  فقط یک بار و JVM نیز فقط یکبار در حافظه بارگذاری میشه  و سایر برنامه ها در زمان اجرا توسط خود JVM در حافظه بارگذاری میشن تا بتونن به درخواست های مشتری رسیدگی کنن. این سناریو خیلی بهینه تر از قبل است و در واقع مزیت های زیر رو داره:


سرباری که در هر بار درخواست باعث ایجاد یک پردازش جدید توسط سیستم عامل میشد از بین میره.سربار که هنگام بارگذاری JVM به ازای هر درخواست وجود داشت دیگه وجود نداره.کلاس های جاوا توسط JVM برای اداره کردن درخواست های مشتری بارگذاری میشن. اگر برای اجرای یک کار مشترک درخواست های زیادی ارسال بشه حتی فشار بارگذاری کلاس ها توسط JVM در هر درخواست نیز از بین میره و وب سرور می تونه از کلاس بارگذاری شده ی قبلی برای اداره ی درخواست استفاده کنه.کدی که برای رمزگشایی درخواست ها و اداره کردن پروتکل های شبکه نوشته میشه می تونه برای تمامی برنامه ها به اشتراک گذاشته بشه.
امیدوارم مفید ولقع شده باشه!

----------

