Artigo
· 19 hr atrás 2min de leitura

EnsLib.SQL.Snapshot não é limpo durante a depuração de mensagens quando é usado na mensagem de resposta.

Olá a todos,

Primeiro quero reconhecer @Theo Stolker e @Rupert Young, porque eles me ajudaram com a solução.

Quando vocês usam EnsLib.SQL.Snapshot como uma propriedade na mensagem de resposta para retornar dados do Snapshot (por exemplo, de uma Business Operation para um Business Process), os dados do Snapshot não são limpos com a tarefa/serviço de depuração de mensagens.

Class ResponseMessage Extends Ens.Response

{

    Property SnapshotProp As EnsLib.SQL.Snapshot;

}

Os dados ficarão presos no global: ^Ens.AppData. Vocês podem encontrá-los com esta consulta em System > Globals: ^Ens.AppData("EnsLib.SQL.Snapshot",

A referência é registrada na classe: EnsLib.SQL.Snapshot. Vocês podem consultá-la com SQL: SELECT * FROM EnsLib_SQL.Snapshot ORDER BY ID asc

Esses dados não serão eliminados durante a tarefa de depuração. Portanto, os dados irão crescendo com o tempo. Quando vocês tiverem esse problema, podem limpar todos os dados manualmente com o seguinte método:

  • Limpar a Global: ^Ens.AppData:
    • Pare a produção
    • Executem= no terminal (certifique-se de estar no NameSpace correto): do ##class(Ens.Adapter).ClearStaticAppData("EnsLib.SQL.Snapshot"
    • Reinicie a produção
  • Limpar EnsLib_SQL.Snapshot:
    • Elimine os dados com o SQL: TRUNCATE TABLE EnsLib_SQL.Snapshot

Mas isso não é o ideal, especialmente em ambiente de produção (PRD).

Solução:

Esse problema só ocorre quando os dados são retornados de uma BO para uma BP, ou talvez de uma BP para uma BS, já que a ideia é a mesma.

Uma solução é não usar EnsLib_SQL.Snapshot como propriedade na mensagem de retorno, mas mapear os dados para outro tipo de objeto (por exemplo: JSON como string, ou outros tipos de classe).

Outra solução é fazer com que a tarefa de depuração elimine os dados do Snapshot usando o método %OnDelete:

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

Assim:

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 isso ajude vocês tanto quanto me ajudou!

PS: Publicação relacionada: https://community.intersystems.com/post/setting-enslibsqlsnapshot-vs-enslibsqlsnapshotclean

Discussão (0)1
Entre ou crie uma conta para continuar