En iyi yanıtlayıcılar
CacheDependency Hk.

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.
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_SqlCacheUnRegisterTableStoredProcedureCREATE 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..
- Yanıt Olarak Öneren Ali Rıza İnceoğlu 28 Şubat 2013 Perşembe 09:30
- Yanıt Olarak İşaretleyen SerkanKLC 28 Şubat 2013 Perşembe 11:20
Tüm Yanıtlar
-
-
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..
buradanCache Dependency on SQL
adlı yazıyı inceleyebilirsin..
ben kendi projelerimde resim ve slayt alanları için uyguluyorum sonuç mükemmel..
kolay gelsin...
-
-
ş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>
birdeconnectionString="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 yaniConnect 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..- Yanıt Olarak Öneren Ali Rıza İnceoğlu 28 Şubat 2013 Perşembe 09:30
-
-
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_SqlCacheUnRegisterTableStoredProcedureCREATE 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..
- Yanıt Olarak Öneren Ali Rıza İnceoğlu 28 Şubat 2013 Perşembe 09:30
- Yanıt Olarak İşaretleyen SerkanKLC 28 Şubat 2013 Perşembe 11:20
-