26 messaggi dal 23 luglio 2013
Buongiorno a tutti, probabilmente e' una domanda banale ma, anche a voi la prima query con entity framework in code first dura un infinità? (anche 20 secondi!). Leggo in giro opinioni varie ma qual e' l'approccio risolutivo migliore?
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Alex,
può darsi che in quei 20 secondi Entity Framework stia ricreando il database; dipende da quale initializer hai impostato.


Fintanto che sei in sviluppo, prova ad impostare esplicitamente il DropCreateDatabaseIfModelChanges<TuoDbContext>, in modo che il Db venga creato solo quando è necessario, ovvero quando cambi qualcosa nelle classi del tuo modello. Leggi qui:
http://fringan.blogspot.it/2012/04/note-to-self-dropcreatedatabaseifmodelc.html

Ovviamente non dovrai usarlo quando metti l'applicazione in produzione, altrimenti, al minimo cambiamento, il tuo db (e tutti i dati contenuti all'interno) diventeranno fubar.

ciao,
Moreno

Enjoy learning and just keep making
26 messaggi dal 23 luglio 2013
Ciao Moreno, purtroppo non cambia nulla anche modificando l'inizializer, sembra proprio che la prima query sia lentissima, leggevo qui: http://stackoverflow.com/questions/3891125/entity-framework-first-query-slow che pare sia dovuto al caricamento dei meta-data iniziali. Mi sono generato anche delle pre-generated views ed ho adottato accortezze tipo AsNoTracking, ProxyCreationEnabled = false, AutoDetectChangesEnabled = false e LazyLoadingEnabled = false ma nulla. Le query successive solo fulminee (anche con parametri diversi) ma la prima rimane eterna! In oltre, se dopo le prime query attendo diversi minuti, la prima ritorna ad essere lenta! Che sia qualcosa sul server? Uso un serverino muletto con windows server 2012 ed il progetto sull'iis è always running.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,
con le pregenerated views dovresti notare qualche miglioramento. Hai usato i Power Tools oppure questo template T4?

Mi chiedo se non ci sia anche qualche altra causa ad influenzare il tempo di attesa. Fai questo piccolo test: quando lanci l'applicazione in debug, fai aprire una pagina che non accede al database. Poi, naviga verso una pagina che invece fa uso del DbContext e misura il tempo di attesa.
Vorrei escludere che i 20 secondi siano dovuti anche a qualche altro codice di bootstrapping dell'applicazione.

Di quante classi di entità è composto il tuo modello, approssimativamente? Nella discussione di StackOverlow che hai citato, in uno dei commenti si legge di un contesto composto di 1500 entità. E' ovvio che in quel caso ci sarà per forza un tempo di attesa ma mi chiedo se sia veramente opportuno e necessario tirare in ballo tutte quelle entità. Si possono anche delineare modelli diversi, magari uno per ogni bounded context.

AlexTO ha scritto:

windows server 2012

Anche se non riuscissi ad abbattere il tempo di avvio dell'applicazione, potresti configurare IIS 8 per avviare l'applicazione automaticamente, in modo che sia subito pronta per quando invierai la tua prima richiesta.

Leggi qui:
http://blogs.msdn.com/b/vijaysk/archive/2012/10/10/iis-8-what-s-new-application-pool-settings.aspx

ciao,
Moreno

Enjoy learning and just keep making
26 messaggi dal 23 luglio 2013
Ho usato i power tools ma non ho trovato un reale guadagno, in effetti c'è da dire che le entità sono anche poche (18) ma è stato indicativo per verificare se fossero quelle, e pare non lo siano perche' anche con una sola mi fa lo stesso scherzo! Quando lancio il progetto a debug e navigo in pagine che non usano il db i tempi vanno da 1 a 2 secondi massimi mentre se clicco su quelle con accesso al db devo attendere 20 secondi (a volte anche 30). Atteso questo tempo tutto diventa magicamente performante e rapido e questo mi andrebbe bene se non fosse che dopo diversi minuti di inattivita' (forse una trentina, non ho capito ancora bene quanti) la prima query non ritornasse lenta.
Non so se possono essere utili alcune informazioni tipo:
- per il debug locale uso un db remoto in lan
- ho provato a popolare una griglia con una query attraverso la via classica (SqlConnection, SqlCommand, ecc...) e tutto mi è sembrato reattivo
- come package EF uso la 6.1.3

A questo punto mi sa che provero' a spostare il tutto su db locale come ulteriore prova. Altra cosa, con un precedente progetto questa cosa non mi accadeva ma qui usavo InitializeDatabaseConnection di WebSecurity in Global.asax poiche' avevo bisogno di autenticare utenti. Faccio qualche prova...
26 messaggi dal 23 luglio 2013
Ho provato su db locale ed il problema non si presenta, 3 secondi circa per il primo accesso!!! Diciamo che non essendo il server di produzione la cosa mi solleva, curioso però che via sql standard non accada nulla di simile. IIS e' always running (quindi non dovrebbe andare mai in pausa) ed sql server in high priority... ad ogni modo anche se in parte l'arcano e' "risolto" rimane la curiosità.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Alex,
grazie, hai esposto il problema in maniera molto dettagliata. Così è più semplice rispondere.

AlexTO ha scritto:

ho provato a popolare una griglia con una query attraverso la via classica (SqlConnection, SqlCommand, ecc...) e tutto mi è sembrato reattivo

E' strano perché, da quello che hai descritto, il problema sembra essere nel tempo di ottenimento di una connessione. Sia ADO.NET "nudo" che EF ne sono soggetti e quindi mi sarei aspettato la stessa latenza.

AlexTO ha scritto:

Atteso questo tempo tutto diventa magicamente performante e rapido

Sì perché, quando chiudi una connessione, in realtà non viene distrutta, ma torna nel pool e viene "resettata" per essere subito pronta per un altro client.

Escluderei il tempo di startup di EF, perché 18 entità non sono sufficienti a giustificare quel ritardo di 20 secondi. Del resto il ritardo è sparito quando hai provato ad usare un db locale.

AlexTO ha scritto:

mi andrebbe bene se non fosse che dopo diversi minuti di inattivita' (forse una trentina, non ho capito ancora bene quanti) la prima query non ritornasse lenta.

Può darsi che la connessione presente nel pool sia stata chiusa per timeout. Giusto per curiosità, proverei a capire se dipende effettivamente dal tempo di ottenimento della connessione. Proviamo a disabilitare il connection pooling; aggiungi questo alla tua connection string:
Pooling=false

Se è vero, a questo punto ogni richiesta dovrebbe richiedere 20 secondi.

ciao,
Moreno

Enjoy learning and just keep making
26 messaggi dal 23 luglio 2013
Sembra incredibile ma ad occhio nudo non cambia nulla! La prima query lentissima, le restanti veloci comunque! Riporto la stringa di connessione per completezza:

<connectionStrings>
<add name="DefaultConnection"
connectionString="data source=SRVTEST04\SQLEXPRESS2012;Initial Catalog=EnvData;Integrated Security=True;Pooling=false" ProviderName="System.Data.SqlClient"/>
</connectionStrings>

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.