[ASP.net + IIS] cache wordt automatisch leeggegooid?

Pagina: 1
Acties:

  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
Ik gebruik caching binnen mijn website om niet telkens naar de database te moeten gaan voor data die niet veel wijzigen.

code:
1
Cache.Insert("naam", data)

Dit heeft altijd perfect gewerkt op 2 servers. Nu ik dezelfde code op een 3de server wil zitten werkt dit ook, maar wordt de cache spontaan leeggemaakt. Ik zie geen regelmaat van tijdstippen of gebeurtenissen, en zie ook nergens een melding in bv event viewer.
De werkende servers zijn win2000 server met IIS5, terwijl de server waar het niet werkt een win2003server met IIS6 is. Dit kan toch niet aan de nieuwere versie liggen?

De cache wordt opgebouwd in de Application_Start sub in global.asax

Ik kan natuurlijk altijd gaan kijken of de cache gevuld is alvorens met de data om te gaan, maar dat is niet de bedoeling.

Heeft nog iemand dit voorgehad?

edit: typo

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:52

gorgi_19

Kruimeltjes zijn weer op :9

Ja, dit is de normale werkwijze van Cache :) Tenzij anders aangegeven ruimt hij, bij inactiviteit of lage prioriteit, de boel op. :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
gorgi_19 schreef op dinsdag 15 februari 2005 @ 15:24:
Ja, dit is de normale werkwijze van Cache :) Tenzij anders aangegeven ruimt hij, bij inactiviteit of lage prioriteit, de boel op. :)
dezelfde site draait op mijn testserver. Die gebruik ik alleen en dus veel minder dan de live server (waar het probleem zich voordoet). Waar kan ik ergens die termijn verlengen dan?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:52

gorgi_19

Kruimeltjes zijn weer op :9

Ik zou er eik niet op vertrouwen; waarom gebruik je geen Application variabelen dan voor dat doel?
Wil je cache gebruiken: zie http://msdn.microsoft.com...achingcacheclasstopic.asp

[ Voor 43% gewijzigd door gorgi_19 op 15-02-2005 15:29 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
we gaan hier eens mee aan het werk

code:
1
2
3
4
5
6
7
8
9
[Visual Basic] 
Cache.Insert("DSN", connectionString, Nothing, DateTime.Now.AddMinutes(2), TimeSpan.Zero, CacheItemPriority.High, onRemove)

[C#] 
Cache.Insert("DSN", connectionString, null, DateTime.Now.AddMinutes(2), TimeSpan.Zero, CacheItemPriority.High, onRemove);
   

[C++] 
Cache->Insert(S"DSN", connectionString, 0, DateTime::Now.AddMinutes(2), TimeSpan::Zero, CacheItemPriority::High, onRemove);


toch al bedankt gorgi_19 !!!

  • Greyfox
  • Registratie: Januari 2001
  • Laatst online: 17-04 23:50

Greyfox

MSX rulez

ibizadesire schreef op dinsdag 15 februari 2005 @ 15:18:
Ik gebruik caching binnen mijn website om niet telkens naar de database te moeten gaan voor data die niet veel wijzigen.

Ik kan natuurlijk altijd gaan kijken of de cache gevuld is alvorens met de data om te gaan, maar dat is niet de bedoeling.
ehm, dat is nou juist wel de bedoeling.
Je weet toch immers nooit zeker of de data aanwezig is.
Cache zorgt ervoor dat je geen trage acties onnodig hoeft te doen, maar het checken of de cache gevuld is is niet zo kostbaar hoor.

MSX 2 rulez more


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:52

gorgi_19

Kruimeltjes zijn weer op :9

Waarom stop je je connectionstring in je cache :? Waarom haal je die niet uit je web.config en gebruik je als 'wrapper' hiervoor een global var, dus dat je Globals.Connectionstring kan aanroepen?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Nu online
Tja..... je connection string stop je best in je web.config idd.

En ik ben het met greyfox ook eens: je moet eerst kijken of je data wel in de cache zit, zoja, return je de inhoud van je cache, zonee, stop ze in de cache:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MyCache
{

    public static DataSet GetCustomers()
    {
          if( Cache["customers"] == null )
          {
                Cache.Add ("customers", daoCustomers.GetAllCustomers());
          }
          return Cache["customers"];
    }

}

stom voorbeeldje, uit de losse hand etc...

https://fgheysels.github.io/


  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
die connectie string staat in mijn web.config. dit is een voorbeeld dat ik via google vond. Was gewoon om aan te duiden dat je de expiration kon instellen.

  • sander_g
  • Registratie: Juli 2002
  • Laatst online: 08-05 17:21
ibizadesire schreef op dinsdag 15 februari 2005 @ 15:18:De werkende servers zijn win2000 server met IIS5, terwijl de server waar het niet werkt een win2000server met IIS6 is. Dit kan toch niet aan de nieuwere versie liggen?
Een windows 2000 server met IIS 6 ben ik nog niet tegengekomen. Volgens mij bedoel je Windows 2003. In IIS 6 wordt standaard het worker process iedere 26 uur gerecycled. Deze recycle kan sneller plaatsvinden als je in de application pool waarin de site draait nog aan parameters (cpu, geheugen, e.d.) hebt gedraaid.

Misschien dat je cache daarom plots leeg is.

Garmin Fēnix 7 Pro | https://www.strava.com/athletes/30783039


  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
ik heb nu een procedure die elke keer kijkt of alle caches gevuld zijn. zoniet maakt hij ze terug aan. Als ik nu handmatig de cache leeg zie ik ook dat dit terug wordt aangemaakt!

Helaas kreeg ik deze morgen weer de melding dat de cache leeg was :( Ik heb een procedure die ik handmatig kan starten om de caches terug aan te maken. Hier kreeg ik een object reference not set to an instance of an object van terug.
Het rare is dat als ik de applicatie terug start (web.config terug zet, IIS restart, opnieuw compileer) alles perfect werkt.

ik ga eens naar dit worker process kijken. thx !

  • whoami
  • Registratie: December 2000
  • Nu online
Als je niet wilt dat je cache leeg is, waarom gebruik je dan het 'Cache' object ?
Cache is zoals zijn naam het al zegt: iets 'cachen', dwz, tijdelijk in het geheugen houden. Het is gewoon normaal dat een 'cache' expired.
Wellicht zal het idd te maken hebben met het asp.net wp dat om de zoveel uur gereset wordt, maar dat kan altijd gebeuren, zelfs als je geen gebruik maakt van win 2003.

Maak gewoon gebruik van de cache zoals het hoort: kijk eerst of iets in de cache zit, zoja, return het, zo nee, vul je cache en return het. Zie ook een eerdere post van mij.

https://fgheysels.github.io/


Verwijderd

Het workerprocess staat los van die foutmelding. Het workerproces is gewoon de zandbak van je applicatie en die kan lekker zand (geheugen, proc capa) kan gaan pakken totdat IIS zegt dat hij even de boel moet aanvegen en de hele zooi moet opruimen. Dan wordt ook je cache geleegd.

ik zou anders die functie waarmee je je caches herlaadt even neerzetten, misschien dat daar iets fout in kan gaan

  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
Zo overloop ik de caches in de Page_Load:
code:
1
2
cacheControl("naamCache1")
cacheControl("naamCache2")

Deze roepen dan cacheControl aan:
code:
1
2
3
4
5
6
7
Private Sub cacheControl(ByVal cachedItem As String)
        Dim __cache As New intranetClassLibrary.Cache

        If System.Web.HttpContext.Current.Cache.Get(cachedItem) Is Nothing Then
            __cache.create(System.Web.HttpContext.Current.Cache)
        End If
End Sub


aanmaken cache in intranetClassLibrary.Cache:
code:
1
2
3
4
5
6
7
8
9
10
Public Sub create(ByRef cache As System.Web.Caching.Cache)
        Try
            cacheProdukten(cache)
            cache2(cache)
            cache3(cache)
        Catch __exception As Exception
            'exceptie opvangen
        Finally
        End Try
    End Sub


voorbeeld van cachevulling:
code:
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub cacheProdukten(ByRef cache As System.Web.Caching.Cache)
        Dim hashProdukten As New System.Collections.Hashtable

        hashProdukten.Add("1", "text")
        hashProdukten.Add("2", "text")
        hashProdukten.Add("3", "text")
        hashProdukten.Add("4", "text")
        hashProdukten.Add("5", "text")
        hashProdukten.Add("7", "text")

        cache.Insert("produktenLijst", hashProdukten)
    End Sub

Verwijderd

iets wat me opvalt, als er 1 van je caches leeg is, dan ga je gelijk alles hervullen. Misschien beter om dat per stuk te checken. dmv de wrapper die whoami al gegeven heeft (welliswaar in C#, maar het idee moet wel duidelijk zijn).
Je zou verder ook een priority ergens aan kunnen geven, zodat veel geraadpleegde data langer in de cache.
Enige wat volgens mij nog een fout zou kunnen geven is als er bijvoorbeeld geen context is, misschien dat nog even als een extra if (of and) erbij zetten.
Mocht het nu nog fout gaan, dan graag een speiciekere foutmelding (regelnummer stukkie code)

  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
ik heb het nu inderdaad allemaal laten opnieuw bouwen voor de zekerheid. Als ik eenmaal de fout heb gevonden moet enkel de cache vernieuwen dien leeg was.
het probleem is dat ik moet wachten tot deze weer een foutmelding geeft. Dat is frustrerend })

Verwijderd

gooi je het toch in een try catch met een mail naar jezelf als het fout is met veel error info?!

  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Server Error in '/' Application.
--------------------------------------------------------------------------------

Object reference not set to an instance of an object. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[NullReferenceException: Object reference not set to an instance of an object.]
   site.intranet.Account.Account.getVertegenwoordigers() in L:\Visual Studio .NET 2003 projects\intranetLibrary\site.intranet.account.cs:362

[SiteException: 
@ assembly: intranetLibrary, Version=1.0.1873.22522, Culture=neutral, PublicKeyToken=null
@ location: c:\windows\microsoft.net\framework\v1.1.4322\temporary asp.net files\root\523545e3\d51b66d\assembly\dl2\5b522524\a2ebf306_1a14c501\intranetlibrary.dll
@ method: System.Data.DataSet getVertegenwoordigers()
  arguments: none
  file: Site.intranet.account.cs
[System.NullReferenceException exception caught and new SiteException thrown]]
   site.intranet.Account.Account.getVertegenwoordigers() in L:\Visual Studio .NET 2003 projects\intranetLibrary\site.intranet.account.cs:379
   intranetClassLibrary.Cache.cacheVertegenwoordigers(Cache& cache) in L:\Visual Studio .NET 2003 projects\intranetClassLibrary\cache.vb:74
   intranetClassLibrary.Cache.create(Cache& cache) in L:\Visual Studio .NET 2003 projects\intranetClassLibrary\cache.vb:16

[SiteException: 
@ assembly: intranetClassLibrary, Version=1.0.1873.16970, Culture=neutral, PublicKeyToken=null
@ location: c:\windows\microsoft.net\framework\v1.1.4322\temporary asp.net files\root\523545e3\d51b66d\assembly\dl2\fa1ccfe2\7c3a5628_1814c501\intranetclasslibrary.dll
@ method: Void create(System.Web.Caching.Cache ByRef)
  file: Cache.vb
Site.Exceptions.SiteException exception caught and new SiteException thrown]]
   intranetClassLibrary.Cache.create(Cache& cache) in L:\Visual Studio .NET 2003 projects\intranetClassLibrary\cache.vb:25
   intranetClassLibrary.Cache.cacheControl(String cachedItem) in L:\Visual Studio .NET 2003 projects\intranetClassLibrary\cache.vb:45
   intranetClassLibrary.Cache.controleerCachedItems() in L:\Visual Studio .NET 2003 projects\intranetClassLibrary\cache.vb:30
   intranet._default.Page_Load(Object sender, EventArgs e) in \\192.168.55.161\wwwroot$\intranet\default.aspx.vb:40
   System.Web.UI.Control.OnLoad(EventArgs e) +67
   System.Web.UI.Control.LoadRecursive() +35
   System.Web.UI.Page.ProcessRequestMain() +750
--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:1.1.4322.2032; ASP.NET Version:1.1.4322.2032


stuk waar het fout gaat: site.intranet.account.cs:362
code:
1
2
3
4
5
6
7
8
9
string __storedprocedureName = "sp_SelectVertegenwoordigers";
string[] __sqlParameterNames = null;
object[] __sqlParameterValues = null;
Site.SqlDAL.SqlDAL __SqlDAL = new Site.SqlDAL.SqlDAL (System.Configuration.ConfigurationSettings.AppSettings["dbString"].ToString());
__dataSet = __SqlDAL.ExecuteSP_DataSet (__storedprocedureName, __sqlParameterNames, __sqlParameterValues);
__dataSet.Tables[0].TableName = "Account";

__dataSet.WriteXml("E:\\log\\exception\\" + __storedprocedureName + "_DataSetCurrentData.xml");
__dataSet.WriteXmlSchema("E:\\log\\exception\\" + __storedprocedureName + "_DataSetStructure.xml");



Diezelfde SQLdal wordt gebruikt op tal van andere plaatsten en websites, dat kan het probleem niet zijn. Trouwens dezelfde exacte code op een andere server doet het perfect.
databaseserver is up, stored procedure werkt

  • whoami
  • Registratie: December 2000
  • Nu online
Op welke regel geeft ie die null reference exception ?
Heb je al eens het spel gedebugged , en gekeken welk object / variable er NULL Is ?

https://fgheysels.github.io/


  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
op regel 4 van hierboven:
code:
1
Site.SqlDAL.SqlDAL __SqlDAL = new Site.SqlDAL.SqlDAL (System.Configuration.ConfigurationSettings.AppSettings["dbString"].ToString());


maar die code heb ik al 100 keer opnieuw gebruikt

[ Voor 17% gewijzigd door ibizadesire op 21-02-2005 10:32 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 09-05 08:08

Janoz

Moderator Devschuur®

!litemod

Welke regel is 362? Is dat regel 4 in je voorbeeld?

Nullpointer exceptions zijn over het algemeen redelijk simpel en makkelijk te voorkomen. Zorg gewoon dat je overal in je code zeker weet dat er ergens een waarde toegekent wordt of dat je er rekening mee houd dat het null kan zijn.

Daarnaast snap ik niet wat je probleem is met de cache en waarom je uberhaupt een appart onderdeel aanmaakt dat de complete cache vult. Daarvoor is de cache helemaal niet bedoeld.

werkwijze cache:
code:
1
2
3
4
5
6
7
8
geefWaardeX(){
  waarde = haalUitCache(X);
  if waarde==null {
    waarde = haalUitDatabaseOfWaarDanOok(X);
    stopInCache(X,waarde);
  }
  return waarde;
}


EDIT:
Ach duidelijk. De connectie string bestaat niet en is dus null. Op null kun je niet de methode toString() aanroepen en vandaar dat de nullpointer exception gegooid wordt.

Hoe is het mogenlijk dat je configuratie null opleverd terwijl je in de code er vanuit gaat dat het altijd een waarde moet hebben?

[ Voor 20% gewijzigd door Janoz op 21-02-2005 10:37 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
regel 362 is regel 4 in het voorbeeld

de cache was dus overal leeg, ik dacht dat dat het probleem was, maar blijkbaar niet.

de connectie string is dus inderdaad null. maar waarom die ineens null is weet ik niet. Bij het compileren werkt alles perfect. Het is dus na een bepaalde tijd (geen regelmaat terug te vinden) dat deze leeg wordt.

[ Voor 7% gewijzigd door ibizadesire op 21-02-2005 10:41 ]


  • whoami
  • Registratie: December 2000
  • Nu online
ibizadesire schreef op maandag 21 februari 2005 @ 10:40:
regel 362 is regel 4 in het voorbeeld

de cache was dus overal leeg, ik dacht dat dat het probleem was, maar blijkbaar niet.

de connectie string is dus inderdaad null. maar waarom die ineens null is weet ik niet. Bij het compileren werkt alles perfect. Het is dus na een bepaalde tijd (geen regelmaat terug te vinden) dat deze leeg wordt.
Tja, tijdens het compileren kan de compiler niet gaan checken of die dbString waarde wel in je config file zit, en je al of niet een null gaat opleveren.
In je web.config zal je geen waarde hebben die dbString heet in je appsettings sectie.

https://fgheysels.github.io/


  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
whoami schreef op maandag 21 februari 2005 @ 10:52:
[...]
In je web.config zal je geen waarde hebben die dbString heet in je appsettings sectie.
jawel hoor.
code:
1
<add key="dbString" value="Server=ipnummer;uid=user;pwd=pw;database=HII;Connection Timeout=180"/>


Ik zal even verduidelijken. Ik compileer de code. Alles werkt perfect, heel de site, alle pagina's. Pas na een tijd wordt de connectie string blijkbaar null zonder dat er iets aan gewijzigd is. Zelfde code op een andere server draait perfect

  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
Ik ga die connectiestring eens hard coderen, kijken of dat wat opleverd

Verwijderd

ibizadesire schreef op maandag 21 februari 2005 @ 10:23:
code:
1
string __storedprocedureName = "sp_SelectVertegenwoordigers";
offtopic:
Ff zeiken:
Het is performance-technisch onverstandig om je sp's met sp te prefixen, omdat SQL Server bij een sp die met sp geprefixt is, eerst gaat zoeken in de system db en pas daarna in je eigen database waar jij 'm wilt aanroepen


Toevoeging:
Ik heb er ff naar zitten kijekn, maar er gaat verder geen licht branden. Beetje long shot:
Haal dat instance maak regeltje uit elkaar in 3 nieuwe regels
code:
1
2
3
4
5
string sConString = System....["dbString"];
if (sConString == null)
  throw new Exception("Constring is null");

Site.SqlDal.bla.bal _bla = new Site.SqlDal.bla(sConString)


heb je iig iets meer info

[ Voor 32% gewijzigd door Verwijderd op 22-02-2005 18:14 . Reden: toevoeging ]


  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
Nu heeft het dus een 5dagen gedraaid zonder problemen. Ik had als test even de connectiestrings hard gecodeerd. Wat blijkt nu deze morgen: nu is een andere waarde in web.config leeg. terwijl dat niet is. Het lijkt wel of in de config file nu het probleem zit???
Naief als ik ben heb ik web.config weggegooid en opnieuw toegevoegd.

iem bekend met dit probleem?

[ Voor 10% gewijzigd door ibizadesire op 28-02-2005 08:51 ]


  • whoami
  • Registratie: December 2000
  • Nu online
Kijk eens in de eventlogs op die server, en kijk eens wat er met het asp.net worker process gebeurd is ?

https://fgheysels.github.io/


  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
whoami schreef op maandag 28 februari 2005 @ 09:16:
Kijk eens in de eventlogs op die server, en kijk eens wat er met het asp.net worker process gebeurd is ?
in de event viewer vind ik al niets hierover

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:52

gorgi_19

Kruimeltjes zijn weer op :9

Kijk je wel in de goede web.config? :)

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • ibizadesire
  • Registratie: Juli 2003
  • Laatst online: 06-05 06:51
probleem is opgelost. **hout vasthouden**

de site stond als default website ingesteld. Ik heb een nieuwe site aangemaakt met dezelfde home directory. De default liep weer vast, terwijl de nieuwe bleef lopen. Nu draait de site nog steeds na het weekend, dus lijkt het mij opgelost.
Ik zal het verschil tussen de 2 sites eens bekijken, maar een vinkje "crash na korte tijd" zal er wel nergens staan ;)
Pagina: 1