Question

Je l'ai utilisé une version de verrouillage revérifié dans mon application CF (avant que je savais ce qui était verrouillage revérifié).

Pour l'essentiel, je vérifie pour l'existence d'un objet. Si ce n'est pas présent, je fermerai (généralement à l'aide d'un verrou nommé) et avant que j'essayer de créer l'objet que je vérifie à nouveau pour existance. Je pensais que c'était une belle façon d'arrêter plusieurs objets créés et arrêter le verrouillage excessif dans le système.

Cela semble fonctionner dans la mesure où il n'y a pas trop de doublons de verrouillage et l'objet ne sont pas créés. Cependant, je l'ai appris récemment que revérifié verrouillage travail dosn't en Java , ce que je ne sais pas si cela est est vrai dans CF, car les discussions des FC et les serrures ne sont pas tout à fait les mêmes que les fils de Java natifs et serrures.

Pas de solution correcte

Autres conseils

Pour ajouter à ce que Ben Doom dit au sujet de Java, cette pratique est assez standard dans ColdFusion, en particulier avec une routine d'initialisation de l'application où vous configurez vos variables d'application.

Sans avoir au moins un verrou, vous laissez les coups initiaux à votre application web initialiser toutes les variables d'application en même temps. Cela suppose que votre demande est assez occupé pour justifier cela. Le danger est là seulement si votre application est occupée au moment où votre demande est d'abord en cours de démarrage.

Le premier verrou assure une seule demande à la fois vos variables initialise.

Le deuxième verrou, intégré dans le premier, va vérifier pour vous assurer une variable définie à la fin de votre code d'initialisation existe, comme application.started. Si elle existe, l'utilisateur est expulsé.

Le modèle à double verrouillage a sauvé ma peau sur les sites occupés, mais avec des sites très occupés, la file d'attente des demandes de succès à la réalisation complète peut grimper trop haut, trop vite de l'application, et provoquer une panne du serveur. L'idée est, les demandes sont en attente pour le premier coup, ce qui est lent, le deuxième casse dans la première cflock, et est rapidement rejeté. Avec des centaines ou des milliers de demandes dans la file d'attente, de plus en plus chaque milliseconde, ils sont tous canalisaient vers le bas au premier bloc de cflock. La solution est de définir un délai très faible sur le premier cflock et ne pas jeter (ou attraper et canard) l'erreur de délai de verrouillage.

Comme note finale, ce comportement que je décrit a été désapprouvée avec onApplicationStart () de ColdFusion 7 méthode de votre Application.cfc. Si vous utilisez onApplicationStart (), alors vous ne devriez pas être tout le verrouillage de votre routine demande init. Application.cfc est bien verrouillé déjà.

Pour conclure, oui, double vérification du verrouillage dans ColdFusion. Il est utile dans quelques certaines circonstances, mais faites-le droit. Je ne connais pas les schémas de pourquoi cela fonctionne, par opposition au modèle de thread Java, les chances sont qu'il est une sorte de vérifier manuellement la table de consultation en arrière-plan de votre serveur ColdFusion.

Java est threadsafe, il est donc pas tant que vos serrures ne fonctionneront pas qu'ils ne sont pas nécessaires. En fait, en CF 6+, les verrous sont nécessaires pour prévenir des conditions de course ou de créer / althering objets qui existent en dehors du contrôle de Java (fichiers, par exemple).

Pour ouvrir un tout autre boîte de Pandore ...

Pourquoi ne pas utiliser une bibliothèque d'injection de dépendance, comme COLDSPRING, de garder une trace de vos objets et éviter les dépendances circulaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top