Har en fundering om det går att lagra en hel datatabell i Cache-objektet DataReader är uteslutet eftersom den behöver en connection samt bara är en read-forward-only. Tack skall kolla lite mer på det Du kan använda dig av en DataView för att söka i DataSets. Här är kod som visar hur du kan filtera på kolumner: Tackar! Absolut, hashtable är snabbare. För att fylla en Hashtable utifrån en databas, använd då DataReader och inte DataSet. Yepp! Så här löste jag det (kanske nån annan kan ha nytta av det) Snyggt och enkelt :)Lagra datatabell i Cache?
Skall hämta data från en tabell som uppdateras var tionde sekund, och just nu är den tabellen hårt belastad, och min plan är:
Hämta ett DataSet/DataReader eller liknande, spara det i Cache-objektet
Om Cache inte förfallit, hämta tabelldatat från Cache och sedan köra SQLfrågor mot det cachade tabelldatat istf att gå mot tabellen.
Vilket objekt skall jag använda för att kunna lagra det i Cache samt sedemera "plocka fram" det och kunna köra SQLsatser mot det.
Gärna nåt litet kodexempel
TIASv: Lagra datatabell i Cache?
Ett DataSet skulle passa bättre då du har stöd för att göra frågor mot DataSet.
I ASP.Net så kan du anvädna Cache objektet:
Cache["MyData"] = myDataSet;
Du kan även ställa in hur länge cachen ska finnas etc. Så ett tips är att låta cachen dö ut efter en viss tid, tex efter 10 minuter.
Något sådant borde fungera (OBS! Har inte testat koden, men du ser hur du skulle kunna göra):
<code>
CacheItemRemovedCallback onRemove = null;
private DataSet GetDataSet()
{
DataSet myDataSet = new DataSet();
//Databas anrop och fyll DataSet.....
...
return myDataSet;
}
private void InitializeCache()
{
onRemove = new CacheItemRemovedCallback(this.RemovedCallback);
if (Cache["myDataSet"] == null)
this.AddToCache("myDataSet", this.GetDataSet());
}
//Denna metod anropas då din cache "dör"
public void RemovedCallback(String k, Object v, CacheItemRemovedReason r)
{
this.AddToCache("myDataSet", this.GetDataSet());
}
private void AddToCache(DataSet value)
{
Cache.Add("myDataSet", value, null, DateTime.Now.AddSeconds(600), TimeSpan.Zero, CacheItemPriority.High, onRemove);
}
public DataSet GetMyCachedDataSet()
{
this.InitializeCache();
return (DataSet)Cache["myDataSet"];
}
</code>
/Fredrik Normén NSQUARED2
http://normen.mine.nu/myblogSv: Lagra datatabell i Cache?
En följdfråga: Jag inte listat ut är hur jag skall kunna manipulera datasetet, med tex SQLsatser för att hämta data ur det cachade datat.
Måste jag binda det till någon DataTable eller nåt för att sedan loppa igenom den för att hitta det värde jag litar efter?Sv: Lagra datatabell i Cache?
<code>
DataSet ds = this.GetMyCachedDataSet();
DataTable myTable = this.GetMyCachedDataSet().Tables[0];
myTable.DefaultView.RowFilter = "CompanyName = 'MyComanoy'";
</code>
Du kan även använda Find eller FindRows, dessa methoder söker på de nyckar som du har specat att ditt dataset har.
/Fredrik Normén NSQUARED2
http://normen.mine.nu/myBogSv: Lagra datatabell i Cache?
Kikar vidare på detta.
Under tiden som jag "fnulat" på lösningen funderade jag på att använda en HashTable, eftersom det nu ser ut att vara Key/Value som jag skall plocka ur db.)
Har bara fått för mig att hanteringen av HashTable eventuellt är snabbare än att manipulera DataViews och DataSet, men har inget belägg för det.
Prestandamässigt: Är det bättre att köra HashTable eller DataSet i denna typ av Cachade data?Sv: Lagra datatabell i Cache?
/Fredrik Normén NSQUARED2
http://normen.mine.nu/myblogSv: Lagra datatabell i Cache?
Man tackar!
Lutar åt HashTable för lösningen just nu, men håller pejl på dina övriga tips för framtiden.Sv: Lagra datatabell i Cache?
Fyller HashTable
Plockar bara ut de fält som jag behöver (två fält, primärnyckel och värdefältet)
<code>
Private Sub SetTableTotalData()
Dim Conn As New SqlConnection(Current.Application("strCon"))
Dim Cmd As New SqlCommand("SELECT dbid, statvalue FROM RTS_DATA_VIEWS", Conn)
Conn.Open()
Dim dataReader As SqlDataReader = Cmd.ExecuteReader()
Cmd.Dispose()
Dim hTable As New Hashtable
Do While dataReader.Read
hTable.Add(dataReader(0), dataReader(1))
Loop
Current.Cache.Insert("TableTotal", hTable, Nothing, DateTime.Now.AddSeconds(AppSettings("strDbChacheTime")), TimeSpan.Zero)
Conn.Close()
End Sub
</code>
Hämta data från HashTable
Först kollas Cachen om den fortfarande gäller, om inte så fylls cachen igen
Funktionen GetValueFromHashTable anropas med det primärnyckel värde jag vill åt
<code>
Public Function GetBreddMaxTimeWait() As Integer
Return GetValueFromHashTable(BREDD_MAXTIMEWAIT)
End Function
</code>
Funktion för att hämta data från HashTable
<code>
Private Function GetValueFromHashTable(ByVal DbId As Integer) As Integer
Dim retval As String
If Current.Cache("TableTotal") Is Nothing Then
SetTableTotalData()
End If
Dim hTable As Hashtable = Current.Cache("TableTotal")
retval = hTable(DbId).ToString
Return Convert.ToInt32(retval)
End Function
</code>Sv: Lagra datatabell i Cache?
Jag har använt mig av Dataset i cachen, funkade bra det med och rätt snabbt ändå.
Jag hade nämligen behov av RowFilter samt flera kolumner..
Ola