Question

J'ai eu un comportement extrêmement bizarre où les requêtes NHibernate commencent à se bloquer. J'ai réalisé un projet de démonstration présentant ce comportement de manière répétable.

Vous pouvez télécharger le projet ici

.

Voici le code incriminé:

    public IList<Post> GetLatestLiveBlogEntries(int numEntriesToRetrieve)
    {
        var maxDate = DateTime.Now;

        using (var session = SessionManager.OpenSession())
        {
            var crit = session.CreateCriteria(typeof (Post))
                .Add(Restrictions.Eq("Enabled", true))
                .Add(Restrictions.Lt("postDate", maxDate))
                .AddOrder(new Order("postDate", false))
                //.SetFetchMode("author", FetchMode.Eager) // <-- the exclusion of this line breaks everything!
                .SetMaxResults(numEntriesToRetrieve);

            StupidFileLogger.Log("If this is the last log, I'm hanging on crit.List<Post>()");
            var listOfPosts = crit.List<Post>();
            StupidFileLogger.Log("I actually was able to retrieve the posts");
            return listOfPosts;
        }
    }

La ligne de clé est le .SetFetchMode sur le champ auteur. Lors du premier chargement de mon projet de démonstration, tout se passe bien. Lorsque je clique sur l'actualisation, il se bloque et ne dépasse jamais l'appel à crit.List (). Avec un chargement rapide, cela fonctionne à chaque fois.

J'utilise Castle.Facilities.NHibernateIntegration.Components.SessionWebModule pour garantir une session par demande.

L’autre chose étrange que j’ai trouvée est que cela ne se produit que dans SQL Server. Quand j'utilise SQLite, tout fonctionne bien. Dans mon projet de démonstration, j'ai un simple indicateur de construction qui vous permet de changer facilement de base de données. Il suffit de regarder local.properties.xml dans le répertoire / build.

Je comprends que le chargement avec impatience résout mon problème dans ce cas particulier, mais dans mon application, je ne veux pas avoir à tout charger avec impatience.

Téléchargez la solution et essayez vous-même. Je l'ai essayé sur d'autres machines et elles font la même chose.

Voici quelques captures de SQL Profiler. Vous pouvez voir que la requête pour les publications a été envoyée au serveur, mais elle s’arrête là:

Première demande (se comporte comme prévu):

bonne demande http://muc-central.com/misc/good_request.jpg

Deuxième demande (se bloque):

texte alt http://muc-central.com/misc/hanging_request.jpg

Était-ce utile?

La solution 2

J'ai corrigé le blocage en passant à LinFu proxyfactory.factory_class. Je ne sais pas pourquoi cela fonctionne et Castle non. Pour en savoir plus sur les procurations dynamiques et déterminer le type de rapport de bogue à soumettre.

Autres conseils

Eh bien, je suppose que cela fonctionne sur un serveur Windows, je ne connais donc pas l'équivalent de htop, mais je vous parie qu'il y a un interblocage quelque part dans la base de données / le code de session et que vous devriez pouvoir vérifier l'état du thread pour voir si chaque fil est en attente.

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