|
عنوان
|
نويسنده
|
مشاهده
|
تعداد
آراء |
امتياز
|
|
افزايش كارآئی برنامه های وب در ASP. NET 2.0 (بخش پايانی) |
مديريت وب |
4398 |
2 |
4.5 |
افزايش كارآيی برنامه های وب در 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 نشان داده شده است .

شكل 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
تبعيت نشده باشد .
سخن آخر
طراحان و پياده كنندگان برنامه های وب با بكارگيری مجموعه ای از ترفندها
، فناوری ها و رعايت برخی نكات كليدی می توانند برنامه هائی را با كارآئی مطلوب
طراحی و پياده سازی نمايند . با توجه به جايگاه مهم لايه داده در برنامه های وب ،
می بايست بر روی لايه فوق
با دقت بيشتری متمركز و اقدامات لازم را
در زمان طراحی و پياده سازی انجام داد .
پياده كنندگان برنامه های وب با نوشتن
چندين خط كد اضافه می توانند قابليت رشد و كارآئی برنامه های خود را بطرز
چشمگيری افزايش دهند .
استفاده از ابزارهای تست و پروفايلينگ حداقل شرايط لازم به منظور بررسی قابليت های
يك برنامه وب كارآ را فراهم می نمايد تا بتوان قبل از عملياتی شدن مشكلات و
گره های حساس تاثيرگذار
بر روی كارآئی برنامه را شناسائی و
در جهت رفع آنها تلاش كرد .