PDA

View Full Version : گفتگو: استفاده از بانک اطلاعاتی در سرور های اینترنتی



gholami146
شنبه 08 آذر 1393, 23:30 عصر
با سلام خدمت دوستان گلم مخصوصا آقای You-See (http://barnamenevis.org/member.php?70247-You-See)
خیلی وقت بود به برنامه نویس نیومده بودم دلم واستون تنگ شده بود.
=====================================حرف دلم بودن =================
اما ...
من دارم ورژن 2 از برنامه لیست قیمت کالایی رو می نویسم که بصورت انلاین هست یعنی برنامه با دلفی نوشته می شه و به بانک Sql در یک سرور اینترنتی که قابلیت ریموت لاگین داره متصل می شه و اطلاعات رو از اون واکشی می کنه و اطلاعاتی رو هم به اون اضافه میکنه .
من در ورژن اول این برنامه از Unidac استفاده کردم و EhDbgrid ولی چندا مشکل تو این نسخه داشتم که می خوام اوناها رو برطرف کنم .
1- خاصیت تیبل ها به این صورت هست که تمامی رکورد ها رو از سرور به داخل خودش می کشه و سپس به دی بی گرید ارسال می کنه
که این عمل باعث فشار زیاد بر روی سرور میشه به دلیل سرکشی های مداوم برنامه کلایت به سرور جهت بروز رسانی بانک های اطلاعاتیش
راهکاری دارید تا فشار از سرور برداشته بشه ؟
2- از اون جایی که در این برنامه اطلاعات جنبه حیاطی داره نمی خوام تمامی اطلاعات به سمت کلایت فرستاده بشه می خوام فقط رکورد هایی به سمت اون فرستاده بشه که در گزارشاتش در خواست شده . مثلا اگر من 1000 رکورد در جدول دارم و کاربر تقاضای اسم کالایی رو داره که مثلا "نامش تلویزیونه" تمامی اطلاعات براش فرستاده نشه فقط رکورد هایی براش بره که شامل این شرط میشه
3- می خوام صحت لاگین کاربر داعما چک بشه (برای جلوگیری از ورود غیر مجاز) به دین شکل که اگر کاربر مجاز به دسترسی به اطلاعات نبود ارتباط بایک پیام از طرف برنامه قطع بشه (واکشی اطلاعات از سرور زیاد نباشد)

4- آیا راهی هست که فقط در هنگام تغییر اطلاعات در داخل سرور بانک اطلاعاتی سمت کلاینت در خواست بروز رسانی اطلاعاتشو انجام بده.
قابل ذکره من از یک تایمر در برنامه قبلی استفاده کرده بودم و با اون دائما اطلاعات تیبل های سمت کلاینت ها رو بروز رسانی می کردم که اشتباه بود (ایا راهی دیگر در برنامه های بزرگ استفاده میشه)

با تشکر از تمامی اساتیدی که در این تاپیک حتی با نگاه کردن به اون بر سر من حقیر منت میزارن و اما مطمئن هستم با پاسخ گویی به این تاپیک نه تنها به من بلکه به بسیاری از کاربران تازه وارد که سعی در برنامه نویسی بانک اطلاعاتی اینترنتی هستند کمک شایانی رو انجام خواهید داد.
با تشکر دوست قدیمی شما علی غلامی

BORHAN TEC
یک شنبه 09 آذر 1393, 00:07 صبح
با سلام،


من دارم ورژن 2 از برنامه لیست قیمت کالایی رو می نویسم که بصورت انلاین هست یعنی برنامه با دلفی نوشته می شه و به بانک Sql در یک سرور اینترنتی که قابلیت ریموت لاگین داره متصل می شه و اطلاعات رو از اون واکشی می کنه و اطلاعاتی رو هم به اون اضافه میکنه .
منظورتون از سرور اینترنتی چیه؟ یک هاست معمولی یا VPS؟ کلاً میخوام بدونم که میتونی برنامه ای در اون نصب کنید یا نه.


من در ورژن اول این برنامه از Unidac استفاده کردم و EhDbgrid ولی چندا مشکل تو این نسخه داشتم که می خوام اوناها رو برطرف کنم .
بنده در مورد UniDAC اطلاعات زیادی ندارم و با پیش فرض استفاده از FireDAC به سوالات شما تا جایی که سوادم میرسه پاسخ می دم.


1- خاصیت تیبل ها به این صورت هست که تمامی رکورد ها رو از سرور به داخل خودش می کشه و سپس به دی بی گرید ارسال می کنه
که این عمل باعث فشار زیاد بر روی سرور میشه به دلیل سرکشی های مداوم برنامه کلایت به سرور جهت بروز رسانی بانک های اطلاعاتیش
راهکاری دارید تا فشار از سرور برداشته بشه ؟
FireDAC به صورت ذاتی این قابلیت رو داره به این صورت که میتونید تعداد رکوردهایی که در هر بار لود میشه رو مشخص کنید و در صورتی که به رکورد آخر از این رکوردها رسیدید خودش اتوماتیک دسته رکوردهای بعدی رو لود میکنه. به عبارتی میتونید مشخص کنید که رکوردها 50 تا 50 تا لود بشه و این عمل میتونه سرعت لود رو خیلی بالا ببره.


2- از اون جایی که در این برنامه اطلاعات جنبه حیاطی داره نمی خوام تمامی اطلاعات به سمت کلایت فرستاده بشه می خوام فقط رکورد هایی به سمت اون فرستاده بشه که در گزارشاتش در خواست شده . مثلا اگر من 1000 رکورد در جدول دارم و کاربر تقاضای اسم کالایی رو داره که مثلا "نامش تلویزیونه" تمامی اطلاعات براش فرستاده نشه فقط رکورد هایی براش بره که شامل این شرط میشه
اگه از FDQuery به عنوان DataSet استفاده کنید دقیقاً همینطور میشه. توی نسخه قبلیتون من فکر میکنم که شما ابتدا یک Select * from table زدید و بعد اطلاعات رو بنا به نیاز فیلتر کردید!


3- می خوام صحت لاگین کاربر داعما چک بشه (برای جلوگیری از ورود غیر مجاز) به دین شکل که اگر کاربر مجاز به دسترسی به اطلاعات نبود ارتباط بایک پیام از طرف برنامه قطع بشه (واکشی اطلاعات از سرور زیاد نباشد)
دقیقاً به خاطر همین موضوع میخواستم بدونم که از یک هاست معمولی استفاده می کنید یا یک سرور یا VPS. در این موارد اگه از VPS یا سرور که بشه یک برنامه سفارشی رو روی اون اجرا کرد، استفاده کنید میشه یک برنامه واسط با DataSnap بسازید و از قابلیت Rules اون برای کنترلهای اینچنینی بهره بگیرید.


4- آیا راهی هست که فقط در هنگام تغییر اطلاعات در داخل سرور بانک اطلاعاتی سمت کلاینت در خواست بروز رسانی اطلاعاتشو انجام بده.
قابل ذکره من از یک تایمر در برنامه قبلی استفاده کرده بودم و با اون دائما اطلاعات تیبل های سمت کلاینت ها رو بروز رسانی می کردم که اشتباه بود (ایا راهی دیگر در برنامه های بزرگ استفاده میشه)
همانطور که گفتید استفاده از تایمر و چک کردن مداوم کار اشتباهی هست و سربار بسیار زیادی داره. در این گونه موارد می تونید از قابلیت کامپوننت TFDEventAlerter در FireDac استفاده کنید. استفاده از این ویژگی قلق داره و برای یادگیری اون عبارت Database Alerts (FireDAC) رو جستجو کنید(توی راهنمای خودش توضیح داده شده).

موفق باشید...

benyaminrahimi
یک شنبه 09 آذر 1393, 08:47 صبح
با سلام در مورد حالت اول مجومعه کامپوننت های unidac پراپرتی تحت عنوان fetch all با مقدار منطقی و نیز fetch rows با مقدار عددی دارند که میتونید مثلا چهل تا چهل تا مانند برنامه های تحت وب فرا خوانی انجام بدین و این نکته فشار زیادی وارد نمیکنه

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

یوسف زالی
یک شنبه 09 آذر 1393, 12:05 عصر
سلام و ممنون از محبتتون.
اس کيو ال به ذات خودش براي کال بک کردن يک سرويس نوشته شده نه برنامه ريموت. کال بک کردن سرويس هم داستان خودش رو داره. تازه اون هم برای DDL هست نه DML.
http://msdn.microsoft.com/en-us/library/ms190427(v=sql.105).aspx
اگر امکان اين رو داريد که سرويسي رو روي سرور نصب کنيد، همون طور که شاهين هم گفت، در همونجا مي تونيد اعتبار سنجي ها رو هم انجام بديد.
مثلا مي تونيد اين سرويس رو با ايندي يا هر چيز مشابه ديگه بنويسيد و برنامه رو به اون لاگين کنيد. امنيت هم بالاتر مي ره.
اگر اين امکان رو نداريد و سمت سرور چيزي نمي تونيد نصب کنيد، چاره اي جز چک کردن هاي دوره اي نداريد، اما مي تونيد اين چک کردن ها رو با مينيمم ديتا انجام بديد.
قابليت fetch size در DCOM هم گنجونده شده، روشي که مي تونيد باهاش ترکيب کنيد استفاده از paging در کوئري هاتون هست.
در اين خصوص مي تونيد در تالار اس کيو ال بيشتر ببينيد.
با نوشتن کوئري هاي مناسب، مي تونيد دقيقا اطلاعاتي رو که لازم داريد مکش کنيد نه بيشتر.
براي اين کار مي تونيد از کوئري ها استفاده کنيد، يا اين که از اس پي بهره بگيريد که روش امن تر و سريع تريه.
در مورد کانکشن ها، بايد ببيني pulling سيستم سرور چجوريه، اصولا زياد منطقي نيست که مثل برنامه هاي کلاينت سروري روي شبکه، کانکشن باز رها بشه.
در مورد خاصيتي مثل KeepConnection تحقيق کنيد.
مي تونيد از وب سرويس ها استفاده کنيد تا تمام نگراني هاتون از بين بره. در خود سرويس مي تونيد يوزر پس دريافت کنيد.
اما در حال حاضر با اس کيو ال مي تونيد در هر بار فراخواني اس پي، پارامتري کد شده از سمت کلاينت ارسال کنيد که روي هر سيستم يونيکه و در کوئري سمت سرور چک بشه.
در کل، روش دو لايه براي اين نوع برنامه نويسي مناسب نيست، اگر دستتون بازه، يا اين که در ابتداي راه هستيد، سويچ کنيد.
در غير اين صورت بايد پي اين چيزا رو به تنتون بماليد.


در مورد کامپوننت هاي شرکت هاي ديگه، اطلاع جامعي ندارم، شايد بتونيد کامپوننتي رو پيدا کنيد که اين کار ها رو ساده تر پياده کرده باشه.
موفق باشيد.

gholami146
یک شنبه 09 آذر 1393, 18:14 عصر
از راهنمایی همه دوستان عزیز که لطف کردن و جواب گو بودن سپاس گذارم
من این برنامه رو هنوز در دست بررسی دارم و هنوز در حال طراحی بانک اطلاعاتی اون و روابط هستم . پس قادر هستم هنوز تغییرات رو بررسی و اعمال کنم .
اما در مورد کامپوننت FireDac از اونجایی که این کامپوننت در داخل نسخه نصب شده XE6 هست ، من نیز از این کامپوننت بجای Unidac استفاده می کنم تا بتونم از قابلیت های اون بهره ببرم
اما در مورد هاست هنوز اطلاعاتی ندارم چون قرار از طرف شخص درخواست کننده برنامه اجاره بشه و اگه راستشو بخواید من چیزی در مورد VPS تا الان نمی دونستم که با یک هاست معمولی فرق داره که به لطف شما فهمیدم.
و برای کم کردن بار سرور هم سعی می کنم از TFDEventAlerter استفاده کنم به پیشنهاد شما .
با تشکر از اقا بنیامین رحیمی و آقا شاهین و اقا یوسف عزیز که لطف کردید و جواب دادید

gholami146
یک شنبه 09 آذر 1393, 19:10 عصر
با سلام من در مورد TFDEventAlerter مقداری تحقیق کردم و یه چیزایی دسگیرم شد مثلا اینکه برای فعال سازی این قابلیت باید در بانک و در TFDEventAlerter کارهایی رو انجام داد چون من از SQL می خوام استفاده کنم باید نوتی فاکشن های دیتابیس مورد نظر رو فعال کنم که با فرمان ALTER DATABASE <your db name> SET ENABLE_BROKER این کار فراهم میشه و این کار باعث میشه پرچم sys.databases catalog view فعال بشه . و این خاصیت در صورتی که دیتابیس در حالت principal باشه قابلیت فعال سازی نداره .

Service broker cannot be enabled while the database is the principal in a database mirroring configuration.
و یک نکته

http://i.msdn.microsoft.com/areas/global/content/clear.gif Note ENABLE_BROKER requires an exclusive database lock. If other sessions have locked resources in the database, ENABLE_BROKER will wait until the other sessions release their locks. To enable Service Broker in a user database, ensure that no other sessions are using the database before you run the ALTER DATABASE SET ENABLE_BROKER statement, such as by putting the database in single user mode. To enable Service Broker in the msdb database, first stop SQL Server Agent so that Service Broker can obtain the necessary lock.


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

FDEventAlerter1.Names.Clear;
FDEventAlerter1.Names.Add('Customers');
case FDConnection1.RDBMSKind of
mkOracle: FDEventAlerter1.Options.Kind := 'DBMS_ALERT';
mkInterbase: FDEventAlerter1.Options.Kind := 'Events';
end;
FDEventAlerter1.Options.Synchronize := True;
FDEventAlerter1.Options.Timeout := 10000;
FDEventAlerter1.OnAlter := DoAlert;
FDEventAlerter1.OnTimeout := DoTimeout;
FDEventAlerter1.Active := True;
........

procedure TForm1.DoAlert(ASender: TFDCustomEventAlerter;
const AEventName: String; const AArgument: Variant);
begin
if CompareText(AEventName, 'Customers') = 0 then
qryCustomers.Refresh;
end;

procedure TForm1.DoTimeout(ASender: TObject);
begin
// do something
end;

فقط برای SqlServer باید چه گزینه ای رو قرار داد در این قسمت

case FDConnection1.RDBMSKind of
mkOracle: FDEventAlerter1.Options.Kind := 'DBMS_ALERT';
mkInterbase: FDEventAlerter1.Options.Kind := 'Events';
end;
لطفا اگه توضیحاتم دارای ایرادی یا اشتباهی هست اصلاح بفرمایید متشکرم

BORHAN TEC
شنبه 22 آذر 1393, 11:18 صبح
با سلام،
به مثال EventAlerter.dpr موجود در RAD Studio مراجعه کنید.
موفق باشید...