Rechercher dans ce blog

vendredi 8 janvier 2010

Datasources: Pertes de connection

Un problème récurant que je vois dans les applications WEB est la perte de connexion à la base de données. Une solution pour détecter les fuites, utilisée dans mes projets, est de fournir un contrôleur WEB qui, en fonction de paramètres, indique l'état des datasources. C'est utile en dev, mais surtout en prod, lorsqu'on a une fuite qui ne se produit qu'en prod, et que l'on souhaite voir l'état des datasources, mais que l'on n'a pas d'accès JMX ou wlst.

En pratique, j'ai un contrôleur Spring dans lequel j'injecte mes datasources.
L'étape suivante est de récupérer le vrai objet Datasource:

   public static BasicDataSource getBasicDataSource(DataSource dataSource) {
        Object obj = dataSource;

        // Try to get proxied instance
        Method method = ReflectionUtils.findMethod(dataSource.getClass(),
                "getTargetSource");
        if (method != null) {
            obj = ReflectionUtils.invokeMethod(method, dataSource);
        }

        // Try to get proxied instance
        if (obj instanceof JndiObjectTargetSource) {
            JndiObjectTargetSource source = (JndiObjectTargetSource) obj;
            obj = source.getTarget();
        }

        if (obj instanceof BasicDataSource) {
            BasicDataSource bds = (BasicDataSource) obj;
            return bds;
        }
        return null;
    }

   
Ensuite, j'écrit les paramètres dans la réponse HTTP, au format JSON:


Cette solution permet d'afficher le nombre de connexions actives, et le format JSON permet de le parser par un script, par exemple pour l'integrer dans Nagios ou autre système d'alerte.

Pour chercher des connection leaks, je recommande l'utilisation de l'excellent FindBugs.

Aucun commentaire:

Enregistrer un commentaire