PDA

View Full Version : تشخيص اتصال يا ارتباط با يك سرور در داخل كد TSQl



esteghamat
سه شنبه 27 آبان 1393, 15:56 عصر
با سلام
من Job ي دارم كه هر شب اجرا مي شود و به چند سرور سر يم زند و عملياتي را انجام مي دهد.
اما اگر يكي از سرورها به هر دليل قطع باشد عمليات ناقص مي ماند.
مي خواستم بتوانم قبل از انجام هر كاري با سرور ، قطع يا وصل بودن با آن را چك كنم و اگر قطع بود خطاي sql server را كنترل كنم و مانع قطع برنامه شوم.
از Try catch استفاده كردم ولي روي اين يك خطا جواب نمي دهد. مثلا داخل try يك select گذاشتم. اما خطاي sql server ايجاد مي شود.
ممنون اگر راهنمايي فرماييد.

pashna
سه شنبه 27 آبان 1393, 20:59 عصر
اگر عملیاتی‌ که روی سرور‌های مختلف انجام میده به هم ربطی‌ نداره، راحت‌ترین راهش اینه که چند تا کوئری جدا کنی‌ و همشونو تواین یه job بذاری.

esteghamat
چهارشنبه 28 آبان 1393, 07:15 صبح
ارتباط الزاميه ، چك داده ها با هم و انجام يك پروسه مشخص .

esteghamat
چهارشنبه 28 آبان 1393, 11:14 صبح
راه حل را پيدا كردم. براي اطلاعدوستان عزير :
چك ارتباط با لينك سرور با كنترل خطا


نكته اول ، از Try Catch با sp زير براي چك ارتباط استفاده مي كنيم.


Declare @LinkedServerName nvarchar(128)
Declare @retval int
Set @LinkedServerName='YourLinkedServerName'
begin try
exec @retval = sys.sp_testlinkedserver @LinkedServerName;
--Print 'OK'
end try
begin catch
set @retval = sign(@@error);
--Print @retval
end catch;


بهتر است اين چك كردن را داخل يك SP قرار دهيم .


Alter Procedure Sp_CheckLinkedserverConnection
@LinkedServerName nvarchar(128),
@retval int OutPut
As
Begin
begin try
exec @retval = sys.sp_testlinkedserver @LinkedServerName;
end try
begin catch
set @retval = sign(@@error);
end catch;
End



بعد از چك لينك سرور اگر ارتباط برقرار بود مي خواهيم كاري انجام دهيم و اگر ارتباط قطع بود، كار ديگري

نكته دوم : مهم است كه نبايد در كدهاي بعدي بصورت شفاف از نام لينك سرور مورد نظر استفاده كنيد و بايد اين نام را داخل يك SP و يا Function پنهان و يا capsulate كنيد.



Create Function dbo.RunOnRemoteServer(@AParameter char(50))
Returns @OutPutResult Table (OrderID int,
CustomerName varchar(20),
OrderTotal money)
as
Begin
insert into @OutPutResult
select Orderid,CustomerName,OrderTotal from [LinkedServerName].RowLevel.dbo.Orders
Return
End



نكته سوم : حتما Functionي كه عمليات خود را در آن انجام مي دهيد و نام لينك سرور را در آن پنهان كرده ايد، در زمان برقراري ارتباط با آن لينك سرور كامپايل كنيد. در زمان قطع ارتباط نمي توانيد آنرا تغير دهيد.

كد نمونه اجراي آن :
Declare @IsConnectionError int
Set @IsConnectionError=0
EXEC Sp_CheckLinkedserverConnection 'YourLinkedServerName', @IsConnectionError OUTPUT
If @IsConnectionError =0
Begin
select * from dbo.RunOnRemoteServer('ParameterValue')
End
Else
select 'Error on Connection'

parsdc
سه شنبه 26 اسفند 1393, 15:00 عصر
دوستان یه سوال در مورد sql server
من با اپلیکیشن از کلاینت با سرور بانک اطلاعاتی خودم کانکت میشم
مراحل زیر را طی میکنم
برقراری اتصال با بانک حدود 2 ثانیه
ارسال کوری و خواندن برگشتی آن کمتر از دویست میلی ثانیه
قطع ارتباط


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

SabaSabouhi
سه شنبه 26 اسفند 1393, 17:56 عصر
دوستان یه سوال در مورد sql server
من با اپلیکیشن از کلاینت با سرور بانک اطلاعاتی خودم کانکت میشم
مراحل زیر را طی میکنم
برقراری اتصال با بانک حدود 2 ثانیه
ارسال کوری و خواندن برگشتی آن کمتر از دویست میلی ثانیه
قطع ارتباط


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

سلام
طبیعی هست که تو زمان خیلی به نفعت می‌شه.
مایکروسافت پیش‌نهادش Closed Connectionها هست، دلیلش هم اینه که تو یه شرکت ممکنه 4000 تا کامپیوتر به دیتابیس دسترسی داشته باشن.
اما گمان نکنم تو کشور ما شرکتی باشه که بیشتر از 20 تا کامپیوتر از یه نرم‌افزار استفاده کنن.
برای پاسخ به این پرسش، بررسی شرایط اجرایی خیلی مهمه. همیشه توصیه‌های مایکروسافت به درد ما نمی‌خوره. چون تقریباً هیچ‌یک از مشتریان
نرم‌افزارهای ما، شرایط شرکت‌های خارجی رو ندارن.

صبا صبوحی

parsdc
سه شنبه 26 اسفند 1393, 19:42 عصر
ممنون از جواب شما،فقط من فراموش کردم حدود تعداد کلاینت ها را بگم
با فرض اینکه یک میلیون کلاینت داریم

SabaSabouhi
چهارشنبه 27 اسفند 1393, 09:04 صبح
ممنون از جواب شما،فقط من فراموش کردم حدود تعداد کلاینت ها را بگم
با فرض اینکه یک میلیون کلاینت داریم

سلام
خوب دقیقاً مهم‌ترین چیز رو فراموش کردی مطرح کنی. :لبخندساده:
با این تعداد کلاینت، حتماً باید از closed connection استفاده کنی.
اگه از EF استفاده کنی ( که خیلی توصیه می‌شه ) اون از closed connection استفاده می‌کنه

صبا صبوحی

parsdc
چهارشنبه 27 اسفند 1393, 13:35 عصر
شرمنده باز سوال میپرسم
من سرچ هم کردم اما چیزی دستگیرم نشد EF چی هست؟
آقا کسی نیست عملی تجربه کار با تعداد زیاد کلاینت با sql را داشته باشه؟ چطور میتونم چنین اطلاعاتی بدست بیارم؟
به عنوان نمونه یک بانک در اوج ترافیک با این ترافیک ها را جواب میده
کارمندان بانک
کارت خوانها
عابر بانک ها
اینترنت بانک
جواب به سامانه همراه بانک و sms بانک
جوابه به درخواست های سایر بانکهای متفاوت

بانک با این حجم بالا چطور جوابگو هست؟
ترفندهای خاصی داره یا نه؟ یا فقط یه mysql یا mssql جوابگو هست؟

SabaSabouhi
چهارشنبه 27 اسفند 1393, 15:55 عصر
شرمنده باز سوال میپرسم
من سرچ هم کردم اما چیزی دستگیرم نشد EF چی هست؟
آقا کسی نیست عملی تجربه کار با تعداد زیاد کلاینت با sql را داشته باشه؟ چطور میتونم چنین اطلاعاتی بدست بیارم؟
به عنوان نمونه یک بانک در اوج ترافیک با این ترافیک ها را جواب میده
کارمندان بانک
کارت خوانها
عابر بانک ها
اینترنت بانک
جواب به سامانه همراه بانک و sms بانک
جوابه به درخواست های سایر بانکهای متفاوت

بانک با این حجم بالا چطور جوابگو هست؟
ترفندهای خاصی داره یا نه؟ یا فقط یه mysql یا mssql جوابگو هست؟

سلام
EF همون Entity Framework هست.
شما قضیه رو خیلی باز نکردی، چطور یک میلیون کلاینت داری؟ آیا همه متمرکز هستن؟ یا در سطح کشور پخش هستن؟
آیا از اینترنت استفاده می‌کنی یا اینترانت یا Leased line؟ حجم تبادل اطلاعات چقدر هست؟ زمان چقدر حیاتی هست؟
اگه متمرکز نیست می‌تونی از WebService استفاده کنی، تو این حالت دیگه مشکل تعداد کانکشن حل می‌شه چون
تعداد کاربرها به تعداد WebServiceها شکسته می‌شه.

صبا صبوحی

parsdc
پنج شنبه 28 اسفند 1393, 07:08 صبح
سلام مجدد
راستش تعداد کاربر سخت هست پیش بینی کنم اما فکر کنم در حدود یک میلیون در زمان اوج ترافیک داشته باشم
تعدادی از کاربرا حدود 100 هزارتا از طریق وب سرویس میگیرند ، یعنی یک صفحه وب را باز میکنند و اطلاعاتی را از دیتابیس مشاهده میکنن که حجم کمی داره در حد چند خط متن
بقیه کاربرا از اپلیکشن روی کلاینت ها استفاده میکنند و هر اپلیکیشن به صورت متناوب هر مثلا دو دقیقه یا یک دقیقه یک بار به دیتابیس متصل میشه و یک true یا false دریافت میکنه که این مشخص میکنه آیا اطلاعات جدیدی باید دریافت بشه یا نه که در صورت نیاز اپلیکیشن متصل میشه و حجم کمی strring را دریافت میکنه
همه در سطح کشور پراکنده هستند و بر بستر اینترنت ارتباط برقرار میشه، از نظر زمان زیاد مهم نیست ، اما نمیخوام کاربر احساس کنه سیستم کند عمل میکنه
احتمالا اپلیکیشنی که دارم مینویسم قادر نباشه با وب سرویس کار کنه چون با زبان lua هست
اما اون 100 هزار نفر شاید چون از رو وب دارن استفاده میکنند و از C# asp.net استفاده میکنم
واقعیتش من چند پروژه با lua بصورت اپلیکیشن که روی اینترنت به دیتابیس متصل میشه انجام دادم در حد 20 کاربر و عالی جواب داده
اما در خصوص تعداد کاربر زیاد نگران و بی تجربه هستم

SabaSabouhi
پنج شنبه 28 اسفند 1393, 09:10 صبح
سلام مجدد
راستش تعداد کاربر سخت هست پیش بینی کنم اما فکر کنم در حدود یک میلیون در زمان اوج ترافیک داشته باشم
تعدادی از کاربرا حدود 100 هزارتا از طریق وب سرویس میگیرند ، یعنی یک صفحه وب را باز میکنند و اطلاعاتی را از دیتابیس مشاهده میکنن که حجم کمی داره در حد چند خط متن
بقیه کاربرا از اپلیکشن روی کلاینت ها استفاده میکنند و هر اپلیکیشن به صورت متناوب هر مثلا دو دقیقه یا یک دقیقه یک بار به دیتابیس متصل میشه و یک true یا false دریافت میکنه که این مشخص میکنه آیا اطلاعات جدیدی باید دریافت بشه یا نه که در صورت نیاز اپلیکیشن متصل میشه و حجم کمی strring را دریافت میکنه
همه در سطح کشور پراکنده هستند و بر بستر اینترنت ارتباط برقرار میشه، از نظر زمان زیاد مهم نیست ، اما نمیخوام کاربر احساس کنه سیستم کند عمل میکنه
احتمالا اپلیکیشنی که دارم مینویسم قادر نباشه با وب سرویس کار کنه چون با زبان lua هست
اما اون 100 هزار نفر شاید چون از رو وب دارن استفاده میکنند و از C#‎ asp.net استفاده میکنم
واقعیتش من چند پروژه با lua بصورت اپلیکیشن که روی اینترنت به دیتابیس متصل میشه انجام دادم در حد 20 کاربر و عالی جواب داده
اما در خصوص تعداد کاربر زیاد نگران و بی تجربه هستم

سلام
من شناختی از این زبان ندارم. اما اگه خیلی خیلی قدیمی نباشه، حتماً امکان استفاده از
WebService رو داره.
و دیگه این که وقتی از راه دور کار می‌کنی باز بودن کانکشن ایده‌ی خوبی نیست و این مساله ربطی
به تعداد کاربرها نداره. کانشکن از راه دور یک کانشکن پایدار نیست و احتمال قطعی زیاد داره.
پس استفاده از Closed connection خیلی ایده‌ی به‌تری هست. من به عنوان یه برنامه نویس
ترجیح می‌دم هنگام باز کردن connection متوجه عدم ارتباط با سرور بشم، تا وسط کار یه فرم.
توصیه می‌کنم حتماً connection رو پس از هر کار ببندی. و به هیچ عنوان نگران زمان از دست
رفته نباشی. وقتی ارتباط از راه دور وجود داره، مسائل مهم‌تری از سرعت وجود داره.

صبا صبوحی

parsdc
پنج شنبه 28 اسفند 1393, 09:55 صبح
lua قدیمی و سطح پایین هست و حتی نمیتونه مستقیم به sqlserver متصل بشه و من اون را از طریق odbc متصل میکنم و مشابه اتصال مستقیم هرکاری میشه باهاش کرد
حالا مساله مهم برای پروژه من این هست با فرض اینکه تعداد اتصال ها به دیتابیس در اوج ترافیک به حداکثر خود رسیده و 32767 اتصال برقرار شده و قبل از اینکه اتصالی بسته بشه یک یا چند کلاینت دیگه سعی در برقرای ارتباط دارند، بعد چه اتفاقی میقته؟
یه خطا از سمت اسکیول دریافت میکنه که من دیگه جا ندارم و دارم میترکم؟ :لبخند:
این خیلی برای من بد هست و باعث میشه پروژه من با مخ زمین بخوره و این موضوع من را نگران کرده در حالی که قبلا گفتم بی تجربه بودن من در کار با اتصال زیاد همزمان باعث نگرانی من شده
حالا یه موضوع دیگه
خیلی اپلیکیشن رو اندروید من دیدم که کاربرای زیادی داره و میشه حدس زد در یک لحظه اتصال ها به دیتابیس از حداکثر تجاوز میکنه مثل برنامه دیوار یا بازار و غیره
احتمال زیاد اونا از mysql هم استفاده کردن اما مشکلی ندارن ، موندم اونا چیکار کردن و ترفند و راه مقابله با این مشکل چیه

SabaSabouhi
دوشنبه 03 فروردین 1394, 09:49 صبح
lua قدیمی و سطح پایین هست و حتی نمیتونه مستقیم به sqlserver متصل بشه و من اون را از طریق odbc متصل میکنم و مشابه اتصال مستقیم هرکاری میشه باهاش کرد
حالا مساله مهم برای پروژه من این هست با فرض اینکه تعداد اتصال ها به دیتابیس در اوج ترافیک به حداکثر خود رسیده و 32767 اتصال برقرار شده و قبل از اینکه اتصالی بسته بشه یک یا چند کلاینت دیگه سعی در برقرای ارتباط دارند، بعد چه اتفاقی میقته؟
یه خطا از سمت اسکیول دریافت میکنه که من دیگه جا ندارم و دارم میترکم؟ :لبخند:
این خیلی برای من بد هست و باعث میشه پروژه من با مخ زمین بخوره و این موضوع من را نگران کرده در حالی که قبلا گفتم بی تجربه بودن من در کار با اتصال زیاد همزمان باعث نگرانی من شده
حالا یه موضوع دیگه
خیلی اپلیکیشن رو اندروید من دیدم که کاربرای زیادی داره و میشه حدس زد در یک لحظه اتصال ها به دیتابیس از حداکثر تجاوز میکنه مثل برنامه دیوار یا بازار و غیره
احتمال زیاد اونا از mysql هم استفاده کردن اما مشکلی ندارن ، موندم اونا چیکار کردن و ترفند و راه مقابله با این مشکل چیه

سلام
برنامه‌های اندروید به راحتی از WebService استفاده می‌کنن و مطمئن باش که برنامه‌هایی مثل بازار یا دیوار هم از WebService استفاده می‌کنن و امکان نداره که
مستقیم به دیتابیس متصل بشن. به نظر من دنبال روش اتصال به WebService باش.

صبا صبوحی

argess
دوشنبه 03 فروردین 1394, 22:01 عصر
اگه یک میلیون کلاینت داری که باید همه به سرور وصل شوند و از بانک اطلاعاتی استفاده کنند خیلی کارها باید انجام بشه.
اول سرور های خیلی قوی
دوم پخش کردن بار ترافیک روی سرور ها
سوم نوشتن برنامه های واسطه مثلا با استفاده از WCF یا وب سرویس که اینطوری تعداد کانکشن های مستقیم به SQL Server کم شود
چهارم استفاده Caching (کش کردن اطلاعات) که از اهم امور است
و خیلی کارهای دیگر
فقط یک کانکشن استرینگ مشکل را حل نمی کند.

در ضمن پیشنهاد می کنم کتاب زیر را دانلود کرده و بخوانید.

رازهای افزایش سرعت سایت های ASP.Net (http://majiksource.ir/index.php?resources/%D8%B3%D9%87-%D9%81%D8%B5%D9%84-%D8%A7%D9%88%D9%84-%DA%A9%D8%AA%D8%A7%D8%A8-%D8%B1%D8%A7%D8%B2%D9%87%D8%A7%DB%8C-%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%D8%B4-%D8%B3%D8%B1%D8%B9%D8%AA-%D8%B3%D8%A7%DB%8C%D8%AA-%D9%87%D8%A7%DB%8C-asp-net-%D9%88-mvc.17/)