Per implementar la cache en la clsDades calen diferents parts: la taula, les stored procedures (SP) i el codi per consultar i invalidar parts de la cache.
En el primer post ja he parlat de la taula, les SP són les normals per qualsevol taula (GET, INS, DEL, UPD), excepte que com no hi ha camps del grid no es genera la SP QUERY per la taula CACHE.
Cal centrar-se doncs en la consulta a la cache i com s'invalida un conjunt de registres de la cache quan hi ha una operació de modificació de dades (UPD, DEL, INS). La consulta de la cache consisteix en modificar la funció que genera els grids en la clsHelper. Aquesta consisteix en el següent codi:
if (TA.TeCache)
{
URL.AppendFormat("{0}{1}", Ordenacio.ToString(), SentitOrdre.ToString());
URL.AppendFormat("{0}{1}", Req["rows"], Req["page"]);
ParamsCache.Add("Taula", TA.NomTaula);
ParamsCache.Add("URL", URL.ToString());
ParamsCache.Add("GridID", GridID);
TBL = Cache.GET(ParamsCache);
if (TBL.Rows.Count != 0)
{
Result = TBL.Rows[0]["JSON"].ToString();
return Result;
}
}
Si es dóna un cache miss (no es troben les dades a la cache) es fa un processat normal, però al final de tot es grava el resultat a la cache.
if (TA.TeCache)
{
Params.Clear();
Params.Add("Taula", TA.NomTaula);
Params.Add("URL", URL.ToString());
Params.Add("GridID", GridID);
Params.Add("JSON", Result);
Cache.INS(Params);
}
return Result;
Fins aqui és el que tracta l'obtenció de dades de la cache, ara toca la invalidació de la cache. Això es fa dins de la clsDades. Es pot configurar per que la clsDades per cada INS/UPD/DEL automàticament buidi la cache cada cop o cridar al mètode de neteja de cache explícitament des de la capa superior. A les funcions INS/UPD/DEL es posa el següent tros de codi:
if (TeCache && AutoNetejaCache)
{
ClearCache();
}
La clsDades té la funció ClearCache per tal que es pugui netejar explícitament la cache.
public void ClearCache()
{
bool LocalConn;
SqlCommand SqlComm = new SqlCommand();
SqlConnection Conn = null;
if (SQLConn == null)
{
LocalConn = true;
Conn = new SqlConnection(CadConnBBDD);
Conn.Open();
}
else
{
LocalConn = false;
Conn = SQLConn;
}
SqlComm.Connection = Conn;
if (SQLTrans != null) SqlComm.Transaction = SQLTrans;
SqlComm.CommandType = CommandType.StoredProcedure;
SqlComm.CommandText = SP_Cache;
SqlParameter SqlParam = new SqlParameter();
SqlParam.SqlDbType = SqlDbType.VarChar;
SqlParam.Size = 50;
SqlParam.Direction = ParameterDirection.Input;
SqlParam.ParameterName = "pTaula";
SqlParam.Value = NomTaula;
SqlComm.Parameters.Add(SqlParam);
SqlParam = new SqlParameter();
SqlParam.SqlDbType = SqlDbType.VarChar;
SqlParam.Size = 500;
SqlParam.Direction = ParameterDirection.Input;
SqlParam.ParameterName = "pURL";
SqlParam.Value = DBNull.Value;
SqlComm.Parameters.Add(SqlParam);
SqlParam = new SqlParameter();
SqlParam.SqlDbType = SqlDbType.VarChar;
SqlParam.Size = 50;
SqlParam.Direction = ParameterDirection.Input;
SqlParam.ParameterName = "pGridID";
SqlParam.Value = DBNull.Value;
SqlComm.Parameters.Add(SqlParam);
SqlComm.ExecuteNonQuery();
if (LocalConn)
{
Conn.Close();
Conn.Dispose();
Conn = null;
}
}
|