[ASPNET] Nuevo proveedor de Session State para SQL Server 2014 In-Memory OLTP : SqlInMemoryProvider

Si estas utilizando SQL Server 2014 en proyectos ASP.NET (Webforms/MVC) y necesitas que el Estado de Sesión deba ser guardado en la DB, existe una mejora para el proveedor nativo de SQL Server para utilizar In-Memory OLTP para mejor rendimiento y escalabilidad, que básicamente es un proveedor personalizado realizado por el mismo equipo de SQL Server que utiliza esta característica propia de SQL Server 2014.

Vemos los pasos y artefactos que necesitamos

  • SQL Server 2014 que soporte In-Memory OLTP (Ver requisitos)
  • Crear la DB para guardar las “sesiones de nuestra app” con características de MEMORY_OPTIMIZED_DATA para que las tablas creadas tengan esta propiedad habilitada MEMORY_OPTIMIZED=ON
  • Modificar nuestro web.config para que utilice el proveedor personalizado
  • Crear una tarea en el SQL para limpiar las sessiones expiradas con el procedimiento dbo.DeleteExpiredSessions

Para todo existe un paquete de Nuget que nos provee cada parte

SNAGHTML45a7787

Al descargar

  1. El assembly Microsoft.Web.SessionState.SqlInMemory.dll (v 12.0.4100.301) en esta versión de Nuget que es la 1.0.1
    image
    Ya referenciado en nuestro proyecto
    SNAGHTML4b97249
  2. El script de creación de la DB y objetos necesarios (tablas, procedimientos)
    NOTA: Lo agrega en la carpeta raiz del proyecto acuérdate de luego eliminarlo ASPStateInMemory.sql
    Pero también se encuentra disponible en la carpeta de paquetes de Nuget del proyecto/solución packagesMicrosoft.Web.SessionState.SqlInMemory.1.0.1content

    SNAGHTML4bb08a8
    El contenido
    SNAGHTML4be3363
    Que lo que tiene de particular que se crea un grupo de archivos para MEMORY_OPTIMIZED_DATA y las tablas con creadas con la propiedad MEMORY_OPTIMIZED=ON

  3. La transformación para el web.config para la sección de sessionState
    Que cuando lo modifica a nuestro web.config debemos ir a cambiar el connectionString 
    NOTA: Una mejora que soporte connectionStringName (para indicar ya una conexión existente y no replicarla/mantenerla)
    Lo que puedes ver aquí:
    <?xml version="1.0" encoding="utf-8"?> 
    <configuration>
    <system.web>
    <sessionState mode="Custom" customProvider="SqlInMemoryProvider">
    <providers>
    <add name="SqlInMemoryProvider"
    type="Microsoft.Web.SessionState.SqlInMemoryProvider"
    connectionString="data source=sqlserver;initial catalog=ASPStateInMemory;User ID=user;Password=password;" />
    </providers>
    </sessionState>
    </system.web>
    </configuration>

  4. Limpiar periódicamente las sessiones que expiran

    Debes también crear una tarea en el SQL para limpiar las sessiones expiradas con el procedimiento dbo.DeleteExpiredSessions

 

Fuente

Mas información