Yo diría que, si su inserción/actualización/eliminación modifica el contenido de una de esas listas, debe volver a consultar la lista. Tengo algunas tablas de datos en caché en mi aplicación, y utilizo una colección de la estructura a continuación para mantenerlas. De esta forma, es fácil borrar todo el caché, y cuando solicito una tabla de datos en particular, verifico si existe uno en el caché que no ha expirado.
Protected Structure CachedDT
#Region "Local Variables"
Public TheDT As DataTable
Public TheExpirationTime As DateTime
Public TheUniqueIdentifier As String
#End Region 'Local Variables
End Structure
Protected cCachedDTs As Dictionary(Of String, CachedDT) = New Dictionary(Of String, CachedDT)
Viven en mi clase base para los objetos que consultan las bases de datos. Un ejemplo del uso de las tablas de datos almacenadas en caché es:
<System.Diagnostics.DebuggerStepThrough> _
Public Overrides Function GetPermissionsSystem(ByVal SystemUserName As String) As DataTable
Try
Dim oCmd As New SqlCommand
Dim aDpt As New SqlDataAdapter
Dim aDst As New DataSet
Dim theCached As CachedDT
Dim theCacheName As String = "GetPermissionsSystem|" & SystemUserName
If cCachedDTs.ContainsKey(theCacheName) Then
theCached = cCachedDTs.Item(theCacheName)
If theCached.TheExpirationTime < DateTime.Now Then
cCachedDTs.Remove(theCacheName)
Else
Return theCached.TheDT
End If
End If
With oCmd
.Connection = MyBase.Conn
.CommandType = CommandType.StoredProcedure
.CommandTimeout = MyBase.TimeoutShort
.CommandText = Invoicing.GetPermissionsSystem
.Parameters.Add(GP("@SystemUserName", SystemUserName))
End With
aDpt.SelectCommand = oCmd
aDpt.Fill(aDst)
theCached = New CachedDT
With theCached
.TheUniqueIdentifier = theCacheName
.TheExpirationTime = DateTime.Now.AddSeconds(10)
.TheDT = aDst.Tables(0)
End With
cCachedDTs.Add(theCached.TheUniqueIdentifier, theCached)
Return aDst.Tables(0)
Catch sqlex As SqlException
MyBase.HandelEX(sqlex)
Catch ex As Exception
MyBase.HandleEX(ex)
Finally
MyBase.CloseConn()
End Try
End Function
En el ejemplo anterior, la función comprueba la caché para ver si existe un objeto apropiado. Si lo hace, se devuelve en lugar de golpear la base de datos de nuevo. Al final, el objeto nuevo se agrega a la memoria caché.
Todo lo que tendrías que hacer sería proporcionar algunos medios para eliminar una lista en particular del caché. Luego, cuando hagas una inserción/actualización/eliminación, asegúrate de borrar el ítem apropiado.
Buenas preguntas de seguimiento. –
"¿Pueden los datos estar rancios? Si es así, ¿cuánto tiempo?": Tal vez 1 hora, tal vez 1 año. El principal problema proviene de un dominio comercial volátil. – boj