none
CacheDependency Hk. RRS feed

  • Soru

  • Merhaba,

    Projeler sayfam için Cache yapmak istiyorum. ama cache olayını şöyle istiyorum. Ben Cache Date.Now.AddYear(3) yıl vericem. ama bu süreç içersinde verilerimde herhangi bir güncelleme olduysa cache olayını tekrar yapmasını istiyorum. Araştırdım şöyle birşeyler buldum ve kendime uyarladım bu işlemi.

    if (Page.cache["Test"] == null)

    {

    DataTable dt = System.GetDataTable("Select distinct ProjeAdi,RndSayi,Sira,ProjeDetay,Gosterim from Projeler Where Dil='2' Order BY sira Desc");

    CacheDependecy Kesh = new CacheDependecy (Server.MapPath("~/Cache.txt"));

    Page.Cache.Insert("Test", dt, Kesh, DateTime.Now.AddYears(15), Cache.NoSlidingExpiration);

    }

    else

    {

    dt = Page.Cache["Test"] ad DataTable;

    }


            ana.DataSource = dt;
            ana.DataBind();

    Gibi bir işlem yaptım. Ben Cache.txt içine girip bir değişiklik yaparsam Cache bozuluyor yeni Cache yapıyor. Bu işlemi dinamik olarak nasıl yapabilirim. 

    Ben bir tane 

     Random rd = new Random();
            Sayi = rd.Next(0, 900000000);

    oluşturdum her ürün güncellemede yada yeni proje eklemelerinde oluşan Random sayıyı .txt dosyasına girip değişiklik olduğunu belirtmek istiyorum. Ama güncelleme ve ekleme işlemlerinde .txt içersine bu random sayıyı nasıl gireceğimi bilmiyorum. Yada başka bir yöntem varsa öylede yapabilirim.

    27 Şubat 2013 Çarşamba 15:16

Yanıtlar

  • AspNet_SqlCacheTablesForChangeNotification Tablosu
    CREATE TABLE [dbo].[AspNet_SqlCacheTablesForChangeNotification](
    	[tableName] [nvarchar](450) NOT NULL,
    	[notificationCreated] [datetime] NOT NULL,
    	[changeId] [int] NOT NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[tableName] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[AspNet_SqlCacheTablesForChangeNotification] ADD  DEFAULT (getdate()) FOR [notificationCreated]
    GO
    
    ALTER TABLE [dbo].[AspNet_SqlCacheTablesForChangeNotification] ADD  DEFAULT ((0)) FOR [changeId]
    GO

    PROCEDURE ler

    AspNet_SqlCachePollingStoredProcedure
    CREATE PROCEDURE [dbo].[AspNet_SqlCachePollingStoredProcedure] AS
             SELECT tableName, changeId FROM dbo.AspNet_SqlCacheTablesForChangeNotification
             RETURN 0
    AspNet_SqlCacheQueryRegisteredTablesStoredProcedure

    CREATE PROCEDURE [dbo].[AspNet_SqlCacheQueryRegisteredTablesStoredProcedure] 
             AS
             SELECT tableName FROM dbo.AspNet_SqlCacheTablesForChangeNotification 

    AspNet_SqlCacheRegisterTableStoredProcedure
    CREATE PROCEDURE [dbo].[AspNet_SqlCacheRegisterTableStoredProcedure] 
                 @tableName NVARCHAR(450) 
             AS
             BEGIN
    
             DECLARE @triggerName AS NVARCHAR(3000) 
             DECLARE @fullTriggerName AS NVARCHAR(3000)
             DECLARE @canonTableName NVARCHAR(3000) 
             DECLARE @quotedTableName NVARCHAR(3000) 
    
             /* Create the trigger name */ 
             SET @triggerName = REPLACE(@tableName, '[', '__o__') 
             SET @triggerName = REPLACE(@triggerName, ']', '__c__') 
             SET @triggerName = @triggerName + '_AspNet_SqlCacheNotification_Trigger' 
             SET @fullTriggerName = 'dbo.[' + @triggerName + ']' 
    
             /* Create the cannonicalized table name for trigger creation */ 
             /* Do not touch it if the name contains other delimiters */ 
             IF (CHARINDEX('.', @tableName) <> 0 OR 
                 CHARINDEX('[', @tableName) <> 0 OR 
                 CHARINDEX(']', @tableName) <> 0) 
                 SET @canonTableName = @tableName 
             ELSE 
                 SET @canonTableName = '[' + @tableName + ']' 
    
             /* First make sure the table exists */ 
             IF (SELECT OBJECT_ID(@tableName, 'U')) IS NULL 
             BEGIN 
                 RAISERROR ('00000001', 16, 1) 
                 RETURN 
             END 
    
             BEGIN TRAN
             /* Insert the value into the notification table */ 
             IF NOT EXISTS (SELECT tableName FROM dbo.AspNet_SqlCacheTablesForChangeNotification WITH (NOLOCK) WHERE tableName = @tableName) 
                 IF NOT EXISTS (SELECT tableName FROM dbo.AspNet_SqlCacheTablesForChangeNotification WITH (TABLOCKX) WHERE tableName = @tableName) 
                     INSERT  dbo.AspNet_SqlCacheTablesForChangeNotification 
                     VALUES (@tableName, GETDATE(), 0)
    
             /* Create the trigger */ 
             SET @quotedTableName = QUOTENAME(@tableName, '''') 
             IF NOT EXISTS (SELECT name FROM sysobjects WITH (NOLOCK) WHERE name = @triggerName AND type = 'TR') 
                 IF NOT EXISTS (SELECT name FROM sysobjects WITH (TABLOCKX) WHERE name = @triggerName AND type = 'TR') 
                     EXEC('CREATE TRIGGER ' + @fullTriggerName + ' ON ' + @canonTableName +'
                           FOR INSERT, UPDATE, DELETE AS BEGIN
                           SET NOCOUNT ON
                           EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N' + @quotedTableName + '
                           END
                           ')
             COMMIT TRAN
             END
       

    AspNet_SqlCacheUnRegisterTableStoredProcedure
    CREATE PROCEDURE [dbo].[AspNet_SqlCacheUnRegisterTableStoredProcedure] 
                 @tableName NVARCHAR(450) 
             AS
             BEGIN
    
             BEGIN TRAN
             DECLARE @triggerName AS NVARCHAR(3000) 
             DECLARE @fullTriggerName AS NVARCHAR(3000)
             SET @triggerName = REPLACE(@tableName, '[', '__o__') 
             SET @triggerName = REPLACE(@triggerName, ']', '__c__') 
             SET @triggerName = @triggerName + '_AspNet_SqlCacheNotification_Trigger' 
             SET @fullTriggerName = 'dbo.[' + @triggerName + ']' 
    
             /* Remove the table-row from the notification table */ 
             IF EXISTS (SELECT name FROM sysobjects WITH (NOLOCK) WHERE name = 'AspNet_SqlCacheTablesForChangeNotification' AND type = 'U') 
                 IF EXISTS (SELECT name FROM sysobjects WITH (TABLOCKX) WHERE name = 'AspNet_SqlCacheTablesForChangeNotification' AND type = 'U') 
                 DELETE FROM dbo.AspNet_SqlCacheTablesForChangeNotification WHERE tableName = @tableName 
    
             /* Remove the trigger */ 
             IF EXISTS (SELECT name FROM sysobjects WITH (NOLOCK) WHERE name = @triggerName AND type = 'TR') 
                 IF EXISTS (SELECT name FROM sysobjects WITH (TABLOCKX) WHERE name = @triggerName AND type = 'TR') 
                 EXEC('DROP TRIGGER ' + @fullTriggerName) 
    
             COMMIT TRAN
             END
       

    AspNet_SqlCacheUpdateChangeIdStoredProcedure

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

    manual olarak bunları sql de oluştur.. sonrasında diğer işlemlere geçebilirsin... artık bundan sonrasını yaparsın.. :) 
    kolay gelsin..

    28 Şubat 2013 Perşembe 09:06

Tüm Yanıtlar

  • Hocam amacını bir türlü anliyamadım ama şöyle yapabilrisin.

    StreamWriter SW = new StreamWriter("c:\\deneme.txt");

     Random rd = new Random();
        Sayi = rd.Next(0, 900000000);
    SW.WriteLine(sayi);//burda random sayini üret
    SW.Close();

    27 Şubat 2013 Çarşamba 16:36
  • CacheDependency yerine SqlCacheDependency yaparsan .txt ye ihtiyacın olmaz.. bu şekilde veritabanında oluşturulmuş bir tabloya bakar eğer sayı değişmişse otomatik olarak cache i bozar..

    buradan 

    Cache Dependency on SQL

    adlı yazıyı inceleyebilirsin..
    ben kendi projelerimde resim ve slayt alanları için uyguluyorum sonuç mükemmel..
    kolay gelsin...



     
    27 Şubat 2013 Çarşamba 16:40
  • Cache işlemini ilk defa yapacağım için @Faruk_M arkadaşımızın vermiş olduğu SqlCacheDependency  örneğini tam anlayamadım karışık geldi bana. Daha basit bir örnek ile gösterebilirmisiniz acaba. birazda detay verirseniz süper olur
    28 Şubat 2013 Perşembe 06:45
  • şimdi Hocam, önce veritabanını cache için hazırlıyorsun..
    1-
    Başlat/Programlar/Visual Studio v.201.. / Visual Studio command prompt açıyorsun ve içerisine aşağıdakileri sırayla yazıyorsun..
    bu aşağıda ki yazılanları kendi tablona gör uyarlarsın..
    aspnet_regsql -ed -E -d School      ------> veritabanına sqlcache i ekler ( School : veritabanı )

    aspnet_regsql -et -E -d School -t Users  -------> veritabanındaki tabloyu bellekleme için işaretler( School ' veritabanındaki Users tablosu )

    2-
    sonrasında Db nin içerisnde yeni bir tablo eklenmiş olmalı bunu bir kontrol et eğer tablo varsa bu işlemi doğru yapmışsın demekktir..Tablolarda böyle bir tablo oluşmuş olmalı : 
    AspNet_SqlCacheTablesForChangeNotification
    sonrasında bu cache i bozacak kontrol edecek 5 adet procedure oluşturacak.. dediğim gibi eğer tablo ismini görüyorsan sorun yok devam edelim..

    3-
    web.config de bazı ayarlar yapıyoruz : <system.web> içerisinde
    <caching>
          <sqlCacheDependency pollTime="10000" enabled="true" >
            <databases>
              <add pollTime="10000" connectionStringName="BaglantiAdin" name="DB Adin"/>
            </databases>
          </sqlCacheDependency>
    </caching>
    birde 
    connectionString="Data Source=.;Initial Catalog=DB Adin;Integrated Security=True; User Id=sa; Password=123;Connect Timeout=200; pooling=true; Max Pool Size=200;"
    
    bu şekilde düzenliyorsun yani 
    Connect Timeout=200; pooling=true; Max Pool Size=200;
    bualanları ekliyorsun

    4-
    ve son işlem olarak codebehind a cache kodunu yazıyorsun..
        private void cache_Slayt()
        {
            if (Page.Cache["ch_slyat"] == null)
            {
                SqlCacheDependency dep = new SqlCacheDependency("DB Adin", "Db Tablo Adin");
                dt = Slaytlari_Getir(); // DataTable döndüren metod
                Page.Cache.Insert("ch_slyat", dt, dep);
            }
            else
            {
                dt = Page.Cache["ch_slyat"] as DataTable;
            }
    
            rpSlayt.DataSource = dt;
            rpSlayt.DataBind();
        }

    hepsi bu kadar inşallah faydalı olur.. kolay gelsin..
    28 Şubat 2013 Perşembe 07:44
  • Tablo oluşturma işlemini Elle yapabilirmiyiz ? dediklerinizi yaptım ama tabloları nereye oluşturdu göremiyorum. Web üzerinde bulunan MsSQL'e  oluşturmak istiyorum tablolarımı.
    28 Şubat 2013 Perşembe 08:49
  • AspNet_SqlCacheTablesForChangeNotification Tablosu
    CREATE TABLE [dbo].[AspNet_SqlCacheTablesForChangeNotification](
    	[tableName] [nvarchar](450) NOT NULL,
    	[notificationCreated] [datetime] NOT NULL,
    	[changeId] [int] NOT NULL,
    PRIMARY KEY CLUSTERED 
    (
    	[tableName] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    ALTER TABLE [dbo].[AspNet_SqlCacheTablesForChangeNotification] ADD  DEFAULT (getdate()) FOR [notificationCreated]
    GO
    
    ALTER TABLE [dbo].[AspNet_SqlCacheTablesForChangeNotification] ADD  DEFAULT ((0)) FOR [changeId]
    GO

    PROCEDURE ler

    AspNet_SqlCachePollingStoredProcedure
    CREATE PROCEDURE [dbo].[AspNet_SqlCachePollingStoredProcedure] AS
             SELECT tableName, changeId FROM dbo.AspNet_SqlCacheTablesForChangeNotification
             RETURN 0
    AspNet_SqlCacheQueryRegisteredTablesStoredProcedure

    CREATE PROCEDURE [dbo].[AspNet_SqlCacheQueryRegisteredTablesStoredProcedure] 
             AS
             SELECT tableName FROM dbo.AspNet_SqlCacheTablesForChangeNotification 

    AspNet_SqlCacheRegisterTableStoredProcedure
    CREATE PROCEDURE [dbo].[AspNet_SqlCacheRegisterTableStoredProcedure] 
                 @tableName NVARCHAR(450) 
             AS
             BEGIN
    
             DECLARE @triggerName AS NVARCHAR(3000) 
             DECLARE @fullTriggerName AS NVARCHAR(3000)
             DECLARE @canonTableName NVARCHAR(3000) 
             DECLARE @quotedTableName NVARCHAR(3000) 
    
             /* Create the trigger name */ 
             SET @triggerName = REPLACE(@tableName, '[', '__o__') 
             SET @triggerName = REPLACE(@triggerName, ']', '__c__') 
             SET @triggerName = @triggerName + '_AspNet_SqlCacheNotification_Trigger' 
             SET @fullTriggerName = 'dbo.[' + @triggerName + ']' 
    
             /* Create the cannonicalized table name for trigger creation */ 
             /* Do not touch it if the name contains other delimiters */ 
             IF (CHARINDEX('.', @tableName) <> 0 OR 
                 CHARINDEX('[', @tableName) <> 0 OR 
                 CHARINDEX(']', @tableName) <> 0) 
                 SET @canonTableName = @tableName 
             ELSE 
                 SET @canonTableName = '[' + @tableName + ']' 
    
             /* First make sure the table exists */ 
             IF (SELECT OBJECT_ID(@tableName, 'U')) IS NULL 
             BEGIN 
                 RAISERROR ('00000001', 16, 1) 
                 RETURN 
             END 
    
             BEGIN TRAN
             /* Insert the value into the notification table */ 
             IF NOT EXISTS (SELECT tableName FROM dbo.AspNet_SqlCacheTablesForChangeNotification WITH (NOLOCK) WHERE tableName = @tableName) 
                 IF NOT EXISTS (SELECT tableName FROM dbo.AspNet_SqlCacheTablesForChangeNotification WITH (TABLOCKX) WHERE tableName = @tableName) 
                     INSERT  dbo.AspNet_SqlCacheTablesForChangeNotification 
                     VALUES (@tableName, GETDATE(), 0)
    
             /* Create the trigger */ 
             SET @quotedTableName = QUOTENAME(@tableName, '''') 
             IF NOT EXISTS (SELECT name FROM sysobjects WITH (NOLOCK) WHERE name = @triggerName AND type = 'TR') 
                 IF NOT EXISTS (SELECT name FROM sysobjects WITH (TABLOCKX) WHERE name = @triggerName AND type = 'TR') 
                     EXEC('CREATE TRIGGER ' + @fullTriggerName + ' ON ' + @canonTableName +'
                           FOR INSERT, UPDATE, DELETE AS BEGIN
                           SET NOCOUNT ON
                           EXEC dbo.AspNet_SqlCacheUpdateChangeIdStoredProcedure N' + @quotedTableName + '
                           END
                           ')
             COMMIT TRAN
             END
       

    AspNet_SqlCacheUnRegisterTableStoredProcedure
    CREATE PROCEDURE [dbo].[AspNet_SqlCacheUnRegisterTableStoredProcedure] 
                 @tableName NVARCHAR(450) 
             AS
             BEGIN
    
             BEGIN TRAN
             DECLARE @triggerName AS NVARCHAR(3000) 
             DECLARE @fullTriggerName AS NVARCHAR(3000)
             SET @triggerName = REPLACE(@tableName, '[', '__o__') 
             SET @triggerName = REPLACE(@triggerName, ']', '__c__') 
             SET @triggerName = @triggerName + '_AspNet_SqlCacheNotification_Trigger' 
             SET @fullTriggerName = 'dbo.[' + @triggerName + ']' 
    
             /* Remove the table-row from the notification table */ 
             IF EXISTS (SELECT name FROM sysobjects WITH (NOLOCK) WHERE name = 'AspNet_SqlCacheTablesForChangeNotification' AND type = 'U') 
                 IF EXISTS (SELECT name FROM sysobjects WITH (TABLOCKX) WHERE name = 'AspNet_SqlCacheTablesForChangeNotification' AND type = 'U') 
                 DELETE FROM dbo.AspNet_SqlCacheTablesForChangeNotification WHERE tableName = @tableName 
    
             /* Remove the trigger */ 
             IF EXISTS (SELECT name FROM sysobjects WITH (NOLOCK) WHERE name = @triggerName AND type = 'TR') 
                 IF EXISTS (SELECT name FROM sysobjects WITH (TABLOCKX) WHERE name = @triggerName AND type = 'TR') 
                 EXEC('DROP TRIGGER ' + @fullTriggerName) 
    
             COMMIT TRAN
             END
       

    AspNet_SqlCacheUpdateChangeIdStoredProcedure

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

    manual olarak bunları sql de oluştur.. sonrasında diğer işlemlere geçebilirsin... artık bundan sonrasını yaparsın.. :) 
    kolay gelsin..

    28 Şubat 2013 Perşembe 09:06
  • Cevap için teşekkürler. Problemim giderildi
    28 Şubat 2013 Perşembe 11:20