Toon posts:

[.net] cachen van queries

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb nu een aardig componentje gemaakt voor queries op een db los te laten, met van alles er op en er aan.

Nu wil ik als laatste stap caching gaan toevoegen. Connection pooling gebeurt door de driver dus dat hoef ik niet te doen, wat ik dus wel wil doen zijn queries cachen, nou komt hier het probleem, de meeste queries zijn geen probleem, zijn altijd hetzelfde, maar wat als je gebruikt maakt van parameters? Dit wil ik dus ook gaan cachen, maar nu is de vraag hoe bouw ik hier een goede key voor.

Bij een standaard sql statement kan je gewoon:
Visual Basic:
1
cache(query)=QueryResult

Maar als je parameters gebruikt, is query altijd hetzelfde, enkelt de parameters verschillen, zou je dan je parameter namen eerst replacen met de waarden en dan bovenstaande code weer gebruiken?

Ook ondersteund mijn db wrapper het direct uitvoeren van een command, dus er wordt nu geen sql statement gegeven, maar een command aan de functie gevoerd. Hoe kan ik deze goed opnemen in mijn cache provider?

Ik heb net even de data application block bekeken van ms. Deze gebruiken combo's van de connectie string, en het sql statement, hoe ze dus commands cachen heb ik geen idee van?

Zou ik anders een hash uit elke query moeten maken? m.b.v. base64 ofzo, maar dat gaat ook weer niet voor commands werken. Iemand een goed idee om dit te doen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Het DBMS gaat -als je een beetje deftig DBMS hebt- je query (of het execution plan) ervan gaan cachen.
Zeker als je gebruikt maakt van parametrized queries is het DBMS daar goed tot in staat.
Stel dat je 2x dezelfde (parametrized) query naar het DBMS stuurt -maar dan met verschillende waarden voor de params-, dan zal het DBMS je query execution plan cachen, en dat zelfde execution plan gebruiken bij de 2de keer dat je je query uitvoert. De stap om het optimale exec. plan te bepalen wordt dus al overgeslagen, omdat dat plan al beschikbaar is.

Zie ook dit artikel van EfBe.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Dat stuk wist ik ook wel, maar is het toch niet makkelijk om vaak gebruikte data in je .NET app te cachen, ik moet het toch nog steeds gaan maken, omdat een deel ook lokaal wordt opgevraagd d.m.v. een webservice, en het zou een beetje nutteloos zijn om dan steeds die requests naar de server te sturen.

Ook zie je in veel source van demo applicaties dat er toch vaak datasets worden gecached. En die zijn dan zelfs nog op SQL serv gebaseerd, ik gebruik zelf nu nog even mysql, maar stap binnenkort over op postgre, en ik weet van die dat die ook delen cached. Dus dan gaat het nog hoofdzakelijk om de client die gegevens haalt uit een webservice.

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:24

gorgi_19

Kruimeltjes zijn weer op :9

Ook zie je in veel source van demo applicaties dat er toch vaak datasets worden gecached. En die zijn dan zelfs nog op SQL serv gebaseerd, ik gebruik zelf nu nog even mysql,
Hoe bedoel je? Een dataset is niet gekoppeld aan SQL Server of welke DBMS dan ook. Of bedoel je een CacheDependancy op SQL Server? Verder sla ik zelf vaak business objects op in een cache, dit is niet gebonden aan een dataset.

Het cachen doe ik zelf in m'n BLL, eigenlijk niet helemaal netjes, aangezien je System.Web.Cache gebruikt en je op deze manier flexibiliteit mist als je deze ook wilt gebruiken in WinForms. Wel heb ik het enigszins 'eenvoudig' gehouden door er een wrapper omheen te schrijven.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Je kan misschien even het artikel lezen uit deze post:
[rml]whoami in "[ ASP.NET] Webdev tips"[/rml]

Dit is echter wel beperkt tot SQL Server.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:24

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 16 februari 2004 @ 09:02:
Je kan misschien even het artikel lezen uit deze post:
[rml]whoami in "[ ASP.NET] Webdev tips"[/rml]

Dit is echter wel beperkt tot SQL Server.
In whidbey komt een SQLCacheDependancy, voor SQL Server. Er verschijnen er onderhand al steeds meer artikelen over. Volgens mij is dit niet zo een hele moeilijke feature om zelf te maken, maar dan databaseonafhankelijk.

Ik heb alleen geen idee hoe je een Custom CacheDependancy maakt en of dit uberhaupt mogelijk is.

edit:

Hmmm.. Dat laatste wordt lastig, aangezien de CacheDependency-class sealed is

[ Voor 11% gewijzigd door gorgi_19 op 16-02-2004 09:19 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Het gaat hier dus om het cachen van resultaten die uit mijn queries voorkomen. Op zich is dit niet zo'n probleem. Ik heb dus een functie:

Visual Basic:
1
Public Function QueryToDataset(byref strSQL as string, optional doCache as boolean = false) as dataset


Dit werkt prima, en kan ik strSQL gebruiken als key voor de cache. Het probleem is echter nu als ik mijn volgende functie gebruik:

Visual Basic:
1
Public Function QueryToDataset(byref myCommand as OdbcCommand, optional doCache as boolean = false) as dataset


Nu kan ik dus niet strSQL gebruiken als key voor me cache, ik probeer dus het cachen dynamisch op te nemen in mijn dbwrapper die voor (mysql) werkt, maar ook voor andere zou moeten werken met odbc. Daar ligt het probleem, nu weet ik dat het excecution plan wordt gecached in mijn DBMS, maar mijn uiteindelijke dataset wil ik dus cachen in mijn DAL. In het eerste geval werkt dat prima, maar in het tweede geval kunnen er dus parameters zijn. Ik kan dan natuurlijk weer alle parameters uitlezen, en een key bouwen uit strSQL+parameter1+parameter2 etc... en dat gaan gebruiken als key, maar is hier een betere manier voor?

Uiteindelijk ga ik dus gebruiken voor mijn clients die gegevens uit een webservice gaan ophalen. Ik hoop dat hier mijn probleem hier wat beter mee uitgelegd is.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Je kan wel output caching implementeren in je WebService, maar ik weet nu niet of je die ook afhankelijk kunt maken van de parameters die die Webservice krijgt.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ik ga wel een functie schrijven die de parameters invult in de sql query met gewoon een simpele replace, en dat gebruiken als key,mischien daar nog een base64 hash van maken zodat je een korte key krijgt, als ik het af (en werkend) heb zal ik de source hier wel plaatsen hoe ik het heb opgelost. Dus ik zal een command weer uit elkaar plukken in een sql query, en daarin de parameters vervangen. bedankt in ieder geval.

ps. ik heb helemaal geen ervaring met output caching, is dit aan te raden voor de webservice? en over het algemeen voor normale dynamische aspx pagina's?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:24

gorgi_19

Kruimeltjes zijn weer op :9

whoami schreef op 16 februari 2004 @ 11:43:
Je kan wel output caching implementeren in je WebService, maar ik weet nu niet of je die ook afhankelijk kunt maken van de parameters die die Webservice krijgt.
Als het zou kunnen, moet je kijken naar VaryByParam of VaryByParams :)
ps. ik heb helemaal geen ervaring met output caching, is dit aan te raden voor de webservice? en over het algemeen voor normale dynamische aspx pagina's?
Is niet op voorhand te zeggen, hangt van de situatie af.

Ik vraag me trouwens sowieso af of je niet in een gedeelte bezig bent waar je nauwelijks performancewinst kan behalen; 20% van je applicatie neemt 80% van je executietijd in, als ik het me goed herinner.

[ Voor 43% gewijzigd door gorgi_19 op 16-02-2004 17:41 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Er zijn 2 of 3 queries die uiteindelijk flink wat tabellen joinen, maar die worden niet super vaak aangeroepen. Maar ik wou het gewoon netjes in mijn dal aanmaken, dus niet echt voor performance winst, maar gewoon als perfectionist ;) Als ik het ooit nog veel wil gaan gebruiken dan zit het er vast in.
Pagina: 1