No concebible; puedes crear miembros estáticos. PERO, deben marcarse como readonly
para ensamblajes que tengan un PERMISSION_SET
de SAFE
o EXTERNAL_ACCESS
. Solo un ensamblaje marcado como UNSAFE
puede tener miembros estáticos grabables. Y esta restricción se debe a la naturaleza misma de los miembros estáticos: son compartidos entre subprocesos y sesiones.
Un conjunto se carga la primera vez que se accede a un método dentro de él. Se comparte para todas las sesiones, por lo que solo se puede acceder a los métodos estáticos. La idea es escribir funciones, no una aplicación, por lo que no hay mucho uso para mantener el estado. Y puede conducir fácilmente (aunque no siempre) a un comportamiento impredecible si varias sesiones se sobreescriben entre sí. Por lo tanto, no se maneja la concurrencia en absoluto, a menos que usted mismo escriba esa parte.
Se espera que una vez cargada, la clase (y el dominio de aplicación en el que reside) permanezca en la memoria hasta que se reinicie el servicio SQL Server o se cambie el valor PERMISSION_SET
. Pero esto no está garantizado. De acuerdo a esta página, Memory Usage in SQL CLR:
cuando hay presión de memoria en el servidor, SQL CLR va a tratar de liberar la memoria mediante la recolección de basura se ejecuta de forma explícita y, si es necesario, descargando dominios de aplicación.
Así que son correctas en ambos casos con respecto a los miembros estáticos:
- que pueden ser utilizados para el almacenamiento en caché (muy fresco)
- que pueden ser más peligrosos:
- que puede causar inesperado comportamiento
- pueden acumular memoria ya que no existe un mecanismo inherente o evento natural para limpiarlos porque la clase se mantiene activa.
Y, la cantidad de memoria disponible para las rutinas CLR varía mucho dependiendo de si SQL Server es de 32 o 64 bits, y si está utilizando SQL Server 2005/2008/2008 R2 o el uso de SQL Server 2012/2014. Para obtener más información sobre la cantidad de memoria que SQLCLR tiene para jugar, consulte SQL Server 2012 Memory y Memory Usage in SQL CLR (igual que el primer enlace, publicado arriba de la cita).
Espero que no, pero me gustaría ver un "sí" o un "no" definitivo específicamente para SQL Server (que es definitivamente más restringido que un runtime .NET típico) –
@CraigWalker and Tamas: Con respecto a la declaración sobre " sí, estos objetos estáticos permanecen allí siempre que la base de datos no se detenga o reinicie ", eso no es cierto.AppDomains se puede descargar por una variedad de razones, incluyendo: ** 1) ** automáticamente debido a la presión de la memoria, ** 2) ** cuando la configuración de seguridad del ensamblaje o la base de datos cambia, ** 3) ** si alguien EXECs ' DBCC DROPSYSTEMBUFFERS ('ALL') 'y ** 4) ** tal vez 1 o 2 formas más. –