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
- Microsoft ASP.NET Session State provider for SQL Sever In-Memory
https://www.nuget.org/packages/Microsoft.Web.SessionState.SqlInMemory
Al descargar
- El assembly Microsoft.Web.SessionState.SqlInMemory.dll (v 12.0.4100.301) en esta versión de Nuget que es la 1.0.1
Ya referenciado en nuestro proyecto
- 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
El contenido
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 - 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> - 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
- New: ASP.NET Session State Provider for SQL Server In-Memory OLTP
http://blogs.technet.com/b/dataplatforminsider/archive/2014/07/10/new-asp-net-session-state-provider-for-sql-server-in-memory-oltp.aspx
Mas información
- SQL Server In-Memory OLPT
http://www.microsoft.com/en-us/server-cloud/solutions/in-memory.aspx - Requisitos para utilizar las tablas con optimización para memoria
http://msdn.microsoft.com/es-es/library/dn170449.aspx - Modos de estado de session
http://msdn.microsoft.com/es-es/library/vstudio/ms178586.aspx