Domanda

Ho avuto un comportamento estremamente bizzarro in cui le query di NHibernate iniziano a bloccarsi. Ho realizzato un progetto dimostrativo che mostra questo comportamento in modo ripetibile.

Puoi scaricare il progetto qui

Ecco il codice offensivo:

    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 linea chiave è .SetFetchMode nel campo dell'autore. Al primo caricamento del mio progetto demo si carica bene. Quando premo refresh, si blocca e non supera mai la chiamata crit.List (). Con il caricamento desideroso funziona sempre.

Sto usando Castle.Facilities.NHibernateIntegration.Components.SessionWebModule per garantire 1 sessione per richiesta.

L'altra cosa bizzarra che ho trovato è che ciò accade solo con SQL Server. Quando uso SQLite tutto funziona bene. Nel mio progetto demo ho un semplice flag di costruzione che ti permette di cambiare facilmente i db. Guarda local.properties.xml nella directory / build.

Comprendo che il caricamento impaziente risolve il mio problema in questo caso particolare, ma nella mia applicazione non voglio caricare impazientemente tutto.

Scarica la soluzione e prova tu stesso. L'ho provato su altre macchine e fanno la stessa cosa.

Ecco alcune acquisizioni di SQL Profiler. Puoi vedere che la query per Posts è stata inviata al server, ma si ferma qui:

Prima richiesta (si comporta come previsto):

buona richiesta http://muc-central.com/misc/good_request.jpg

Seconda richiesta (blocco):

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

È stato utile?

Soluzione 2

Ho risolto il problema passando a LinFu proxyfactory.factory_class. Non ho idea del perché funzioni e Castle no. Scopriremo di più sui proxy dinamici e scopriremo quale tipo di segnalazione di bug dovrei inviare.

Altri suggerimenti

Bene, suppongo che questo sia in esecuzione su un server Windows, quindi non conosco l'equivalente di htop ma scommetto che c'è un deadlock da qualche parte nel codice del database / sessione e dovresti essere in grado di controllare lo stato del thread per vedere se ogni thread è nello stato di attesa.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top