ورود

View Full Version : آیا جای LINQ در جاوا خالی است ؟



jeus
یک شنبه 27 تیر 1389, 02:49 صبح
چند وقتی است که روی یک پروژه کار می کنم و نیازهای من در این پروژه باعث شده که گستره دیدم نسبت به جاوا بیشتر بشه و در این جا سعی دارم مبحثی را پیش بکشم تا بتونم از نظرات دوستان نیز بهره مند بشم و اون هم یکی از کاستی های جاوا است نسبت به .net . البته امیدوارم دوستان با دیده تعصب به این موضوع نگاه نکنند و با دلیل و از روی مستندات نظرات خودشون رو بیان کنند تا بنده و دیگر دوستان از مطالبشون بهره مند بشیم .
برنامه من با JEE است و با دیتا بیس mysql برنامه باید هر بار حجم عظیمی از اعطلاعات را پردازش نماید و زمان پردازش هزینه در این مورد بسیار مهم است و این عمر باعث میشه که استفاده از bean های جاوا عملا هزینه بر و زمان بر باشند و تجربه نشان داده برای لود کردن این حجم عظیم داده برای سرعت بخشیدن به پروسه کل سرور down می شود . به این فکر افتادم به جای استفاده از bean ها از function های mysql استفاده کنم که به کاستی های اون برخورد کرده ام اول اینکه زبان نوشتن توابع در mysql به نظر خیلی ابتدایی می آید دوم اینکه نتونستم sample های خوبی از توابع پیدا کنم سوم و یا شاید از همه مهمتر IDE خوبی برای debug کردن کدها یافت نمی شه و همگی بسیار ابتدایی و یا شاید بشه گفت یک note pad بسیار ساده هستند .
اما در عوض قدرتی که در این زمینه میشه در .net دید فناوری LINQ است که باعث شده پروسه کد نویسی سرعت بگیره و همچنین لایه دم دست تری برای مدیریت داده ها بوجود بیاد چیزی که متاسفانه در java شاهد آن نیستیم
البته بعضی ها عقیده دارند که HQL و hibernate همان کار را انجام میدهند که به نظر من چنین نمی آد و مضحکه که این دو را با هم مقایسه کنیم.
دوستان من این پست را همانند دیگر پستهام برای یادگیری خودم و گرفتن جوابم زدم و جنبه آموزش نداره از دوستان می خواهم که تجربیات و نظراتشون را بنویسند .


جا داره اینجا انتقادی هم از مدیران ارشد سایت بکنم که IRC سایت را منحل کردند چون اینگونه مباحث بسیار سریعتر و دقیقتر در یک محیط real time حل می شه و متاسفانه مدیران تالارها از جمله مدیر همین تالار که احترام خاصی هم براشون قائل هستم هیچ راه ارتباطی جز این سایت در اختیار دوستان قرار نداده اند و این وظیفه مدیران ارشد است که نسبت به راه اندازی IRC اقدام نمایند .

behrooj
یک شنبه 27 تیر 1389, 14:17 عصر
نکته‌ی جالبی اشاره کردید، به نظر میاد که بحت مشابهی هم در اینجا (http://stackoverflow.com/questions/1217228/what-is-the-java-equivalent-for-linq) رخ داده.

مهم‌ترین نکته‌ای که به نظرم میاد بگم اینه که LINQ امکانات بسیار خوبی ارائه می‌ده اما فکر می‌کنم مهم‌ترین دلیل این که این کار امکان‌پذیر هست اینه که این بستر/فناوری به مقداری زیادی به شکل native ارائه می‌شه به این معنی که وابستگی‌های متقابل زیادی بین LINQ و کامپایلر‌های موجود در بستر .NET وجود داره که امکانات LINQ رو میسر می‌کنه. فکر می‌کنم زمانی میشه این انتظار رو بستر Java داشت که قبلش JSRی برای این موضوع قرار بگیره که این امکانات و سرویس‌ها از سوی Java Compiler ارائه بشه که بعد روش ابزار‌های متفاوتی ساخته بشه.

با این حال به نظر میاد که فعالیت‌های زیادی تو این زمینه هم انجام شده:
۱. فکر می‌کنم JaQue (http://code.google.com/p/jaque/) نزدیک‌ترین ابزار به مانند امکانات مبتنی بر C#‎ باشه
۲. Quaere (http://xircles.codehaus.org/projects/quaere) و lambdaj (http://code.google.com/p/lambdaj/) هم این امکانات رو فراهم می‌کنن که من فکر کنم lamdbaj طراحی بهتر و امکانات جالب‌تری داره.
۳. مقایسه‌ای از مشابه‌های LINQ در Java هم در اینجا (http://source.mysema.com/display/querydsl/Similar+frameworks) هست که به طور خاص Querydsl (http://source.mysema.com/display/querydsl/Querydsl) جالب بود برای من.

یه حاشیه‌ هم اگه اجازه هست می‌خوام به بحث بزنم (اما نمی‌خوام بحث رو منحرف کنم) چون نکات جالبی می‌شه بحث کرد. اول؛ این که من از حجم داده‌های شما خبر ندارم اما روش‌های Caching یا بهینه‌سازی ارتباطات با MySQL ممکنه کارایی سیستم شما رو بالاتر ببره؟ دوم؛ در عین این که دیباگ رو مفید می‌دونم اما چرا از روش‌های تست‌نویسی برای کارتون استفاده نمی‌کنید؟ این طوری فکر می‌کنم که ضریب اطمینان سیستم هم در شرایط مختلف بالا می‌ره.

موضوعات جالبی بود، ممنون.

jeus
یک شنبه 27 تیر 1389, 18:08 عصر
برای بار دهمه که مطلبی نوشتم و زمان ارسال دوباره سرور سایت منو logout کرده بود و کل مطلب نوشته شده ام پرید و الان دارم دوباره می نویسم :عصبانی:

در ابتدا لازم به ذکر است که تکنولوژی LINQ در بسیاری از موارد مشابهی در JEE داره اما در مواردی هم کار را برای برنامه نویسان ساده کرده و باعث شده که سرعت برنامه نویسی افزایش پیدا کنه و کدهایی به مراتب تمیز تر ایجاد شود در مورد تمام API هایی که دوستمون به اونها اشاره کرد مانند lambdaj (http://code.google.com/p/lambdaj/) باعث می شوند که کار به مراتب ساده تر بشه اما چون استاندارد خود شرکت sun و یا با JSR ارائه نشده است از استقبال برنامه نویسال جاوا برخوردار نیست و بیشتر برنامه نویسان علاقه به استفاده از استانداردهای جاوا دارند .
در مورد بعد هم لازم به ذکر است که اشاره کنم من در مورد linq دچار کج فهمی شده بودم و تصورم از LINQ این بود که توابع نوشته شده در زبانهای .NET به توابع Ms SQL تبدیل می شوند و در sql Server اجرا می شوند که با مطالعه دقیقتر متوجه این اشتباه شدم و این مورد از نظر بنده هر چند که سرعت را بالا می بره اما عملا مشکلات اصلی که برنامه نویسان برای پردازش داده هاشون در MS SQL دارند را بر طرف نمی کنه (این یک نظر شخصی است) و دیگر لازم می دونم ذکر کنم که برنامه های نوشته شده در JEE نیز از همین مشکل بر خوردار هستند و در حالی که استفاده از تکنیک ORM و استفاده از API هایی مانند JDO کارهای برنامه نویسی و قابلیت توسعه برنامه را بسیار بالا برده اما مشکل اصلی را در جایی برای پردازش حجم عظیم اطلاعات ذخیره شده در دیتا بیس شاهد می شیم .
حالا دلایل را ذکر می کنم .
API های جاوا مانند JDO اطلاعات را از دیتابیس گرفته و بعد از تغییرات ذخیره می کنند که این مورد برای پردازش اطلاعات در حجم کم مشکلی ایجاد نمی کند اما در حجم های بالا باید بین سرعت و هزینه یکی را انتخاب کرد . شما میتوانید ۱۰ هزار رکورد را لود کرده و بر روی آنها پردازش را انجام داده و دوباره ذخیره کنید که این یعنی هزینه بالای استفاده از RAM و CPU که باعث افزایش سرعت میشه و یا مبتوانید داده ها را کم کم از دیتا بیس فرخوانی کرد و پروسه را روی انها انجام داد که باعث زمان بر شدن پروسه میشه اما هزینه به نسبت کمتری داره اما در کل استفاده از خود دیتابیس به مراتب کم هزینه تر خواهد بود و کارها را هم ساده تر میکند به طور مثال تابعی که تمام کارها را بر روی حجم عظیم داده ها انجام میدهد و شما تنها کافی است که اونو از درون جاوا صدا بزنید شما در این حالت خیلی از منابعی را که جاوا احتیاج به ساختنشون را داره حذف کرده و مستقیما داره داده ها را پردازش می کنه و طی آزمایش ساده ای که انجام دادم به مراتب از کارایی بهتری برخوردار بود.


اینجا هم بد نیست در مورد کاری که من می خواهم انجام بدم توضیحاتی بنویسم .
هر هفته یک بار یک سری عدد مربوط به مشتریان برای ما به یکباره ارسال میشه کل هر مشتری یک عدد داره و تعداد مشتریان حدود ۵۰ هزار عدد است هر کدام از این عددها باید تقریبا با ۱۰ جدول دیگر در ارتباط باشند تا دوباره ۱۵۰ هزار رکورد ثبت گردد اکنون مشکل اینجاست شخص اپراتور بعد از ورود ۵۰ هزار رکود در همان لحظه توقع چاپ ۱۵۰ هزار رکورد را دارد و این یعنی مشکل زمان که جاوا در یک آزمایش در مقیاس بسیار کوچکتر بسیار کند عمل کرد .

mazdadoost
یک شنبه 27 تیر 1389, 21:58 عصر
سلام :

راستش من متوجه نشدم :

1-جاوا Linq نیاز داره ؟
2-linq کارایی بالایی داره!
3-مشکل کارایی برنامست؟
4-راه حل ایجاد linq در جاواست!

مشکل راح حل برای پروژه :

اینجا هم بد نیست در مورد کاری که من می خواهم انجام بدم توضیحاتی بنویسم .
هر هفته یک بار یک سری عدد مربوط به مشتریان برای ما به یکباره ارسال میشه کل هر مشتری یک عدد داره و تعداد مشتریان حدود ۵۰ هزار عدد است هر کدام از این عددها باید تقریبا با ۱۰ جدول دیگر در ارتباط باشند تا دوباره ۱۵۰ هزار رکورد ثبت گردد اکنون مشکل اینجاست شخص اپراتور بعد از ورود ۵۰ هزار رکود در همان لحظه توقع چاپ ۱۵۰ هزار رکورد را دارد و این یعنی مشکل زمان که جاوا در یک آزمایش در مقیاس بسیار کوچکتر بسیار کند عمل کرد .

در کل هنوز متوجه هدف این تاپیک نشدم.
لطفا دقیقا تو چند جمله مشکل رو یک نفر برای من هم توضیح بده.
مرسی.

jeus
چهارشنبه 30 تیر 1389, 18:31 عصر
از همه دوستان عذر می خوام و حق با مدیر خوب بخشمون آقای mazdadoost (http://www.barnamenevis.org/forum/member.php?u=34885) هست . یکم این تاپیک به بیراهه رفت .
بد نیست یک جواب در رابطه با نام تاپیک بنویسم .
مبنای ایجاد LINQ جدا بودن ۳ لایه از سیستم three tier بود از که شامل Relations in data tier و Objects in business tier وXML in presentation tier می شود که به مثلث ROX معروف است و ملزم شدن شخص به یادگیری منطق و اصل هر کدام از لایه هاست اما با تکنولوژی LINQ در ضمن داشتن هر ۳ لایه می توانید بسیار راحت تر این قسمت ها را مدیریت نمایید. http://piau.ir/down/ramin/pic/understandinglinq.gif

همینجور که در شکل بالا مشخص است شما می توانید با هر کدام از منابع مانند Object , Realational Database , xml رفتاری مانند یک دیتابیس رو داشته باشید و این یعنی سرعت بیشتر در امر کد نویسی .
بد نیست یک قطعه کد هم از LINQ بگذارم .

int someValue = 5;

var results =
SomeCollection
.Where(c => c.SomeProperty < someValue * 2)
.Select(c => new {c.SomeProperty, c.OtherProperty});

foreach (var result in results)
{
Console.WriteLine(result.ToString());
}


خوب حالا جواب من اینه که درست که مدیریت داده ها با lINQ بسیار ساده می شود اما نبود این تکنولوژی برای جاوا ضعف آنچنانی محسوب نمی شود و از قدرت جاوا چیزی کم نمی کند و البته API هایی مشابه توسط دوستمون behrooj (http://www.barnamenevis.org/forum/member.php?u=150006) ارائه شد .
البته نکته این جاست که چه خوب می شد که یک زبان شبیه جاوا برای مدیریت داده در MYSQl بود و مدیریت پردازش اطلاعات را بر روی جداول mysql توسط mysql Server انجام می داد .

همانطور که در تصاویر زیر می بینید .
با ساختن یک تابع محاسباتی با زبان جاوا در JEE این تابع به صورت یک function در mysql ایجاد شود و در هنگام فراخوانی این تابع در mysql صدا زده شود و عملیات لازم را انجام دهد و یا اینکه خود application Server این تابع را به صورت خودکار ایجاد نماید و فکر می کنم اگر چنین تکنولوژی بوجود بیاد بسیار کار طراحی BI راحت می شود .
http://www.Free-Picture-Host.com/images/tn_c7gBwn1279722606.jpg (http://www.Free-Picture-Host.com/viewimage.php?file=/images/c7gBwn1279722606.jpg)

و یا JDBC کار تبدیل توابع نوشته شده توسط جاوا را به mysql Function و یا mysql procedure فراهم کند و تنها سرور نیاز به صدا زدن اونها و نمایش نتیجه دارید .
http://www.Free-Picture-Host.com/images/tn_QKqgGd1279722249.jpg (http://www.Free-Picture-Host.com/viewimage.php?file=/images/QKqgGd1279722249.jpg)


البته استفاده از این تکنولوژی هم برای بعضی از جاها مفید خواهد بود و کاربرد خاص خود را دارد .

لطفا دقیقا تو چند جمله مشکل رو یک نفر برای من هم توضیح بده.

و اما مشکل این بود که من تصورم از LINQ در اوایل این بود که یکی از کارهایی که انجام میدهد تبدیل توابع به توابع sql Server است به شکل بالا اما متوجه شدم که نه این کار را انجام نمی دهد .

mazdadoost
چهارشنبه 30 تیر 1389, 19:04 عصر
از همه دوستان عذر می خوام و حق با مدیر خوب بخشمون آقای mazdadoost (http://www.barnamenevis.org/forum/member.php?u=34885) هست . یکم این تاپیک به بیراهه رفت .
بد نیست یک جواب در رابطه با نام تاپیک بنویسم .
مبنای ایجاد LINQ جدا بودن ۳ لایه از سیستم three tier بود از که شامل Relations in data tier و Objects in business tier وXML in presentation tier می شود که به مثلث ROX معروف است و ملزم شدن شخص به یادگیری منطق و اصل هر کدام از لایه هاست اما با تکنولوژی LINQ در ضمن داشتن هر ۳ لایه می توانید بسیار راحت تر این قسمت ها را مدیریت نمایید. http://piau.ir/down/ramin/pic/understandinglinq.gif

همینجور که در شکل بالا مشخص است شما می توانید با هر کدام از منابع مانند Object , Realational Database , xml رفتاری مانند یک دیتابیس رو داشته باشید و این یعنی سرعت بیشتر در امر کد نویسی .
بد نیست یک قطعه کد هم از LINQ بگذارم .

int someValue = 5;

var results =
SomeCollection
.Where(c => c.SomeProperty < someValue * 2)
.Select(c => new {c.SomeProperty, c.OtherProperty});

foreach (var result in results)
{
Console.WriteLine(result.ToString());
}


خوب حالا جواب من اینه که درست که مدیریت داده ها با lINQ بسیار ساده می شود اما نبود این تکنولوژی برای جاوا ضعف آنچنانی محسوب نمی شود و از قدرت جاوا چیزی کم نمی کند و البته API هایی مشابه توسط دوستمون behrooj (http://www.barnamenevis.org/forum/member.php?u=150006) ارائه شد .
البته نکته این جاست که چه خوب می شد که یک زبان شبیه جاوا برای مدیریت داده در MYSQl بود و مدیریت پردازش اطلاعات را بر روی جداول mysql توسط mysql Server انجام می داد .

همانطور که در تصاویر زیر می بینید .
با ساختن یک تابع محاسباتی با زبان جاوا در JEE این تابع به صورت یک function در mysql ایجاد شود و در هنگام فراخوانی این تابع در mysql صدا زده شود و عملیات لازم را انجام دهد و یا اینکه خود application Server این تابع را به صورت خودکار ایجاد نماید و فکر می کنم اگر چنین تکنولوژی بوجود بیاد بسیار کار طراحی BI راحت می شود .
http://www.Free-Picture-Host.com/images/tn_c7gBwn1279722606.jpg (http://www.Free-Picture-Host.com/viewimage.php?file=/images/c7gBwn1279722606.jpg)

و یا JDBC کار تبدیل توابع نوشته شده توسط جاوا را به mysql Function و یا mysql procedure فراهم کند و تنها سرور نیاز به صدا زدن اونها و نمایش نتیجه دارید .
http://www.Free-Picture-Host.com/images/tn_QKqgGd1279722249.jpg (http://www.Free-Picture-Host.com/viewimage.php?file=/images/QKqgGd1279722249.jpg)


البته استفاده از این تکنولوژی هم برای بعضی از جاها مفید خواهد بود و کاربرد خاص خود را دارد .


و اما مشکل این بود که من تصورم از LINQ در اوایل این بود که یکی از کارهایی که انجام میدهد تبدیل توابع به توابع sql Server است به شکل بالا اما متوجه شدم که نه این کار را انجام نمی دهد .
دوست خوبم سلام :

خوب اگر خوب متوجه شده باشم منظور شما اینه که ما بتونیم کد های جاوامون رو در خود پایگاه داده sql به شکل Native مثلا Stored Pro در یک پروسه اجرا کنیم تا هم کد های پایگاه داده ما از ویژگی های شی گرایی جاوا استفاده کنه و هم کارایی بالایی داشته باشیم !
Oracle مدت هاست این ویژگی رو در دیتابیسش پیاده کرده .یک مثال :
http://www.developer.com/db/article.php/3337411/Oracle-and-Java-Stored-Procedures.htm
منظورتون همینه؟

jeus
پنج شنبه 31 تیر 1389, 00:10 صبح
دوست خوبم سلام :

خوب اگر خوب متوجه شده باشم منظور شما اینه که ما بتونیم کد های جاوامون رو در خود پایگاه داده sql به شکل Native مثلا Stored Pro در یک پروسه اجرا کنیم تا هم کد های پایگاه داده ما از ویژگی های شی گرایی جاوا استفاده کنه و هم کارایی بالایی داشته باشیم !
Oracle مدت هاست این ویژگی رو در دیتابیسش پیاده کرده .یک مثال :
http://www.developer.com/db/article....Procedures.htm (http://www.developer.com/db/article.php/3337411/Oracle-and-Java-Stored-Procedures.htm)
منظورتون همینه؟ نه اصلا
هنگامی که شما دارید با پایگاه داده mysql و یا MS SQL و یا ORACLE کار می کنید و یک سیستم خبره را پیاده سازی می کنید خیلی بهتره که عملیاتی که برای انجام محاسباتی بر روی حجم عظیم اطلاعات درون دیتابیس انجام بشه که این محاسبات ممکن این دستور باشه .

INSERT INTO TABLE1 (a1,a2,a3) SELECT b1*3,b2*2,b3/3 ifrom TABLE2که البته این یک دستور ساده است و نیازی نداره باسش پروسیجر و یا تابع تعریف شه و با استفاده از JDBC میشه به راحتی این دستور را اجرا کرد و هیچ تفاوتی هم نداره اما من بعضی از کارها هستند توی دیتابیس که اگر بخواهیم توی جاوا این کارها را انجام دهیم نسبت به نوشتن تابعی به همون شکل توی mysql بسیار پر هزینه است
حالا همون مثال بالا را فرض بگیریم که راهی برای insert به این شکل براش وجود نداره و ما مجبوریم که اطلاعات را درون یک آرایه بریزیم و تک تک با یک حلقه اونها را insert کنیم . خوب به نظر شما چقدر هزینه بر تر خواهد شد قاعدا خیلی تازه با این تصور که شما با بالاترین performance برنامه را بنویسید .
البته باز هم می گم این یک مثال بود و هیچکی از این روش استفاده نمی کنه
حالا با یک مثال شمارو آشنا می کنم که بیشتر قضیه را درک کنید .
جداول
۱: ریز مشخصات فرد
۲: میزان دریافت و پرداخت های افراد
۳: میزان سود دهی فرد
۴:سن فرد
۵:میزان کار فرد در هفته
۶:نوع بیمه
۸:میزان جریمه
۹:حق عائله مندی (انشالله که آئله را درست نوشتم)
خوب برای محاسبه میزان حقوق فرد می بایست تمام این موارد را لحاض کنیم و اینکه اطلاعات به گونه ای هستند که نمی توان از اونها View گرفت و برای محاصبه باید از جدول یک شروع کرد و یکی یکی مشخصات افراد را در آورد و باز هم SELECT از جداول و انجام پروسه تا نتیجه نهایی البته شاید این مثال زیاد قابل لمس نباشه اما مثال دیگه ای جز کار خودم به ذهنم نمی آد که اونم به دلایل امنیت ملی نمی تونم اینجا ذکر کنم اما شما تصور کنید که باید برای بدست آوردن نتیجه باید از ۱۰-۱۵ جدول select انجام دهید و اطلاعاتی را وارد ۴-۵ دیتابیس کنید و این همه کار برای یک رکورد مشخصات فرده و حالا فکر کنید که ۵۰۰۰۰ رکورد داشته باشید خوب امیدوارم درک کرده باشید که چقدر هزینه و زمان می بره اما راه ساده تر استفاده از چندین procedure و یا function در دیتابیس است و اگه نخواهیم هزینه کمتر را حساب کنیم , کمترین مزیتش اینه که می شه بصورت Schedule زمانی که بار ترافیک سرور کمه اونو اجرا کرد .
تابع اول اونو من با جاوا می نویسم





import java.sql.*;

public class SelectApp {
public static void main(String args[]) {
String url = "jdbc:msql://athens.imaginary.com:4333/db_web";

try {
}
catch( Exception e ) {
return;
}
try {
Connection con = DriverManager.getConnection(url, "borg", "");
Statement select = con.createStatement();
//nemishe hame record ha ro load kard va bayad ghesmat beshan
ResultSet result = select.executeQuery("SELECT ID FROM Employee");

System.out.println("Got results:");
while(result.next()) { // process results one row at a time
int key = result.getInt(1);
// tamam in method ha select va insert darand
method1(key);
method2(key);
method3(key);
method4(key);
method5(key);
method6(key);


}
select.close();



con.close();
}
catch( Exception e ) {
e.printStackTrace();
}
}
}


خوب حال همین کد را توی mysql بررسی می کنیم .




CREATE PROCEDURE EMPLOYEE()
BEGIN
DECLARE done,a INT DEFAULT 0;
DECLARE ID CURSOR FOR SELECT id, FROM DB.EMPLOYEE;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

OPEN ID;


REPEAT
FETCH ID INTO a;
function1();
function2();
function3();
function4();
function5();
function6();

UNTIL done END REPEAT;

CLOSE ID;

END


خوب متوجه تفاوت شدید ؟
خوب حالا جواب رئیس mazdadoost (http://www.barnamenevis.org/forum/member.php?u=34885) ,نه رئیس منظورم این نبود و به این فکر می کردم که تابعی را با زبان جاوا بدون نگرانی از ارتباطها و ... که قاعدا خیلی ساده تر از متد جاوایی که بالا نوشتم می شه را بنویسیم و اونو تبدیل کنه به پروسیجر و تابع های mysql و بشه اونها رو از هر جایی صدا زد و برعکس اون هم اتفاق بیفته یعنی کل پروسیجر mysql تبدیل بشه به کدهای جاوا
و اینجاست که میشه گفت دنیا بهشت میشه و به نظرم SCALABILITY به نهایت خودش می رسه .

billguess
پنج شنبه 31 تیر 1389, 18:05 عصر
چند وقتی است که روی یک پروژه کار می کنم و نیازهای من در این پروژه باعث شده که گستره دیدم نسبت به جاوا بیشتر بشه و در این جا سعی دارم مبحثی را پیش بکشم تا بتونم از نظرات دوستان نیز بهره مند بشم و اون هم یکی از کاستی های جاوا است نسبت به .net . البته امیدوارم دوستان با دیده تعصب به این موضوع نگاه نکنند و با دلیل و از روی مستندات نظرات خودشون رو بیان کنند تا بنده و دیگر دوستان از مطالبشون بهره مند بشیم .
سلام
همون طور که خودتون می دونید تولید نرم افزار از جاوا شروع نمی شه یا بهتر بگم یه چیزی مثل جاوا یا سایر ابزار ها در مرحله پیاده سازی مطرح می شن
نمی دونم چرا ولی ذهن کوچک من بهم می گه که شما از قدم های اول خوب کار نکردید و فکر می کنم طراحی جداول شما اگر تغییراتی داشته باشه کار برای شما راحت تره ،شاید دیگر نتونید دست به این کار بزنید ولی حسنی که داره اینه، لااقل به دنبال ابزار های جدید هم نمی گردید
وقتی که قراره در یک مدت کوتاه روی داده ها کار شه یعنی مثلاً ماهی یک بار .در زمان طراحی جداول یک سری جداول کمکی در نظر باید گرفت و با استفاده از توابع کمکی و ساز و کارهای مناسب الگوریتمی و استفاده مناسب از تریگر ها کار پیرایش و پردازش داده ها را به مرور انجام داد تا تمام کارها یک جا برای یک مدت کوتاه مثلاً در یک روز در یک ماه انباشته نشه
و صرف استفاده از ابزارهای Enterprise باعث نمی شه که نرم افزارها مثلاً Enterpriseنامیده بشن
امیدوارم در مورد اطمینان خودتون از جداول کارتون یک نظری بذارید..
با سپاس

mazdadoost
پنج شنبه 31 تیر 1389, 22:53 عصر
سلام!

خوب راستش با عرض شرمندگی من هنوز هم خوب مطلب رو نگرفتم!

اما خوب اگر بخوام هزینه ای که شما ازش صحبت میکنیم رو رو قدرت پردازش (IO/CPU/MEMORY/BWITH...)
میتونیم به چند مسئله دقت کنیم :

1- بسته به اینکه برنامه ما وابسته به Cpu باشه یا I/O سوای اینکه از آلگوریتم های خیلی بهینه ای استفاده کنیم در نهایت مجبوریم بهای قدرت پردازش که به اون نیاز داریم بپردازیم ! مثال :

نمی دونم شما با نرم افزار های پردازش تصاویر پزشکی گار کردین یا نه؟ ابه این تجربه دقت کنید :
ما یک نرم افزاری داریم به اسم Leonardo ساخت کمپانی Siemens که قیمتی حدود 250 میلیون تومن داره .
کار این نرم افزار انجام کار های تشخیصی بروی تصاویر بدست اومده از سی تی اسکن های مولتی اسلایس کمپانی Siemens هست .
این نرم افزار الگوریتم های قدرتمندی داره ولی وقتی ما خواستیم اون رو روی 3 GB رم و CPU 4 هسته ای Zeon
اجرا کنیم وقتی 2000 تصویر رو خواست در حافظه یک جا لود کنه ما شاهد کارایی بسیار بدی بودیم(چرا با هم؟ چون برای اینکه بتونه روی تصاویر کار کنیم به کلیتشون با هم برای پردازش نیاز داریم نه اطلاعات بخشی از اونها)
خوب ما یک mac pro با دو CPU دوهسته ای Zeon و 16GB Ram تهیه کردیم و خیلی خوب جواب داد!حتی وقتی ما روی مجازی سازی Leonardo که برای Winxp64 تهیه شده بود روی Mac اجرا کردیم/

پس جنبه اول در کارایی برنامه پلت فرم سخت افزاری شماست که شما باید براش هزینه کنید .چون : الگوریتم ها معجزه نمیکنن!(شاید اینطوری به نظر برسه!)

2- در هنگام Planning برای پروژه های مختلف باید حد و حدود قدرت پردازشی سیستم نهایی سنجیده بشه .مخصوصا در محاسبات توزیع شده سازمانی و حیاتی :
مثال شما رو برسی کنیم :

*-قسمتی که حساس به I/O هست و بیشتر مربوط به database میشود و نه برنامه شما در این جا چنانجه شما باید محاسبه کنید آیا نیاز به Cluster دارید یا خیر ! گاهی اوقات شما نیاز به Cluster-Replication دارید. حتی میتونید جداولی رو که کار های محاسباتی پیچیده و سنگین روشون انجام میشه و به علت تغیرات زیاد نمیتونید Cache شون کنید در یک کلاستر مجزا قرار بدین تا از طریق Replicate با جداولی از پایگاه داده های دیگر سینک شن. البته در مثال شما میشه از Cache داده ها استفاده کرد چون لیستی که اوردین به نظر نمیرسید لحظه به لحظه درش تغیر ایجاد شه و یا تغیرات جزئی هستن. شما میتونید از Cache استفاده کنید .حالا چه در Database چه در ORM چه در Appserver و... (حتما نیاز به معماری X64 خواهید داشت.)

*- خوب برای استفاده از Cache شما باید Ram خوبی داشته باشید . که باید روی سیستم هاتون محیا بشه.
*- خوب اینکه پردازش هاتون در خود SQL انجام بدین شما به قدرت پردازشی زیادی نیاز دارید . که نیازمن CPU هست و میباید از پایگاه داده ای استفاده کنید که بتونه از چند هسته یا چند CPU استفاده کنه .

اگر بخواهید برای محاسباتتون از JVM استفاده کنید برای بار کردن حجمی از اون همه داده که شما دارید حتما باید رم زیادی به JVM اختصاص بدین. استفاده از پردازش موازی هم کمک کنندست. یا چیزی مثل terracotta.



این فکر می کردم که تابعی را با زبان جاوا بدون نگرانی از ارتباطها و ... که قاعدا خیلی ساده تر از متد جاوایی که بالا نوشتم می شه را بنویسیم و اونو تبدیل کنه به پروسیجر و تابع های mysql و بشه اونها رو از هر جایی صدا زد و برعکس اون هم اتفاق بیفته یعنی کل پروسیجر mysql تبدیل بشه به کدهای جاوا
و اینجاست که میشه گفت دنیا بهشت میشه و به نظرم SCALABILITY به نهایت خودش می رسه

این مسئله چطور می تونه اتفاق بیفته؟ فکر کنید میخواید این سناریو رو خودتون پیاده کنید . اون چیزی که تو ذهنتون هست رو بگید تا بهتر بتونم درموردش قضاوت کنیم و ببینیم چطور روی SCALABILITY میتونه تاثیر بذاره.

مرسی.

smoradi
شنبه 02 مرداد 1389, 07:00 صبح
به این فکر می کردم که تابعی را با زبان جاوا بدون نگرانی از ارتباطها و ... که قاعدا خیلی ساده تر از متد جاوایی که بالا نوشتم می شه را بنویسیم و اونو تبدیل کنه به پروسیجر و تابع های mysql و بشه اونها رو از هر جایی صدا زد و برعکس اون هم اتفاق بیفته یعنی کل پروسیجر mysql تبدیل بشه به کدهای جاوا
و اینجاست که میشه گفت دنیا بهشت میشه و به نظرم SCALABILITY به نهایت خودش می رسه .

در مورد جاوا و استفاده از پروسیجر یه پروژه ای هست به نام MyBatis (http://www.mybatis.org/) (نام قدیمش iBATIS (http://ibatis.apache.org/)) که پشتیبانی خوبی فراهم می کنه.