افزايش كارآئی برنامه های وب در ASP.NET 2.0 ( بخش دوم )
Caching در كنترل منبع داده SqlDataSource
مثلا" فرض كنيد قصد داريم صفحه ای را ايجاد نمائيم كه در آن ليست كاركنان بر اساس نام شهر نمايش داده شود . پس از انتخاب شهر توسط كاربر ، از يك كنترل SqlDataSource برای برگرداندن ركوردهای كاركنانی كه با نام شهر مطابقت می نمايند جهت نمايش در يك grid استفاده شده است .
كد زير نحوه استفاده از كنترل SqlDataSource با هدف فعال كردن caching را نشان می دهد .
<asp:SqlDataSource ID="sourceEmployees" runat="server" |
توجه داشته باشيد زمانی كه مقدار خصلت DataSourceMode معادل DataSet در نظر گرفته شده باشد (مقدار پيش فرض) ، پتانسيل caching در كنترل منبع داده SqlDataSource به خوبی كار می كند . شی DataReader نمی تواند بطور موثر cache گردد چراكه شی فوق قادر به برقراری يك ارتباط مستقيم و زنده با بانك اطلاعاتی نمی باشد .
در صورتی كه برخی پارامترها نسبت به پارامترهای ديگر با فركانس بيشتری استفاده شده باشند ، caching جداگانه نتايج با توجه به مقادير مختلف پارامترها وضعيت مطلوبتری را به دنبال خواهد داشت . مثلا" اگر نتايج مربوط به شهر "X " بمراتب بيش از نتايج شهر "Y" درخواست گردد ، اين اطمينان ايجاد خواهد شد كه نتايج شهر "X" بمراتب بيش تر در cache باقی خواهند ماند حتی اگر DataSet مربوط به شهر "Y" از حافظه خارج شده باشد .
به عبارت ديگر ، در صورتی كه مقادير پارامتر ها جملگی با فركانس مشابهی استفاده شوند ، روش فوق يك راه حل مناسب نمی باشد . يكی از مسائل مرتبط با راه حل فوق ، زمانی است كه مدت زمان حضور آيتم های cache شده به اتمام رسيده باشد و لازم است كه جندين query را بر روی بانك اجراء نمود تا نسخه های جداگانه ای از cache را ايجاد نمايد ( نسخه های cache جداگانه با توجه به مقدار پارامتر ) . قطعا" روش فوق دارای كارآئی بمراتب كمتری نسبت به حالتی است كه تمامی نتايج صرفا" با يك query بازيابی می گردد .
در چنين مواردی می توان تمامی ركوردهای كاركنان را بازيابی و در cache ذخيره نمود . در ادامه ، كنترل SqlDataSource می تواند صرفا" ركوردهای مورد نياز را متناسب با درخواست كاربر از DataSet بازيابی نمايد . بدين ترتيب ، يك DataSet به همراه تمامی ركوردهای cache شده می تواند صرفنظر از مقدار پارامتر دريافتی پاسخگو باشد .
برای نيل به خواسته فوق ، می بايست دو تغيير اساسی را در كد فوق اعمال نمود .
اولين تغيير : بازيابی تمامی ركوردها با استفاده از select query ( عدم استفاده از SelectParameter ) . كد زير نحوه انجام اين كار را نشان می دهد :
<asp:SqlDataSource ID="sourceEmployees" runat="server" |
كد زير نحوه تعريف كنترل منبع داده SqlDataSource را پس از اعمال دو تغيير فوق نشان می دهد .
<asp:SqlDataSource ID="sourceEmployees" runat="server" |
caching در كنترل ObjectDataSource
caching كنترل ObjectDataSource دارای يك محدوديت قابل ملاحظه است و صرفا" زمانی كار می كند كه SelectMethod آن يك DataSet يا DataTable را برمی گرداند . در صورت برگرداندن هر نوع اشياء داده ديگر ، با يك NotSupportedException مواجه خواهيم شد .
برای غلبه بر محدوديت فوق می توان پياده سازی data caching را درون متد مربوطه انجام و اقدام به درج دستی اشياء درون data cache كرد. در واقع ، caching درون متد مورد نظر می تواند كارآئی بمراتب بهتری را نيز به دنبال داشته باشد چراكه امكان به اشتراك گذاشتن اشياء cache شده مشابه بين چندين متد فراهم می گردد . مثلا" می توان يك DataTable حاوی ليستی از محصولات را cache و در ادامه از آيتم های cache شده در متدهای GetProductCategories و GetProductsByCategory استفاده نمود .
Caching با وابستگی
برای كمك در جهت حل اين نوع مشكلات ، ASP.NET از caching با وابستگی حمايت می نمايد . با استفاده از ويژگی فوق اين امكان در اختيار پياده كنندگان قرار می گيرد تا بتوانند حضور يك آيتم در cache را به منابع ديگری وابسته نمايند . در چنين مواردی ، زمانی كه در منبع مورد نظر تغييراتی ايجاد گرديد ، آيتم cache شده بطور اتوماتيك از cache خارج می گردد .
ASP.NET از سه نوع وابستگی حمايت می نمايد :
• وابستگی با ساير آيتم های Cache شده
• وابستگی با فايل ها و يا فولدرها
• وابستگی با يك query بانك اطلاعاتی
برای ايجاد يك cache وابسته ، می بايست يك شی CacheDependency ايجاد و در ادامه از آن در زمان اضافه كردن آيتم مورد نظر به cache استفاده كرد .
كد زير يك آيتم cache شده را ايجاد كه بطور اتوماتيك و پس از ايجاد تغييرات در فايل xml از cache خارج می شود .
ايجاد يك وابستگی برای فايل ProductList.xml |
Dim prodDependency As New CacheDependency(Server.MapPath("ProductList.xml")) |
در زمان درج آيتم مورد نظر در cache از شی CacheDependency ايجاد شده در مرحله قبل استفاده می گردد .
ا
اضافه كردن يك آيتم در cacheكه حضور آن در cacheبه فايل ProductList.xml وابسته می گردد |
Cache.Insert("ProductInfo", prodInfo, prodDependency) |
شی CacheDependency چندين constructor را ارائه می نمايد . در مثال قبل مشاهده گرديد كه چگونه شی فوق قادر به ايجاد يك وابستگی بر اساس يك فايل است كه نام آن به عنوان constructor در نظر گرفته می شود . همچنين می توان يك دايركتوری را معرفی تا تغييرات آن مانيتور گردد .
مثال : ايجاد و درج يك آيتم درون cache كه حضور آن در cache به يك فايل وابسته می گردد
در اين مثال با ايجاد يك شی وابسته ( يك فايل text ) ، يك عبارت ( " آيتم cache شده وابسته " ) وابسته به شی فوق را در cache قرار می دهيم . تا زمانی كه داده موجود در فايل text تغيير نيابد ، آيتم مورد نظر در cache باقی می ماند و می توان از آن استفاده كرد . در صورت تغيير در شی وابسته ( فايل dependency.txt ) اعتبار آيتم cache شده به اتمام رسيده و بطور اتوماتيك از cache خارج می شود .
در اين برنامه از دو button به نام " تغيير فايل " و " بررسی آيتم cache شده " استفاده شده است . با استفاده از دكمه "بررسی آيتم cache شده " ، حضور آيتم مورد نظر در cache بررسی و پيام مناسب در خروجی نمايش داده می شود . در صورت كليك بر روی دكمه "تغيير فايل " ، محتويات شی وابسته ( فايل dependency.txt ) تغيير يافته و آيتم مورد نظر از cache خارج می گردد .
كد برنامه فوق در جدول زير نشان داده شده است .
درج يك آيتم در cache با وابستگی به يك شی ( فايل ) |
<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %> |
توضيحات :
- ايجاد يك شی dependency ( يك فايل متن با نام dependency.txt )
- درج آيتم مورد نظر با نام File و مقدار " آيتم cache شده وابسته " در cache
- نمايش پيام های مناسب در خروجی به كمك كنترل سرويس دهنده label ( با نام lblInfo )
• روتين cmdGetItem_Click ، وجود آيتم مورد نظر را در Cache بررسی و در صورتی كه اين آيتم در cache موجود نباشد يك پيام خاص از طريق كنترل سرويس دهنده label در خروجی نمايش داده می شود . در صورت وجود آيتم مورد نظر در cache ، مقدار آن از cache بازيابی و يك پيام خاص از طريق كنترل سرويس دهنده label در خروجی نمايش داده می شود .
• روتين cmdModify_Click ، مسئوليت ايجاد تغيير در فايل وابسته ( نام dependency.txt ) را برعهده دارد . در روتين فوق پس از ايجاد فايل ، تاريخ جاری سيستم در آن نوشته می گردد .
SQL Server cache dependency ، يكی از نوع های پيچيده caching وابسته است كه در ASP.NET 2.0 ارائه شده است . با استفاده از ويژگی فوق بطور اتوماتيك يك شی داده cache شده ( نظير يك DataSet ) پس از تغيير داده مرتبط در بانك اطلاعاتی ، غير معتبر می گردد . از پتانسيل فوق در در SQL Server 2005 ( شامل Express Edition ) و SQL Server 2000 حمايت می گردد .
سيستم آگاه سازی caching در SQL Server 2000 و SQL Server 7
ASP. NET از مدل pooling برای SQL Server 2000 و SQL Server 7 استفاده می نمايد . نسخه های قديمی تر SQL Server و ساير بانك های اطلاعاتی از ويژگی فوق حمايت نمی نمايند .
در اين روش ، ASP.NET يك ارتباط باز با بانك اطلاعاتی را نگاه داشته و به صورت دوره ای بروز هر گونه تغيير در يك جدول را بررسی می نمايد . نگهداری يك اتصال باز به منزله بروز يك فاجعه در سطح بانك اطلاعاتی نمی باشد و صرفا" كار اضافه تری در سطح بانك اطلاعاتی ايجاد می گردد كه انجام آن فرآيند مختص به خود را دارد.
به منظور بهره گيری بيشتر و موثر از مدل pooling ، می بايست فرآيند pooling سريع تر و سبك تر از query اوليه ای باشد كه مسئوليت استخراج داده از بانك اطلاعاتی را برعهده دارد .
هدف سيستم آگاه سازی caching ، تشخيص به موقع انجام تغييرات در جداول يك بانك اطلاعاتی و غيرمعتبر كردن داده cache شده مرتبط با هر يك از جداول است .
برای فعال كردن سيستم آگاه سازی در SQL Server 2000 می بايست مراحل زير را دنبال نمود :
• مرحله اول : مشخص كردن جداولی از بانك اطلاعاتی كه نيازمند حمايت از سيستم آگاه سازی caching می باشند .
• مرحله دوم : فعال كردن سيستم آگاه سازی caching بر روی بانك اطلاعاتی مورد نظر به كمك برنامه خط دستوری aspnet_regsql.exe
• مرحله سوم : ريجستر كردن جداولی كه نيازمند حمايت از سيستم آگاه سازی caching می باشد . بدين منظور مجددا" از برنامه خط دستوری aspnet_regsql.exe و اين مرتبه در سطح جدول استفاده می گردد .
• مرحله چهارم : فعال كردن polling از طريق فايل web.config
پس از انجام مراحل چهارگانه فوق می توان اشياء SqlCacheDependency را ايجاد نمود .
در ادامه هر يك از مراحل فوق را با جزئيات بيشتری بررسی می نمائيم . مرحله اول : مشخص كردن جداولی از بانك اطلاعاتی كه نيازمند حمايت از سيستم آگاه سازی caching می باشند .
بدين منظور لازم است كه در اولين اقدام بانك اطلاعاتی و جداولی كه لازم است بر روی آنها سيستم آگاه سازی caching فعال شود ، شناسائی و انتخاب گردند . انتخاب بانك طلاعاتی و جداول مربوطه به رفتار يك برنامه و انتظارات از آن بستگی دارد كه می بايست توسط طراحان و پياده كنندگان برنامه های وب به دقت انجام شود .
مرحله دوم : فعال كردن سيستم آگاه سازی caching بر روی بانك اطلاعاتی مورد نظر به كمك برنامه خط دستوری aspnet_regsql.exe
قبل از اين كه بتوان از سيستم غيرمعتبر سازی Cache در SQL Server استفاده نمود ، می بايست سيستم آگاه سازی caching را برای بانك اطلاعاتی مورد نظر فعال كرد . به منظور انجام اين كار از برنامه خط دستوری aspnet_regsql.exe كه در مسير [ c:\[WinDir]\Microsoft.NET\Framework\[Version موجود است ، استفاده می گردد . برنامه فوق يك ابزار مديريتی برای فعال كردن و غيرفعال كردن ويژگی های ASP.NET بر روی يك سرويس دهنده SQL است . اين برنامه دارای سوئيچ های متعددی است . ed ، يكی از سوئيچ های اين دستور است كه از آن برای فعال كردن SQL cache dependency بر روی يك بانك اطلاعاتی استفاده می گردد . همچنين ، از سوئيچ E به منظور مشخص كردن روش تائيد بر اساس يك اتصال ايمن و از سوئيچ d برای مشخص كردن بانك اطلاعاتی كه قرار است سيستم آگاه سازی caching بر روی آن فعال گردد ، استفاده می شود .
دستور زير نحوه استفاده از برنامه aspnet_regsql.exe به منظور فعال كردن سيستم آگاه سازی caching بر روی بانك اطلاعاتی AspNet استاندارد موجود بر روی سرويس دهنده جاری را نشان می دهد .
aspnet_regsql -ed -E -d AspNet |
سرويس polling در ASP.NET با جدول فوق تعامل برقرار و از آن به منظور ارائه خدمات خود استفاده می نمايد . سيستم فوق و نحوه پياده سازی آن مزايای متعددی را به دنبال دارد :
• با توجه به اين كه جدول آگاه سازی تغييرات بمراتب كوچكتر از جدول حاوی داده cache شده است ، سرعت اجرای query بر روی آن سريعتر خواهد بود .
• با توجه به عدم استفاده از جدول آگاه سازی برای فعاليت های ديگر ، در زمان خواندن ركوردهای آن با مسائلی همچون قفل كردن ركوردها و همزمانی مواجه نخواهيم شد .
• باتوجه به اين كه چندين جدول در يك بانك اطلاعاتی مشابه از يك جدول آگاه سازی مشابه استفاده می نمايند ، می توان چندين جدول را بدون افزايش هزينه های بالاسری pooling در يك لحظه مانيتور كرد.
مرحله سوم : ريجستر كردن جداولی كه نيازمند حمايت از سيستم آگاه سازی caching می باشد.
پس از ايجاد جدول SqlCacheTablesForChangeNotification ، می بايست برای هر جدول موجود در بانك اطلاعاتی سيستم آگاه سازی caching فعال گردد . بدين منظور می توان از SqlCacheRegisterTableStoredProcedure و يا برنامه كاربردی aspnet_regsql به همراه پارامتر های et - ( فعال كردن سيستم آگاه سازی بر روی يك جدول ) و t - ( نام جدول ) استفاده نمود .
دستور زير نحوه فعال كردن سيستم آگاه سازی را برای جدول Employees بانك اطلاعاتی Northwind نشان می دهد .
aspnet_regsql -et -E -d Northwind -t Employees |
مرحله چهارم : فعال كردن polling از طريق فايل web.config
در اين مرحله به ASP.NET اعلام می گردد كه از polling بانك اطلاعاتی استفاده نمايد .
برای فعال كردن سرويس polling از عنصر <sqlCacheDepency> در فايل web.config استفاده می گردد . بدين منظور لازم است كه خصلت enabled مقدار true را داشته باشد تا ويژگی فوق فعال گردد . همچنين توسط خصلت pollTime مدت زمان مورد نظر ( بر حسب ميلی ثانيه ) بين هر poll مشخص می گردد . هر اندازه مقدار خصلت فوق بيشتر باشد ، تغييرات با تاخير بيشتری تشخيص داده می شوند. در بخش <sqlCacheDepency> فايل web.config و به كمك <databases> بانك و يا بانك های اطلاعاتی مشمول سيستم آگاه سازی caching معرفی می گردند .
كد زير نحوه فعال كردن polling از طريق فايل web.config برای بانك اطلاعاتی Northwind را نشان می دهد .
فعال كردن pollingاز طريق فايل web.config |
<configuration> |
نحوه كار سيستم آگاه سازی caching
فرض كنيد قصد داريم نتيجه query زير را cache نمائيم .
SELECT * FROM Employees |
ايجاد يك triggerبر روی جدول Employees |
CREATE TRIGGER dbo.[Employees_AspNet_SqlCacheNotification_Trigger] |
AspNet_SqlCacheUpdateChangeIdStoredProcedure |
CREATE PROCEDURE dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure |
روش فوق يكی از محدوديت های غيرمعتبرسازی caching در SQL Server 2000 و SQL Sever 7 را نشان می دهد : هر نوع تغيير بر روی جدول باعث غيرمعتبر شدن هرگونه query بر روی جدول می گردد . به عنوان نمونه فرض كنيد كه از query زير استفاده كرده باشيم :
SELECT * FROM Employees WHERE City='City1' |
تشخيص و پيگيری اين كه كدام تغيير می تواند زمينه غيرمعتبر سازی يك داده cache شده را فراهم نمايد مستلزم انجام عمليات سنگينی توسط SQL Server 2000 است ( اين كار در SQL Server 2005 امكان پذير است ) .
ايجاد cache dependency
• data caching از طريق برنامه : برای data caching از طريق كد لازم است كه يك شی جديد SqlCacheDependency ايجاد و آن را با استفاده از متد Cache.Insert به cache اضافه نمود ( مشابه file dependency ) .
در constructor شی SqlCacheDependency می بايست دو رشته را مشخص كرد . اولين رشته نام بانك اطلاعاتی ( توسط عنصر <add> در بخش <sqlCacheDependency> فايل web.config مشخص شده است ) و دومين رشته ، نام جدولی است كه قصد مانيتورينگ تغييرات آن را داريم.
در اولين مرحله يك وابستگی برای جدول Employees بانك اطلاعاتی Northwind ايجاد و در مرحله بعد آيتم مورد نظر را به cache اضافه می نمائيم . حضور آيتم فوق مشروط به عدم بروز تغييرات در جدول Employees است . در صورت بروز تغييرات در جدول فوق ، اعتبار داده cache شده به اتمام رسيده و از cache خارج می گردد .
كد زير نحوه انجام اين كار را نشان می دهد .
Dim empDependency As New SqlCacheDependency("Northwind", "Employees") |
كد زير نحوه انجام عمليات فوق را نشان می دهد .
<%@ OutputCache Duration="600" SqlDependency="Northwind:Employees" VaryByParam="none" %> |
<asp:SqlDataSource EnableCaching="True" SqlCacheDependency="Northwind:Employees" ... /> |
بررسی يك مثال كاربردی
بدين منظور عمليات مورد نياز جهت پياده سازی را در دو فاز مختلف دنبال می نمائيم . فاز اول : ايجاد زيرساخت لازم برای استفاده از سيستم آگاه سازی caching
در اين مثال برای فعال كردن سيستم آگاه سازی caching بر روی بانك اطلاعاتی Northwind و ريجستر كردن جدول Employees به منظور حمايت از سيستم آگاه سازی caching توسط برنامه خط دستوری aspnet_regsql.exe از سوئيچ C - استفاده شده است تا در مقابل مشخص كردن نام كاربر ، رمز عبور و نام سرويس دهنده از يك Connection string استفاده گردد . مرحله اول : فعال كردن سيستم آگاه سازی caching بر روی بانك اطلاعاتی Northwind به كمك برنامه خط دستوری aspnet_regsql.exe
C:\WINDOWS\Microsoft. NET\Framework\V2.0.50727>aspnet_regsql -ed |
C:\WINDOWS\Microsoft. NET\Framework\V2.0.50727>aspnet_regsql -et |
فعال كردن polling از طريق فايل web.config
فعال كردن pollingاز طريق فايل web.config |
<configuration> |
در اين برنامه از دو button به نام " تغيير جدول " و " بررسی آيتم cache شده " استفاده شده است . با استفاده از دكمه "بررسی آيتم cache شده " ، حضور آيتم مورد نظر در cache بررسی و پيام مناسب در خروجی نمايش داده می شود . در صورت كليك بر روی دكمه "تغيير جدول " ، يكی از ركورهای موجود در جدول Employees بانك اطلاعاتی Northwind تغيير يافته و بهانه خارج شدن داده cache شده از حافظه ايجاد می گردد .
كد برنامه فوق در جدول زير نشان داده شده است .
ايجاد cachedependencyدر بانك اطلاعاتی NORTHWND |
<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" %> |
توضيحات :
- ايجاد يك شی وابسته برای جدول Employees بانك اطلاعاتی Northwind
- درج dataset حاوی ركوردهای بازيابی شده از جدول Employees در cache
- نمايش پيام های مناسب در خروجی به كمك كنترل سرويس دهنده label ( با نام lblInfo )
• روتين cmdGetItem_Click ، وجود آيتم مورد نظر را در Cache بررسی و در صورتی كه اين آيتم در cache موجود نباشد يك پيام خاص از طريق كنترل سرويس دهنده label در خروجی نمايش داده می شود . در صورت وجود آيتم مورد نظر در cache ، مقدار آن از cache بازيابی و يك پيام خاص از طريق كنترل سرويس دهنده label در خروجی نمايش داده می شود .
• روتين cmdModify_Click ، مسئوليت ايجاد تغيير در جدول Employees بانك اطلاعاتی Northwind را برعهده دارد .
سيستم آگاه سازی 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 |
مقداردهی اوليه سرويس caching
• فعال كردن SQL Server Service Broker . در صورتی كه Service Broker برای بانك اطلاعاتی مورد نظر فعال نشده باشد در زمان اجرای يك برنامه وب كه قصد استفاده از سيستم آگاه سازی caching در SQL Server 2005 را دارد ، با پيام خطاء زير مواجه خواهيم شد :
Server Error in '/WebSite4' Application. |
ALTER DATABASE [Northwnd] SET ENABLE_BROKER ; |
Msg 9776, Level 16, State 1, Line 2 |
با توجه به موارد فوق نمی توان broker موجود را بر روی بانك اطلاعاتی Northwind فعال نمود و می بايست يك نمونه جديد را با استفاده از دستور زير ايجاد نمود :
ALTER DATABASE [Northwnd] SET NEW_BROKER ; |
select is_broker_enabled from sys.databases where name = 'Northwnd' |
Dim connectionString As String = _ |
ايجاد cache dependency
در صورت فعال كردن caching از طريق كد ، می بايست با استفاده از constructor كه يك شی SqlCommand را به عنوان پارامتر دريافت می نمايد اقدام به ايجاد SqlCacheDependency كرد .
كد زير نحوه انجام اين كار را نشان می دهد .
Dim con As New SqlConnection(connectionString) |
<%@ 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 به اتمام می رسد .
ايجاد cachedependencyدر SQL Server 2005 |
<%@ Page Language="VB" Culture="fa-IR" UICulture="fa-IR" Debug="true"%> |
مشكلات احتمالی در خصوص سيستم آگاه سازی caching
رويه ای كه پيام های آگاه سازی را ارسال می نمايد يك رويه دات نت است و به حمايت آن نياز دارد . برای فعال كردن CLR ، می توان از پنجره خط دستور ويژوال استوديو دات نت 2005 استفاده كرد و دستور SqlCmd.exe را تايپ كرد .
كد زير نحوه فعال كردن دستور فوق را برای SQL Server 2005 Express Edition نشان می دهد :
SqlCmd -S localhost\SQLEXPRESS |
همچنين ممكن است با توجه به محل نصب بانك اطلاعاتی لازم باشد كه نام سرويس دهنده تغيير يابد . در دستور قبلی ، فرض بر اين است كه بانك اطلاعاتی بر روی كامپيوتر جاری نصب شده است .
برنامه كاربردی SqlCmd.exe يك پرامپت دستوری را ارائه می نمايد كه می توان از آن به منظور درج دستورات SQL استفاده كرد . برای فعال كردن CLR از دستورات زير استفاده می گردد .
EXEC sp_configure 'show advanced options', '1' |
در صورتی كه اعتبار آيتم cache شده بلافاصله به اتمام برسد ، اين احتمال وجود دارد كه از قوانين اشاره شده در ارتباط با نوشتن query تبعيت نشده باشد .
سخن آخر
پياده كنندگان برنامه های وب با نوشتن چندين خط كد اضافه می توانند قابليت رشد و كارآئی برنامه های خود را بطرز چشمگيری افزايش دهند .
استفاده از ابزارهای تست و پروفايلينگ حداقل شرايط لازم به منظور بررسی قابليت های يك برنامه وب كارآ را فراهم می نمايد تا بتوان قبل از عملياتی شدن مشكلات و گره های حساس تاثيرگذار بر روی كارآئی برنامه را شناسائی و در جهت رفع آنها تلاش كرد .