وقتی شما تو موقعیت انتخاب فریمورک قرار میگیرین به غیر از مسائل نوع پروژه، قیمت، تعداد نفرات، سختافزار سرور و اجبار در Application Server باید به نوع DataBase نیز توجه کنید که در این مورد شما به عنوان یک برنامهنویس حق نظر دادن در مورد معماری و نوع DB رو ندارید و در مورد انتخاب فریمورک با توجه به اجبارهای موارد ذکر شده در بالا صحبت میکنم:
اولین نکته که باید مد نظر داشته باشید ترتیب انتخاب لایههاست ، اول DA سپس BL و در انتها VC
تکنولوژی و فریمورکهای موجود در لایه DA:
JDBC, Hibernate, Spring Transaction, iBatis
- اگر هیچ cacheای برای شما الزامی نیست و یا سروری که در اختیار دارید بسیار ضعیف است و یا تحت وب کار نمیکند انتخاب شما باید JDBC باشد.
- اگر cache الزامیست و بار سیستم به صورت سینوسی میباشد انتخاب مناسب Hibernate است (سیستمهای warehouse)، مانند سیستمهای نگهداری دادههای بیمارستان
- اگر cache الزامیست و بار سیستم به صورت یکنواخت و مداوم است انتخاب مناسب ST است (سیستمهای Transactional)، مانند سیستمهای بانکی
- اگر cache الزامیست و استفاده از procedure در سطح DB اجبار سیستم است از iBatis استفاده کنید.
در استفاده ازORM ها اگر بر طبق استاندارد J2EE عمل کنید میبایست از JPA در این فریم ورکها استفاده کنید.
در اینجا به یک نکته باید اشاره کرد که آیا AS انتخاب شده ( یا موجود اجبار شده ) Full J2EE Container میباشد یا خیر اگر AS این قابلیت را پشتیبانی کند استفاده از JTA در صورتی که ORM شما ST نباشد توصیه میشود.
به طور کل اگر انتخاب شما ST است یعنی شما نمیخواهید از استاندارد جاوا پیروی کنید و برای این منظور استفاده از ورژنهای قدیمیتر JBOSS مناسب است.
جمع بندی این لایه:
- JDBC + JNDI
- Classic Hibernate
- Hibernate + JPA => standard
- Hibernate + JPA + JTA => standard + Transaction manager
- SpringTransaction
- SpringTransaction + JPA
وقتی شما از شماره V یا VI استفاده میکنید در واقع در RAM فضای این فریمورک را ایجاد کردهاید (Spring Container) که در انتخاب لایههای دیگر تاثیر گذار است.
لایه کاهندگی بار:
در صورتی که در BL بخواهید از میزان بار بکاهید 2 روش پیش روی شماست که با توجه به سخت افزار و انتخاب لایه قبل تعیین میشود.
اگر چند سرور در اختیار دارید و در همه آنها از جاوا استفاده می کنید بار را توسط RMI پخش کنید.
اگر قسمتی از برنامه با زبان دیگری نوشته شده است اگر آن قسمت .NET است از REST استفاده کنید اما اگر PHP باشد توصیه شخصی بنده استفاده از queues میباشد که به نوعی یک مفصر کدهای PHP است و آنها را به جاوا تبدیل میکند به طوری که در تست های من یک وبسایت نوشته شده با فریم ورک Codeigniter بدون تغییر در Tomcat اجرا شد و تنها Exception آن درخواست jar فایل mysql_JDBC بود! یعنی زمانی که تابع mysql_connect() در PHP فراخوانی میشود این کد در Tomcat در زمان اجرا به کد JDBC تبدیل و سپس اجرا میشود با استفاده از این کتابخانه میتوانید کلاس های جاوا را فراخوانی کنید مثلا در صفحه PHP متد Date را از جاوا فراخوانی کنید و یا از resin AS استفاده کنید تا از تمامی قابلیت های این کتابخانه بطور فوق العاده بهرمند شوید و باز هم از RMI استفاده کنید.
در صورتی که میزان تراکنشها بسیار بالا بود و RMI یا REST نیز جوابگو نبود از JMS باید استفاده کنید.
اما اگر یک سرور در اختیار داریم:
اگر در لایه قبل از ST استفاده کرده اید یعنی Spring Container فعال شده است و برای تولید بهینه از Objectها باید از Spring IOC استفاده کرد
در غیر اینصورت اگر AS شما دارای مخزن J2EE می باشد اگر سرور تقریبا متوسط و یا ضعیفی دارید استفاده از CDI پیشنهاد می شود در غیر این صورت استفاده از EJB بهتر است (این نکته را مد نظر داشته باشید که EJB امکان distribution را نیز داراست )
ترکیب محبوب من استفاده از EJB در BL و استفاده از CDI در model utility است
VC
نام فریمورک | کیفیت تولید | کیفیت توسعه | کیفیت عملکرد |
JSP | آسان | سخت | متوسط |
Servlet | سخت | سخت | خیلیخوب |
Struts | متوسط | خوب | خوب |
Spring-MVC | متوسط | خوب | خوب |
JSF | آسان | خیلی سخت | پایین |
JSF in J2EE Container | آسان | خیلی سخت | خوب |
GWT | آسان | خیلی سخت | عالی |
Vaadin | آسان | متوسط | خیلی خوب |
Security Framework
اولویت اول با Realm و بعد Spring Security است
معماری
MVC
CO
MVP
بین JSF و Vaadin اگر سرور خوب باشد اولویت با JSF و اگر سرور ضعیف باشد و یا بار به شدت زیاد باشد اولویت با Vaadin است.
چند نمونه از ترکیب موارد بالا:
ST + Struts + IOC
Struts + Classic Hibernate
Struts + Hibernate + JPA
JSF + EJB + CDI + JTA + JPA + Hibernate
JSF + ST
Struts + JDBC + JNDI
Servlet + JSP + Hibernate
JSP + Servlet + Hibernate + JPA + JTA
Servlet + JSP + ST
GWT + Hibernate
GWT + Hibernate + JPA