2015-09-04 11 views
6

Ho sviluppato un'applicazione Web un'applicazione Web standard per consentire agli utenti di visualizzare e aggiornare un set di dati da un database SQL.Connessione al database lenta dall'applicazione Web di Azure

L'applicazione Web utilizza un lato client AngularJS che interagisce con il server Web tramite chiamate API MVC Web per recuperare e aggiornare i dati nel database. Il codice lato server è scritto in C# utilizzando .NET 4.5 e utilizza Entity Framework v6.0 per accedere al database.

L'applicazione Web è ospitata in un'app Web di Azure. Il database è il database SQL di Azure.

Il problema è che quando l'applicazione non è stata utilizzata per circa 10-15 minuti, quindi viene utilizzata nuovamente, il primo recupero dei dati richiede spesso più di 10 secondi per tornare al browser. Dopo ciò, le prestazioni vanno bene fino alla prossima volta che l'applicazione viene lasciata inutilizzata.

Ho messo traccia nell'applicazione e vediamo che il ritardo è quando si apre la connessione. La query effettiva sul database viene eseguita al secondo.

Ho notato che con diverse configurazioni di hosting ottengo risultati diversi. In particolare, l'hosting in house e il puntamento al database di Azure non si verificano in alcun modo in prossimità degli stessi ritardi.

Ho modificato una delle routine per utilizzare ADO.NET invece di Entity Framework e ho modificato la traccia per cercare di restringerla ulteriormente.

Quello che vedo è questo:

ConnectionStringSettings ADOcnxstring = ConfigurationManager.ConnectionStrings["DevFEConnectAdo"]; 
DbConnection ADOconnection = new SqlConnection(ADOcnxstring.ConnectionString); 

Il ritardo è qui (prima è stato ancora definito lo SQL

e poi generare il comando e fare il DataReader etc:

DbCommand ADOcommand = ADOconnection.CreateCommand(); 
      : 
etc 

Quindi il ritardo è l'apertura del collegamento al database.

la mia connessione stringa è standard:

<add name="DevFEConnectAdo" connectionString="data 
source=feeunsqldevfeconnect.database.windows.net;initial 
catalog=feeunsqldbdevfeconnect;persist security info=True;user id=??? 
@???;password=???;multipleactiveresultsets=True"></add> 
+0

"il ritardo è quando si apre la connessione" Il ritardo * dovuto a * l'apertura o è solo il ritardo dall'inizio della richiesta all'apertura successiva? – usr

+0

Il ritardo è occupato dall'istruzione Open stessa. Quindi la traccia include un momento in cui il servizio risponde alla richiesta, quindi l'istruzione successiva è la connessione aperta, che è quella che richiede tempo. – TimBunting

risposta

3

Dopo qualche tempo, questo alla fine è stato risolto con l'aiuto del supporto di Microsoft Azure.

Il dettaglio che ho lasciato fuori era che il mio Web App è stato effettivamente puntando a 2 basi di dati - 1 database dell'applicazione Azure SQL, ho avuto il problema di ritardo con - A 'Data Warehouse' che abbiamo fatto in un virtuale Azure Macchina

A causa della replica tra i server di database interni e il "Data Warehouse", la Macchina virtuale e l'app Web si trovavano tutte in una rete virtuale di Azure.

Il problema era che ci possono essere problemi di rete se un'app Web all'interno di una rete virtuale vuole parlare con i database SQL di Azure (che non possono essere all'interno di una rete virtuale).

mia soluzione era quella

  • configurare un endpoint sul server Virtual Data Warehouse,
  • prendere la Web App fuori dalla rete virtuale e farlo puntare al server virtuale per mezzo della Endpoint

A questo punto tutti i ritardi sono andati via e sono riuscito a rimuovere le impostazioni di MinPool Size (e Timeout che successivamente ho scoperto non ha fatto nulla).

2

Le app Web vengono riciclate dopo alcuni minuti di inattività. Prova ad abilitare l'impostazione Sempre attiva situata in Impostazioni/Impostazioni applicazione nel portale per vedere se questo aiuta a risolvere il problema.

+0

Grazie. L'ho già provato. WebApp è impostato con "Sempre attivo" in Impostazioni applicazione di Azure. – TimBunting

3

15 minuti sono troppo brevi per la tua app da riciclare (come suggerito da CSharpRocks). Non penso che sia il problema qui.

Il ritardo è dovuto al fatto che una nuova connessione Db viene stabilita alla prima chiamata dopo il timeout di inattività. In genere se una connessione è inattiva per 4-10 minutes verrà chiusa. Se viene specificata una dimensione minima del pool, tali connessioni verranno mantenute attive anche dopo la scadenza del periodo di inattività.

Provare a utilizzare questa stringa di connessione (regolare le dimensioni min piscina secondo i vostri bisogni)

<add name="DevFEConnectAdo" connectionString="data 
source=feeunsqldevfeconnect.database.windows.net;initial 
catalog=feeunsqldbdevfeconnect;persist security info=True;user id=??? 
@???;password=???;multipleactiveresultsets=True;Min Pool Size=3;Load Balance Timeout=180;"></add> 

Ulteriori dettagli Why do we need to set Min pool size in ConnectionString

numero delle strutture di connessione SQL - documentation

+0

Questa risposta ha sicuramente un senso. Tuttavia, fare questo cambiamento da solo non ha fornito il cambiamento delle prestazioni che speravo. Tuttavia, l'aggiunta di questo in combinazione con Load Balance TimeOut = 180 ha fatto un'enorme differenza. Grazie! – TimBunting

+0

Load Balance Timeout ha il valore predefinito '0' che significa il timeout massimo della connessione come per questo [articolo] (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring (v = vs.110) aspx). Quindi avrebbe dovuto funzionare anche senza di essa. Ho modificato la soluzione di cui sopra per riflettere @TimBunting suggerimento –

+0

@TimBunting se questa o qualsiasi risposta ha risolto la tua domanda per favore considera [accettandolo] (http://meta.stackexchange.com/q/5234/179419) facendo clic sul check- marchio. Ciò indica alla comunità più ampia che hai trovato una soluzione e dà una certa reputazione sia al rispondente che a te stesso. Non c'è l'obbligo di farlo. –

Problemi correlati