Pergunta

Estamos usando o TIBCO EMS do nosso aplicativo ASP.NET 3.5 para uma interface com um sistema externo, e parece estar funcionando muito bem - exceto que os caras que executam o outro lado nos dizem que estamos acumulando conexões como loucos e nunca fechando-os....

O que estou fazendo é rotear todo o tráfego TIBCO através de uma única classe com variáveis ​​de membro estáticas para ambos TIBCO ConnectionFactory e a Connection em si, tendo sido informado de que construí-los consome muitos recursos e tempo:

private static ConnectionFactory Factory
{
    get
    {
        if (HttpContext.Current.Application["EMSConnectionFactory"] == null)
        {
           ConnectionFactory connectionFactory = CreateTibcoFactory();
           HttpContext.Current.Application["EMSConnectionFactory"] = connectionFactory;
        }

        return HttpContext.Current.Application["EMSConnectionFactory"] as ConnectionFactory;
    }
}

private static Connection EMSConnection
{
    get
    {
        if (HttpContext.Current.Application["EMSConnection"] == null)
        {
           Connection connection = Factory.CreateConnection(*username*,  *password*);
           connection.ExceptionHandler += new EMSExceptionHandler(TibcoConnectionExceptionHandler);
           connection.Start();
           HttpContext.Current.Application["EMSConnection"] = connection;
        }

        return HttpContext.Current.Application["EMSConnection"] as Connection;
     }
 }

Agora meu problema é:onde e como eu poderia

  • diga à conexão TIBCO para "fechar automaticamente" quando não for mais necessário (como com o SqlConnection)
  • feche a conexão TIBCO em caso de erro
  • feche a conexão TIBCO antes que nosso aplicativo ASP.NET termine (ou o usuário faça logoff)

Eu realmente não pareço encontrar muitas informações úteis sobre como usar o TIBCO EMS do mundo C#/.NET......algum comprador??Obrigado!!

Foi útil?

Solução

Em primeiro lugar, não entendo como você pode estar ficando sem conexões.Como você está armazenando a conexão no aplicativo, você deve ter apenas uma conexão para todo o aplicativo IIS.

Deixando isso de lado, eu faria o seguinte:

  • Quando a conexão for recuperada, crie-a como você faz agora;
  • Depois de criar a conexão, crie um thread em segundo plano;
  • Definir um DateTime para DateTime.Now;
  • Deixe a verificação de antecedentes (por exemploa cada segundo ou a cada 10 segundos) qual é a diferença entre a data que você definiu e DateTime.Now.Se for maior que um tempo limite específico, interrompa a conexão e defina Application["EMSConnectionFactory"] para nulo;
  • Quando o thread de segundo plano encerrar a conexão, feche o thread de segundo plano;
  • Cada vez que a conexão for solicitada, redefina o DateTimetoDataHora.Agora`.

Desta forma, as conexões deverão ser fechadas automaticamente.

Observe que você terá que introduzir o bloqueio.Você pode usar Application.Lock() e Application.Unlock() por esta.

Em relação ao fechamento em caso de erro:Vejo que você anexou um manipulador de exceções à instância de conexão.Você não pode fechar a conexão com isso?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top