Pregunta

Estamos utilizando TIBCO EMS de nuestra ASP.NET 3.5 aplicación para una interfaz a un sistema externo, y parece estar funcionando muy bien - excepto que los chicos corriendo el otro lado nos dice que estamos acumulando como conexiones loco y nunca cerrarlos ....

Lo que estoy haciendo es encaminar todo el tráfico de TIBCO través de una única clase con variables miembro estáticas, tanto para el ConnectionFactory TIBCO y el propio Connection, después de haber sido dijo que la construcción de ellos es bastante recursos y de tiempo intensivo:

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;
     }
 }

Ahora mi problema es: ¿dónde y cómo podría

  • decir la conexión de TIBCO para "cierre automático" cuando ya no sean necesarios (como con el SqlConnection)
  • cerrar la conexión TIBCO en un error
  • cerrar la conexión TIBCO ante nuestros acabados de aplicaciones ASP.NET (o el usuario inicia sesión off)

No me parece realmente encontrar mucha información útil sobre cómo utilizar TIBCO EMS del mundo C # / .NET ...... ningún arrendatario ?? Gracias !!

¿Fue útil?

Solución

En primer lugar, no entiendo cómo se puede estar quedándose sin conexiones. Puesto que usted está almacenando la conexión en la aplicación, sólo debe tener una sola conexión para la totalidad de IIS aplicación.

Eso dejó a un lado, yo haría lo siguiente:

  • Cuando se recupera la conexión, crear la conexión como lo hace ahora;
  • Después de crear la conexión, girar un hilo de fondo;
  • Establecer un DateTime a DateTime.Now;
  • Deja que la verificación de antecedentes (por ejemplo, cada segundo o cada 10 segundos) cuál es la diferencia entre la fecha que ha establecido y DateTime.Now. Si eso es más largo que un tiempo de espera determinado, matar a la conexión y ajuste de Application["EMSConnectionFactory"] a nula;
  • Cuando el subproceso de fondo mata la conexión, cierre el hilo de fondo;
  • Cada vez que se solicita la conexión, restablecer el DateTimetoDateTime.Now`.

De esta manera, las conexiones debe cerrarse automáticamente.

Tenga en cuenta que tendrá que introducir de bloqueo. Puede utilizar Application.Lock() y Application.Unlock() para esto.

En cuanto a cerrar en un error: Veo que se encuentra conectado un controlador de excepciones a la instancia de conexión. ¿No puedes cerrar la conexión con eso?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top