Auto-cierre conexiones TIBCO EMS cuando ya no sean necesarios
-
26-09-2019 - |
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 !!
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
aDateTime.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 deApplication["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 DateTime
to
DateTime.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?