Artículo
· 10 hr atrás Lectura de 2 min

EnsLib.SQL.Snapshot no se limpia durante la depuración de mensajes cuando se utiliza en el mensaje de respuesta

Hola a todos,

Primero quiero reconocer a @Theo Stolker y @Rupert Young, porque me ayudaron con la solución.

Cuando usáis EnsLib.SQL.Snapshot como una propiedad en el mensaje de respuesta para devolver datos de Snapshot (por ejemplo, desde una Business Operation a un Business Process), los datos del Snapshot no se limpian con la tarea/servicio de depuración de mensajes.

Class ResponseMessage Extends Ens.Response

{

    Property SnapshotProp As EnsLib.SQL.Snapshot;

}

Los datos quedarán atascados en el global: ^Ens.AppData. Podéis encontrarlos con esta consulta en System>Globals: ^Ens.AppData("EnsLib.SQL.Snapshot",

La referencia se registra en la clase: EnsLib.SQL.Snapshot. Podéis consultarla con SQL: SELECT * FROM EnsLib_SQL.Snapshot ORDER BY ID asc

Estos datos no se eliminarán durante la tarea de depuración. Por lo tanto, los datos irán creciendo con el tiempo. Cuando tengáis este problema, podéis limpiar todos los datos manualmente con el siguiente método:

  • Limpiar el Global: ^Ens.AppData:
    • Detened la producción
    • Ejecutad en el terminal (aseguraos de estar en el NameSpace correcto): do ##class(Ens.Adapter).ClearStaticAppData("EnsLib.SQL.Snapshot"
    • Iniciad de nuevo la producción
  • Limpiar EnsLib_SQL.Snapshot:
    • Eliminad los datos con SQL: TRUNCATE TABLE EnsLib_SQL.Snapshot

Pero esto no es lo ideal, especialmente en el entorno de producción (PRD).

Solución:

Este problema solo ocurre cuando se devuelven datos desde una BO a una BP, o quizá desde una BP a una BS, ya que la idea es la misma.

Una solución es no usar EnsLib_SQL.Snapshot como propiedad en el mensaje de retorno, sino mapear los datos a otro tipo de objeto (por ejemplo: JSON como cadena, u otros tipos de clase).

Otra solución es hacer que la tarea de depuración elimine los datos del Snapshot mediante el método %OnDelete:

https://docs.intersystems.com/irislatest/csp/docbook/Doc.View.cls?KEY=GOBJ_callbacks#GOBJ_cb_ondelete

Así:

Class ResponseMessage Extends Ens.Response
{

    Property SnapshotProp As EnsLib.SQL.Snapshot;

   ClassMethod %OnDelete(oid As %ObjectIdentity) As %Status [ Private, ServerOnly = 1 ]
   {
      set id = $$$oidPrimary(oid)
      set obj = ..%OpenId(id)
    
      return ##class(EnsLib.SQL.Snapshot).%DeleteId(obj.SnapshotProp.%Id())
   }

}

¡Espero que os ayude tanto como me ha ayudado a mí!

PD: Publicación relacionada: https://community.intersystems.com/post/setting-enslibsqlsnapshot-vs-enslibsqlsnapshotclean

Comentarios (0)1
Inicie sesión o regístrese para continuar