Bu site emekli olmuştur. Arşiv amaçlı olarak BT AKADEMİ sponsorluğunda yayın hayatına devam etmektedir.




C#nedir?com
 
YAZAR HAKKINDA
Oğuz Yağmur
Oğuz Yağmur
http://www.oguzyagmur.com
İletişme geçmek için tıklayın.
26 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: belirli bellege bellegin bellek bellekten degisiklik dependency kontrol ogrenciler oldugunda server tablosunda verileri verilerin veritabaninda ASP.NET Oğuz Yağmur
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : İleri
Kategori : ASP.NET
Yayınlanma Tarihi : 2.5.2007
Okunma Sayısı : 41032
Yorum Sayısı : 7     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
Silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
emre TAŞ
silindi
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Burak Selim Şenyurt
Kurumsal Yazılımcının Oyun Geliştirme ile İmtihanı 28.3.2024
Burak Selim Şenyurt
Matematik ve Oyun Programlama - Missile Command - Final 28.3.2024
Turhal Temizer
Conda install environment.yml Package 28.3.2024
Turhal Temizer
Mac OS/X Removing CUDA 28.3.2024
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Sql Cache Dependency Mekanizması
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon
Web uygulamalarımızda performansı artırmak için yeri geldiğinde ara belleğe alma (Cache) tekniğini kullanıyoruz. Üç tür ara belleğe alma tekniğinden söz edebiliriz ;Output Caching, Data Caching ve Fragment Caching . Bu teknikler ile ilgili ayrıntılı bilgiler için Caching Mekanizmasını Anlamak (http://www.csharpnedir.com/makalegoster.asp?MId=440, http://www.csharpnedir.com/makalegoster.asp?MId=447) makale dizisini okumanızı tavsiye ederim. Bu tekniklerde önemli olan web sayfalarının yada verilerin süre bazında ara belleğe alınması ve kurulan ara belleğe alma mekanizmasının da süre bazında tasarlanmasıdır.

Fakat ASP.NET, süre bazında ara belleğe almanın yanında belirli nesnelere bağlı olarak da ara belleği yönetmemize olanak tanımaktadır. Bağımlılık (CacheDependency) olarak isimledirebileceğimiz bu teknik ile ara bellek yönetimini , belirli bir fiziksel dosyanın (*.xml, *.txt) , ya da dosyaların içeriğine bağımlı hale getirip (.NET Framework bunu CacheDependency sınıfından bir nesne ile yapabilmemize olanak sağlar) bu dosyalarda bir değişiklik olduğunda ara belleğin yenilenmesini sağlayarak daha da güçlü hale getirebilmekteyiz. Birçok uygulamada verilerimizi dosyalardan ziyade SQL Server kullanarak saklamayı tercih ederiz. Örneğin uygulamamızın bir bölümünde kullanıcılar rapor alıyor olsun. Her kullanıcı rapor almak istediğinde veritabanından verileri alıp kullanıcıya sunarız. Tabi verilerin veritabanından alınması için gerekli sorgular, bu sorguların çalıştırılması, kayıt kümesinin (resultset) alınması belirli bir zaman kaybı ve performans harcanması demektir. Bizde verileri belirli bir süre arabelleğe alarak bu zaman ve performans kaybını önelemeye çalışırız. Peki bu veriler hangi aralıklarla değişiyor? İşte can alıcı nokta bu sorunun cevabıdır. Ara belleğe aldığımız verilerde bir değişiklik olduğunda, belirlenmiş süre için ara belleğe aldığımız veri güncellenmeyeceğinden kullanıcıya sunduğumuz rapor doğru sonuçları içermeyecektir. Peki bu durumda nasıl bir çözüm üretebiliriz?.İlk akla gelen ara belleğe aldığımız verileri belirli zaman aralıklarında veritabanındaki güncel verileriler ile karşılaştırıp değişiklik olup olmadığına bakarak sorunu giderebilir miyiz? Ya da kullanıcıların raporda görmek istedikleri doğrultusunda veritabanında çalıştırılan sorgulara bakıp değişik varsa ara belleği güncelleyebiliriz .

Bu makalemizde bahsedilen yöntemleri ASP.NET ile nasıl gerçekleştirebileceğimizi incelecek, ara bellek yönetimini MS SQL Server’daki belirlediğimiz bir veritabanına bağımlı hale getirip veritabanında herhangi bir değişiklik (insert,update, delete kısaca CRUD) olduğunda ara belleğin kendiliğinden yenilenmesini sağlayacağız. Bu yönteme SQL Cache Dependency denilmektedir. Bu yöntemde (SQL Cache Dependency) belirli aralıklarla veritabanını kontrol ederek bir değişiklik olmuş ise ara belleğin kendiliğinden güncellenmesini sağlayacağız. Tabiki bunun için web uygulamamızda ve veritabanında – bu örneğimizde MS SQL 2005 kullanılmıştır, SQL Server 2000’de de bu işlemleri gerçekleştirebilirsiniz. – bir takım ayarlamalar yapmamız gerekecektir. Öncelikle bu mekanizmanın MS SQL Server tarafından desteklenmesi için ne gibi ayarlamalar yapacağımıza bakalım.

Bu ayarlamalar için kullanacağımız aracın adı aspnet_regsql.exe.Başlat \Programlar\Microsoft Visual Studio 2005\Visual Studio Tools\ Visual Studio 2005 Command Prompt komut satırı uygulamasını çalıştırıp, aspnet_regsql -? Komutunu çalıştırdığımızda bu araç ile ilgili ayrıntılı bilgilere erişebiliriz. MS SQL Server 2005 de hangi veritabanımızın bu mekanizmanın desteklemesini belirledikten sonra aşağıdaki komutu çalıştırmanız yeterli olacaktır. Biz örneğimizde aşağıdaki resimde görüldüğü gibi çok basit bir tablo üzerinde test işlemleri yapacağız.

aspnet_regsql.exe –S “.\yukon” –U “sa” –P “1” –d “CacheDepDemo” –ed



aspnet_regsql.exe -S server -U user -P password -d database –ed formatında olan komut, -S parametresi hangi veritabanı sunucusu olduğunu, -U kullanıcı adı, -P şifre, –d hangi veritabanının bu mekanizmayı desteklemesini, -ed parametresi de bu veritabanının SQL Cache Dependency için uygun hale getirileceğini belirtiyoruz. İlerde veritabanının SQL Cache Dependency için etkisiz hale getirmek istiyorsak –ed (enable database) yerine –dd (disable database) parametresini kullanabiliriz. Eğer işletim sistemindeki yetkiniz ile bağlanmak istiyorsanız (Windows Authentication) aspnet_regsql.exe -E server -d database –ed şeklinde komutu çalıştırmanız yeterli olacaktır. Komut başarılı bir şekilde çalıştığında aşağıdaki gibi bir çıktı alırız.



Bu komut sonrasında veritabanımızda birtakım değişikleri gözlemleyebiliriz.



Öncelikle veritabanımıza AspNet_SqlCacheTablesForChangeNotification isimli yeni bir tablonun eklendiğini görürüz. Tablo içinde henüz hiçbir kayıt yoktur. Bu tablo veritabanında hangi tablolarda, kaç defa değişiklik olduğu bilgisini tutar. Peki bu tabloya bu bilgiler nasıl kaydediliyor ? AspNet_SqlCacheXXX ile başlayan beş adet saklı yordamın (SP) da komut çalıştırıldıktan sonra veritabanına eklendiğini görüyoruz. Veritabanındaki değişiklik olduğunda SqlCacheTablesForChangeNotification tablosunu güncelleyen komutun çalıştırılmasından sonra oluşturulan aşağıdaki AspNet_SqlCacheUpdateChangeIdStoredProcedure saklı yordamıdır.

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[AspNet_SqlCacheUpdateChangeIdStoredProcedure]
@tableName NVARCHAR(450)
AS
BEGIN
UPDATE dbo.AspNet_SqlCacheTablesForChangeNotification WITH (ROWLOCK) SET changeId = changeId + 1 WHERE tableName = @tableName
END

Şimdi ise tablo üzerinde değişiklik olduğunda ara belleğin güncellenmesini istiyorsak o tabloyu belirtmemiz gerekiyor. Bunun için aşağıdaki komutu çalıştırmanız yeterli olacaktır.

aspnet_regsql.exe –S “.\yukon” –U “sa” –P “1” –d “CacheDepDemo” –t “Ogrenciler” -et



Bu komuttan sonra AspNet_SqlCacheTablesForChangeNotification tablosuna Ogrenciler tablosu ile ilgili bilgiler eklenecek ve Ogrenciler tablosu için Ogrenciler_AspNet_SqlCacheNotification_Trigger isimli bir Trigger eklenecektir.Bu Trigger’in görevi de bu tabloda Insert,Update yada Delete işlemlerinden herhangi birisi olursa AspNet_SqlCacheUpdateChangeIdStoredProcedure saklı yordamının çalıştırılmasını sağlamaktır. Artık Ogrenciler tablosundaki her değişiklikte, AspNet_SqlCacheTablesForChangeNotification (aşağıdaki resim) tablosunda changeId alanı güncellenecektir.



Sonuç olarak veritabanının Sql Cache Dependency mekanizmasını desteklemesi için yapmamız gereken yukardaki iki komutu çalıştırmaktan ibarettir. Şimdi sıra web uygulaması tarafındaki ayarlamları yapmakta. İlk işimiz Web.config dosyasında SqlCacheDependency mekanizmasının aktif hale getirilmesi sağlamak (sqlCacheDependency enabled="true") ve hangi aralıkla veritabanında değişiklik olup oladığına bakılması için gerekli zaman dilimini (pollTime=”5000”) milisaniye cinsinden belirlemektir. Ardından bu kontrol sırasında hangi tabloların kontrol edilmesi gerektiğini belirteceğiz.Öncelikle veritabanı sunucusu için bağlantı bilgilerimizi Web.config dosyamıza ekleyelim.

<connectionStrings>
    <add name="CacheDepDemoCon" connectionString="data source=.\yukon; database=CacheDepDemo user id=sa;pwd=1"/>
</connectionStrings>
Ardından aşağıdaki kodları Web.config dosyasında <system.web> in altına yazmanız yeterlidir.

<caching>
      <sqlCacheDependency enabled="true" pollTime="5000" >
        <databases>
          <add name="CacheDepDemo" connectionStringName=" CacheDepDemoCon "/>
        </databases>
      </sqlCacheDependency>
</caching>

İlk testimizi web formumuzun tamamını ara belleğe alarak(Output Cache) gerçekleştirelim. Bunun için Default.aspx sayfamıza aşağıdaki OutputCache direktifini ekleyelim.

<%@ OutputCache Duration="999999" SqlDependency="CacheDepDemo:Ogrenciler" VaryByParam="none" %>

Bu direktif ile Duration niteliği sayfanın ara bellekte tutulma süresinin 999999 saniye (istediğiniz gibi değiştirebilrsiniz.), SqlDependency niteliği ile de CacheDepDemo veritanındaki Ogrenciler tablosunda bir değişiklik olduğunda ara belleğin güncellenmesi gerektiğini belirtmiş oluyoruz. Sayfanın ara bellekten gelip gelmediğini anlamak için Page_Load metodunda o andaki saati yazdıracağız. Sayfa her yüklendiğinde aynı saati göstermesini bekliyoruz. Çünkü tarayıcımıza gelen HTML çıktısı ara bellekten geldiği için (999999 saniye boyunca) hep aynı sonucu göreceğiz. Ama Ogrenciler tablosunda bir güncelleme yaptığımızda sayfada güncel saatin yazdığını görmemiz gerekiyor.Çünkü tabloda yaptığımız değişiklik sonucunda AspNet_SqlCacheTablesForChangeNotification tablosunda güncelleme yapılacak pollTime’da belirlediğimiz 5000 milisaniye sonunda bu tablo kontrol edilecek eğer bir değişiklik varsa ara bellek otomatik olarak yenilenecektir. Tabiki bu süre uygulamadan uygulamaya değişebilir. Verilerin güncellenme sıklığı, sunucunuzun donanım durumu, ziyaretçi sayısı sürenin uzamasına veya kısalmasına etki edecektir.

Sayfamız ilk çalıştığında 21:01:41 saatini görürüz. Web sayfasını tekrar tekrar yeniden yüklediğinizde (F5) aynı saat değerini göreceğiz. Çünkü sayfanın tamamı ara belleğe alınmıştır. Daha sonra Ali değerini Ali1 yaparak tabloda değişiklik yaptık. Bu sayede ara bellek tekrar güncellendiğinden sayfa yeniden yüklendiğinde 21:02:05 saatini görürüz. AspNet_SqlCacheTablesForChangeNotification tablosundaki Ogrenciler tablosuna ait satırda changeId alanının her değişiklik sonucunda değerinin bir arttığını görebiliriz.







Şimdiki testimizde ise sayfanın tamamını değil de sadece verilerimizi ara belleğe alalım ve Ogrenciler tablosunda bir değişiklik olduğunda ara belleğin güncellendiğini izleyelim. İlk olarak unutmadan bir önceki testimizde Default.aspx sayfasına eklediğimiz OutputCache direktifini kaldıralım kodlarımız arasından.Böylece sayfamızın tümünün ara belleğe alınmasını engellemiş oluruz. Testimiz için sayfamıza GridView ve SqlDataSource kontrollerinden birer tane ekleyelim. Amacımız verileri ara belleğe almak olduğundan SqlDataSource kontrolünü aşağıdaki gibi düzenlememiz gerekiyor. EnableCaching niteliğini true yaparak kontrolün arabellek özelliğini aktif ediyoruz. SqlCacheDependency niteliğine “veritabanı:tablo” formatında hangi veritabanında hangi tablonun ara belleğe alınacağını belirleyerek Sql Cache Dependency mekanizmasını aktif hale getirmiş oluyoruz.

<asp:GridView ID="GridView1" runat="server" ...DataSourceID="SqlDataSource1">
.....
</asp:GridView>

<asp:SqlDataSource ID="SqlDataSource1" runat="server" SelectCommand="SELECT * FROM [Ogrenciler]"
        EnableCaching="True" SqlCacheDependency="CacheDepDemo:Ogrenciler"
        ConnectionString="<%$ ConnectionStrings:CacheDepDemoCon %>">
</asp:SqlDataSource>

Uygulamamızı çalıştırdığımızda ekranda Ogrenciler tablosunun içeriğini ve güncel saati yazdığını, sayfayı her yenilediğinizde (F5) saatin değiştiğini göreceksiniz. Bu da bize sayfanın ara bellekten gelmediğini garanti etmiş oluyor. Fakat verilerin ara bellekten mi yoksa veritabanından mı geldiğini nasıl anlayabiliriz?. Ogrenciler tablosunda yaptığımız değişiklik sonucunda sayfayi yenilediğimizde eğer verilerde değişiklik yoksa veriler arabellekten geliyor demektir (Bu sırada saat değerinin güncel saati gösterdiğine dikkat etmek gerekir). Tabi ki pollTime ile belirlediğimiz süre içerisinde veritabanında değişiklik olup olmadığına bakılacak eğer değişiklik varsa verilerin gücel hali sayfamızda belirecektir. Bu sayede tüm etkenlerden bağımsız olarak sadece verilerimizi ara belleğe alarak baştan beri peşinde olduğumuz “veritabanına herhangi bir kayıt eklendiğinde ara bellek kendini güncellesin” düşüncemizi gerçeklemiş oluyoruz.

Şimdiye kadarki örneklerimizde direktiflerle sorunumuzu çözmüş olduk. Peki ben kodlama yöntemi ile de bu yaptıklarımızı yapabilir miyim? Herzaman direktifler ile değil de kod içerisinden duruma bağlı olarak ben ara belleğin güncellenmesini veritabanına bağmlı kılmak isteyebilirim. .Net Framework’te bu iş için tasarlanan CacheDependency sınıfından türemiş SqlCacheDependency sınıfını kullanacağız. Örneğimizde sayfada öğrencilerin listesini kullanıcıya göstereceğiz. Fakat GridView kontrolüne bu defa verileri SqldataSource ile değil kod ile kendimiz bağlayacağız. Yine veritabanımızda bir değişiklik olduğunda ara belleğin kendiliğinden yenilenmesini gerçekleştireceğiz. Burdaki önemli nokta eğer veritabanında herhangi bir değişiklik olmamış ise veriler direk ara bellekten alınıp GridView kontrolüne bağlayacağız. Testimiz için yine yukarıda anlatıldığı gibi web.config dosyasına <caching> ...</caching> ve <connectionStrings>... </connectionStrings> bölümlerini ekledikten sonra aşağıdaki kodumuzu Default.aspx.cs kod dosyamıza yazalım. .

protected void Page_Load(object sender, EventArgs e)
{
        Response.Write(DateTime.Now.ToLongTimeString());
        GetDataFromCache();
}

// Eğer veriler ara bellekte yoksa veritabanından alır, yoksa ara bellekten alır.
void GetDataFromCache()
{
        //ara belleğimizde daha önceden veri var mı yok mu diye kontrol yapıyoruz
        if (Cache["ogr"] == null)
        {
            string conStr = ConfigurationManager.ConnectionStrings["CacheDepDemoCon"].ConnectionString;

            // Sql Cache Dependency mekanizmasını gerçekleştirecek nesnemizi oluşturduk.
            // Yapıcı metodu SqlCommand nesnesi alabileceği gibi, birinci parametre olarak veritabanı adını ikinci parametre olarak da tablo adını alır.
            SqlCacheDependency dep = new SqlCacheDependency("CacheDepDemo", "Ogrenciler");
           
            SqlConnection con = new SqlConnection(conStr);

            SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Ogrenciler", con);

            DataTable dt = new DataTable();
            da.Fill(dt);

            //ara bellek boş olduğundan verileri ara belleğe alıyoruz.
            Cache.Insert("ogr", dt, dep);

        }
        GridView1.DataSource = Cache["ogr"] as DataTable;
        GridView1.DataBind();
}

Böylelikle iş mantığımız gereği olabilceği gibi sayfa direktifleri yerine kod ile Sql Cache Dependency mekanizmasını sağlamak istediğimizde, SqlCacheDependency sınıfı yardımıyla ara bellek yönetimine çözüm getirmiş olduk.

Ara bellek mekanizması ile süreye bağımlı kalmadan, veritabanındaki değişikliklere bağlı olarak ara belleği direktiflerle ya da kodla nasıl yönetebileceğimizi incelemiş olduk. Ara bellek yönetimi orta ve büyük ölçekli çözümlerde sıklıkla kullanılan, web uygulamalarına hem hız hem de performans kazandıran önemli bir özellik olduğunu dikkate almalıyız. Elimizden geldiği kadar dikkatli bir şekilde ihtiyaçlar doğrultusunda kullanamaya çalışmanın uygulamalarımıza profesyonellik kazandıracağı bir gerçektir.

Oğuz YAĞMUR
[email protected]

Makale:
Sql Cache Dependency Mekanizması ASP.NET Oğuz Yağmur
  • Yazılan Yorumlar
  • Yorum Yaz
AĞU
4
2018
Ben şirket içinde eriştiğim remote db ip si yazdığımda "aspnet_regsql.exe –S “” –U “” –P “” –d “” –t “” -et" komutunu çalışrdığımda -s is invalid uyarısı alıyorum. sql de management kullanarak 14.36.3.117 örnek ip li db ye kendi kullanıcı adı ve şifremle giriyorum. aspnet_regsql.exe -S -U -P -d –ed komutu çalıştı ve db de sp'leri oluşturdu. orada yazdıgım şekliyle 14.36.3.117 yazdıgımda -s is invalid uyarısı alıyorum. Managmenet stduio için ip yi nasıl yazabilirim
ŞUB
1
2010
Tertemiz bir makale olmuş.Ellerine sağlık.
NİS
12
2009
Windows Authentication tipi bağlantı için aspnet_regsql.exeyi çalıştırma komutu aspnet_regsql.exe -S server -E -d database –-ed formatında olmalı.
EKİ
29
2006
Teşekkür ederim. Birsonraki görsel videom da bahsettiğin konu üzerine düşünüyordum. Fırsat bulduğumda ilk işim videoyu çekmek olacak.
EKİ
29
2006
Öncelikle makale için teşekkür ederim gerçekten anlaşılır ve en önemlisi kendi yorum ve emeğini katmissin oguz hoca . SqlCacheDependency + Ajax = Google mail :)
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor