افزايش كارآئی برنامه های وب در ASP.NET 2.0 New Page 1



ساير




 

 

 

SAKHA RAVESH CO.

 ا مروز

 سه شنبه  28  دی  1395  2017  Jan.  17   Tuesday ToDay
صفحه اصلی  مقالات نکته هادايره المعارف خودآموزها | تازه ها خود آزمون ها    
  نسخه قابل چاپ  

    5 4 3 2 1 

 عنوان

 نويسنده

  مشاهده

 تعداد آراء

 امتياز

 افزايش كارآئی برنامه های وب در ASP. NET 2.0 (بخش پايانی)

 مديريت وب

8102

3

4.3

با توجه به جایگاه داده در عصر حاضر و  لزوم نگاه جامع به این مقوله مهم ، بر آن شدیم تا محوریت فعالیت های خود را بر  روی این موضوع متمرکز نمائیم . از این رو گروه فابک با شعار فناوری اطلاعات برای کسب وکار شکل گرفت و  خدمات خود  را از طریق  سایت www.fabak.ir  به مخاطبان محترم عرضه می نماید

 

افزايش كارآيی برنامه های وب در ASP.NET 2.0

افزايش كارآئی برنامه های وب در ASP. NET 2.0 (بخش پايانی)
آنچه تاكنون گفته شده است :

  • بخش های اول  و دوم  : اشاره به مجموعه ای از نكات كه رعايت آنها در زمان طراحی می تواند زمينه پياده سازی يك برنامه وب كارآ را فراهم نمايد .
  • بخش سوم  : معرفی برخی ابزارها برای تست برنامه های وب
  • بخش چهارم : مفاهيم اوليه caching ، روش های caching در ASP.NET ، نحوه استفاده از output caching
  • بخش پنجم :  Caching و Query string
  • بخش ششم : Custom Caching Control
  • بخش هفتم : caching داده و نحوه استفاده از شی cache
  • بخش هشتم : بررسی يك مثال جهت ايجاد caching با قابليت مشاهده چندين view از داده
  • بخش نهم : كنترل های منبع داده و caching
  • بخش دهم :  بررسی caching با وابستگی (Dependency)
  • بخش يازدهم : سيستم آگاه سازی caching در SQL Server 2000 و SQL Server 7 و نحوه كار آن
  • بخش دوازدهم : نحوه ايجاد cache dependency در يك بانك اطلاعاتی نمونه

در اين بخش بحث خود را بر روی data  caching  ادامه داده و با سيستم آگاه سازی caching در SQL Server 2005  آشنا خواهيم شد.

سيستم آگاه سازی caching  در SQL Server 2000 و  SQL Server 2005
سيستم آگاه سازی caching در  SQL Server 2005  وضعيت بمراتب بهتری را نسبت به SQL Server 2000 پيدا كرده است . چراكه زيرساخت سيستم فوق از طريق يك سيستم ارسال و دريافت پيام موسوم به Service Broker  در بانك اطلاعاتی تعبيه شده است .
Service Broker  يكی از ويژگی های جديد ارائه شده در SQL Server 2005  است . سيستم فوق ، در واقع يك فريمورك ارسال و دريافت پيام توزيع شده را ارائه  می نمايد . با استفاده از ويژگی فوق می توان قابليت های متعددی را به بانك اطلاعاتی اضافه نمود . Service Broker از سيستم ذخيره سازی صف ( FIFO ) استفاده می نمايد و يك لينك ارتباطی بين ارسال كننده پيام و دريافت كننده پيام ايجاد می نمايد . سيستم فوق مديريت صف ها را برعهده داشته و شامل اشياء بانك اطلاعاتی نظير جداول ، view و  stored procedure می باشد .
پياده كنندگان  با استفاده از دستور  CREATE EVENT NOTIFICATION می توانند به SQL Server 2005  آموزش دهند كه در صورت بروز رويدادهائی خاص اطلاعات لازم را برای سيستم آگاه سازی caching ارسال نمايد .
ASP. NET از يك زاويه ديگر به اين موضوع نگاه می كند . پس از مشخص شدن يك query ، فناوری ASP. NET بطور اتوماتيك به SQL Server 2005  اعلام می نمايد كه اطلاعات آگاه سازی را برای هر نوع عملياتی كه می تواند بر روی نتيجه query تاثيرگذار باشد ارسال نمايد . هر مرتبه كه يك عمليات خاص انجام شود ، SQL Server مشخص می نمايد كه آيا اين عمليات می تواند يك دستور ريجستر شده را تحت تاثير قرار دهد و يا خير ؟ در صورتی كه عمليات انجام شده بتواند بر روی يك دستور ريجستر شده تاثيرگذار باشد ، SQL Server يك پيام آگاه سازی را ارسال و فرآيند آگاه سازی را متوقف می نمايد .
سيستم آگاه سازی Caching در SQL Server 2005  نسبت به SQL Server 2000  دارای مزايای متعددی است :

  • آگاه سازی بر اساس جزئيات بيشتری از اطلاعات  . در مقابل غيرمعتبر سازی شی cache شده در زمان بروز تغييرات در يك جدول ، SQL Server 2005 صرفا" يك شی را زمانی غيرمعتبر می كند كه عملياتی نظير درج ، بهنگام سازی و حذف بر روی سطر مورد نظر انجام شده باشد .

  • عدم ضرورت انجام عملياتی خاص برای پيكربندی و آماده سازی سيستم آگاه سازی . برای بهره برداری از سيستم آگاه سازی caching  در SQL Server 2005 ضرورتی به اجرای برنامه خط دستوری aspnet_regsql و يا ذخيره تنظيمات pooling در فايل web.config  وجود ندارد . 

 سيستم آگاه سازی فعاليت خود را بر اساس يك  SELECT query و يا stored procedure آغاز  می كند . در چنين مواردی ، استفاده از SELECT query محدوديت های مختص به خود را داشته و از قوانين زير تبعيت می نمايد :

  •  برای اجرای query بر روی يك جدول می بايست نام آن به صورت   Owner].table ] مشخص گردد . به عنوان نمونه  dbo.Employees   ( صرفا" نمی بايست نام جدول   Employees آورده شود . )

  • در query مورد نظر نمی بايست از توابعی نظير  Conut  ، MAX ، MIN و يا AVERAGE استفاده گردد .

  • نمی توان با استفاده از wildcard تمامی ستون ها را انتخاب نمود ( نظير  SELECT * FROM Employees  ) . در مقابل ، می بايست نام هر ستون دقيقا" مشخص گردد تا SQL Server بتواند تغييرات آنها را پيگيری و آندسته از ستون هائی را كه در نتيجه query تاثيرگذار هستند تشخيص دهد .

شكل صحيح استفاده از دستور Select  به صورت زير است .

SELECT EmployeeID, FirstName, LastName, City FROM dbo.Employees

موارد فوق مهمترين قوانين موجود در اين رابطه می باشند و  مجموعه كامل تری را می توان بر روی msdn مشاهده نمود . در صورت عدم رعايت يكی از قوانين اشاره شده با يك پيام خطاء مواجه نخواهيم شد و در عمل سيستم آگاه سازی caching وظايف خود را به درستی انجام نخواهد داد . توجه داشته باشيد كه پيام آگاه سازی بلافاصله پس از ريجستركردن دستور ، ارسال و آيتم cache شده غيرمعتبر می گردد .

 مقداردهی اوليه سرويس caching
قبل از اين كه بتوان از سيستم آگاه سازی caching در SQL Server 2005  استفاده كرد، می بايست عمليات زير را انجام داد :

  • فعال كردن SQL Server Service Broker  . در صورتی كه Service Broker برای بانك اطلاعاتی مورد نظر فعال نشده باشد در زمان اجرای يك برنامه وب كه قصد استفاده از  سيستم آگاه سازی caching در SQL Server 2005  را دارد ‌، با پيام خطاء زير مواجه خواهيم شد :

    Server Error in '/WebSite4' Application.
    The SQL Server Service Broker for the current database is not enabled, and as a result query notifications are not supported.  Please enable the Service Broker for this database if you wish to use notifications.

    برای حل مشكل فوق كافی است كه  Service Broker را برای بانك اطلاعاتی مورد نظر فعال نمود . بدين منظور می توان از دستور زير در SQL Server  استفاده نمود  :

    ALTER DATABASE [Northwnd] SET  ENABLE_BROKER ;
    GO

    پس از اجرای دستور فوق اين احتمال وجود خواهد داشت كه مجددا" با يك پيام خطاء ديگر مواجه شويم :

    Msg 9776, Level 16, State 1, Line 2

    Cannot enable the Service Broker in database "Northwnd" because the Service Broker
    GUID in the database (B4201B09-6358-4C65-8457-D6F50004A4D9) does not match the one
     in sys.databases (2527A339-BFB3-45C6-978D-412C4FA557CB).

    Msg 5069, Level 16, State 1, Line 2

    ALTER DATABASE statement failed.

    علت بروز اين خطاء بدين دليل است كه عملياتی بر روی بانك اطلاعاتی ( به عنوان نمونه Northwind  ) بدون دنبال نمودن صحيح فرآيندهای آن انجام شده است . به عنوان مثال جايگزينی فايل های mdf .  و  ldf . از بانك های ديگر . توجه داشته باشيد كه می بايست  همواره از رويه ای صحيح برای move و copy بانك اطلاعاتی استفاده كرد ( استفاده از  attach/detach و يا backup/restore ) .
    با توجه به موارد فوق نمی توان broker موجود را بر روی بانك اطلاعاتی Northwind فعال نمود و می بايست يك نمونه جديد را با استفاده از دستور زير ايجاد نمود :

    ALTER DATABASE [Northwnd] SET NEW_BROKER ;
    GO

    برای اطمينان از فعال شدن service broker می توان از query زير استفاده كرد. در صورتی كه مقدار يك برگرداند شود ، اين سرويس بر روی بانك اطلاعاتی Northwind فعال شده است .

    select is_broker_enabled from sys.databases where name = 'Northwnd'

    فراخوانی متد  SqlDependency.Start  . متد فوق مسئوليت مقداردهی اوليه سرويس listening بر روی‌ سرويس دهنده وب را برعهده دارد .

    Dim connectionString As String = _
    WebConfigurationManager.ConnectionStrings("NORTHWNDConnectionString").ConnectionString
    SqlDependency.Start(connectionString)

    فراخوانی متد فوق صرفا" يك مرتبه در مدت زمان حيات برنامه وب انجام می شود و بهتر است كه در متد  Application_Start فايل global.asax قرار داده شود تا زمينه فعال شدن اتوماتيك آن فراهم گردد . همچنين می توان از متد stop برای توقف listener استفاده نمود .

ايجاد cache dependency
برای استفاده از cache dependency در SQL Server 2005 به يك گرامر متفاوت نياز است  كه صرفا" شامل مشخص كردن نام جدول و بانك اطلاعاتی نمی باشد . در مقابل ، SQL Server می بايست از دستور واقعی آگاهی يافته و نسبت به آن شناخت داشته باشد .
در صورت فعال كردن caching از طريق كد ، می بايست با استفاده از constructor كه يك شی SqlCommand را به عنوان پارامتر دريافت می نمايد اقدام به ايجاد SqlCacheDependency كرد .
كد زير نحوه انجام اين كار را نشان می دهد .

Dim con As New SqlConnection(connectionString)
Dim query As String ="SELECT EmployeeID, FirstName, LastName, City FROM dbo.Employees"
Dim cmd As New SqlCommand(query, con)
Dim adapter As New SqlDataAdapter(cmd)
Dim ds As New DataSet()
adapter.Fill(ds, "Employees")
Dim empDependency As New SqlCacheDependency(cmd)
Cache.Insert("Employees", ds, empDependency)

در صورت استفاده از دايركتيو  OutputCache و يا يك كنترل منبع داده ، ASP. NET مسئوليت ريجستر كردن را بر عهده می گيرد و پياده كنندگان می بايست صرفا" مقدار CommandNotification را مشخص نمايند .

 <%@ OutputCache Duration="600" SqlDependency="CommandNotification" VaryByParam="none" %>

بررسی‌ يك مثال كاربردی  
 كد زير نحوه ايجاد cache dependency در SQL Server 2005 و بر روی بانك اطلاعاتی Northwind را نشان می دهد . پس از فعال شدن برنامه فوق و از طريق روتين page_load ، يك وابستگی برای جدول customers ايجاد ( ماحصل اجرای دستور Select ) و ماحصل آن در cache ذخيره می گردد . در صورت بروز هرگونه تغيير در فيلد ContactName جدول customers ( اين كار توسط روتين  cmdModify_Click انجام می شود )  اعتبار داده cache شده بطور اتوماتيك و از طريق سيستم آگاه سازی caching در SQL Server 2005  به اتمام می رسد .

 ايجاد cache dependency در SQL Server 2005  

<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" Debug="true"%>
<%
@ import Namespace="system.Data" %>
<%
@ import Namespace="system.Data.SqlClient" %>
<%
@ Import Namespace="System.Web.Configuration" %>
'===================================================================
 <script runat="server">
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  If Not Me.IsPostBack Then
   
SqlDependency.Start(connectionString)
    lblInfo.Text &=
"ايجاد آيتم وابسته<br />"
    Cache.Remove("Customers")
    Dim dt As DataTable = GetTable()
    lblInfo.Text &=
"اضافه كردن آيتم مورد نظر به cache<br />"
 
  Cache.Insert("Customers", dt, dependency)
 End If
End Sub
'===================================================================
Private dependency As
SqlCacheDependency
Private connectionString As String = _
WebConfigurationManager.ConnectionStrings(
"NORTHWNDConnectionString").ConnectionString
Private Function GetTable() As DataTable
  Dim con As New SqlConnection(connectionString)
  Dim sql As String = "SELECT ContactName FROM dbo.Customers"
  Dim da As New SqlDataAdapter(sql, con)
  ' ايجاد يك وابستگی برای جدول  
  dependency = New SqlCacheDependency(da.SelectCommand)
  Dim ds As New DataSet()
  da.Fill(ds,
"Customers")
  Return ds.Tables(0)
End Function
'===================================================================
Protected Sub cmdGetItem_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles
cmdGetItem.Click
 If Cache("Customers") Is Nothing Then
   lblInfo.Text &= "آيتم مورد نظر در cache موجود نمی باشد<br />"
 
Else
  lblInfo.Text &= "آيتم مورد نظر همچنان در cache موجود است<br />"
 
End If
End Sub
'===================================================================
Protected Sub cmdModify_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles
cmdModify.Click
Dim con As New SqlConnection(connectionString)
Dim sql As String = "UPDATE dbo.Customers SET ContactName='Test Contact_Name' WHERE CustomerID='WOLZA'"
Dim cmd As New SqlCommand(sql, con)
Try
 
con.Open()
  cmd.ExecuteNonQuery()
Finally
con.Close()
End Try
lblInfo.Text &= " بهنگام سازی به اتمام رسيد <br />"
End Sub
'===================================================================
</script>

<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl" >
  <
head id="Head1" runat="server">
 
   <title>Untitled Page</title>
  </
head>
  <
body style="font-family: Tahoma">
    
<form id="form1" runat="server">
      
<div>
          
<asp:Button ID="cmdModify" runat="server" Height="24px"  Text="تغيير جدول"
                             
Width="103px" Font-Names="Tahoma" />
          
<asp:Button ID="cmdGetItem" runat="server" Height="24px"
                              Text="بررسی آيتم cache شده"
                             
Width="180px" Font-Names="Tahoma" /><br /><br />
          
<asp:Label ID="lblInfo" runat="server" BackColor="LightYellow" BorderStyle="Groove"
                           
BorderWidth="2px" Font-Names="Tahoma" Font-Size="X-Small" Height="192px"
                           
Width="536px"></asp:Label
>
       </div>
   
</form>
   </
body>
</
html>

خروجی مثال فوق در شكل 1 نشان داده شده است .

 ايجاد cache dependency در   SQL Server 2005
شكل 1 : ايجاد cache dependency در   SQL Server 2005

مشكلات احتمالی در خصوص سيستم آگاه سازی caching 
در صورتی كه هرگز اعتبار آيتم cache شده به پايان نرسد ، سرويس polling در ASP. NET يك پيام غيرمعتبرسازی را دريافت نمی  نمايد . اين مشكل می تواند دلايل متعددی داشته باشد . فعال نشدن CLR  برای SQL Server يكی از متداولترين مشكلات موجود در اين رابطه است .
رويه ای كه پيام های آگاه سازی را ارسال می نمايد يك رويه دات نت است و به حمايت آن نياز دارد . برای فعال كردن CLR ، می توان از پنجره خط دستور ويژوال استوديو دات نت 2005 استفاده كرد و دستور SqlCmd.exe را تايپ كرد .
كد زير نحوه فعال كردن دستور فوق را برای SQL Server 2005 Express Edition  نشان می دهد :

  SqlCmd -S localhost\SQLEXPRESS

در صورت استفاده از نسخه كامل SQL Server 2005  ، لازم نيست از  instance name استفاده شود ( استفاده از localhost در مقابل  localhost\SQLEXPRESS ) .
همچنين ممكن است با توجه به محل نصب بانك اطلاعاتی لازم باشد كه نام سرويس دهنده تغيير يابد . در دستور قبلی ، فرض بر اين است كه بانك اطلاعاتی بر روی كامپيوتر جاری نصب شده است . 
برنامه كاربردی SqlCmd.exe يك پرامپت دستوری را ارائه می نمايد كه می توان از آن به منظور درج دستورات SQL استفاده كرد . برای فعال كردن CLR از دستورات زير استفاده می گردد .

EXEC sp_configure 'show advanced options', '1'
GO
RECONFIGURE
GO
EXEC sp_configure 'clr enabled', 1
GO
RECONFIGURE

در ادامه و با تايپ دستور quit می توان از برنامه SqlCmd.exe خارج شد.
در صورتی كه اعتبار آيتم cache شده بلافاصله به اتمام برسد ، اين احتمال وجود دارد كه از قوانين اشاره شده در ارتباط با نوشتن query تبعيت نشده باشد .

سخن آخر
طراحان و پياده كنندگان برنامه های وب با بكارگيری مجموعه ای از ترفندها ، فناوری ها و رعايت برخی نكات كليدی می توانند برنامه هائی را با كارآئی مطلوب طراحی و پياده سازی نمايند . با توجه به جايگاه مهم لايه داده در برنامه های وب ، می بايست  بر روی لايه فوق با دقت بيشتری متمركز و اقدامات لازم را در  زمان طراحی و پياده سازی انجام داد .
پياده كنندگان برنامه های وب با نوشتن چندين خط كد اضافه می توانند قابليت رشد و كارآئی برنامه های خود  را بطرز چشمگيری افزايش دهند . 
استفاده از ابزارهای تست و پروفايلينگ حداقل شرايط لازم به منظور بررسی قابليت های يك برنامه وب كارآ را فراهم می نمايد تا بتوان قبل از عملياتی شدن مشكلات و  گره های حساس تاثيرگذار بر روی‌ كارآئی برنامه را شناسائی و در جهت رفع آنها تلاش كرد . 



جستجو

مقالات                 
دايره المعارف       
دوره های آموزشی


 

 

مشاهده گروه ها



              

 

 تهيه شده در شرکت سخا روش -  1382