web-dev-qa-db-fra.com

Erreur lors de la connexion continue à la base de données

Quand j'interroge la base de données en boucle continue, après un certain temps, je reçois une erreur:

Une exception a probablement été provoquée par un transitoire échec. Si vous vous connectez à une base de données SQL Azure, envisagez d'utiliser SqlAzureExecutionStrategy.

Normalement cela fonctionne bien.

29
user3928324

Lors de la connexion à la base de données SQL, vous devez prendre en compte les échecs de connexion transitoires. Ces échecs de connexion peuvent se produire, par exemple, lorsque des mises à jour sont déployées, du matériel, etc. L'erreur que vous voyez indique que l'une de ces choses s'est produite, c'est-à-dire que votre connexion a été interrompue. L’activation d’une stratégie d’exécution suggérée par Anbuj devrait résoudre le problème.

15
Jan Engelsberg

Si vous utilisez EF Core, essayez de nouveau en cas d'échec pour les connexions résilientes: 

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlServer("your_connection_string", builder =>
        {
            builder.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), null);
        });
    base.OnConfiguring(optionsBuilder);
}
9
Shekhar

Activez une stratégie d'exécution comme indiqué ici: https://msdn.Microsoft.com/en-us/data/dn456835.aspx . Lors de la conception pour Azure SQL DB, vous devez concevoir pour les échecs de connexion transitoires, car depuis les mises à jour principales, les défaillances matérielles, l'équilibrage de la charge peut parfois entraîner des défaillances intermittentes.

8
Shantanu

Je reçois cette erreur lorsque l'identifiant auquel je tente de me connecter à la base de données ne comporte pas d'utilisateur associé.

2
Rush Frisby

Si votre base de données est locale, par exemple WebAPI, vous devez parfois fournir source de données = localhost et non une adresse IP . Nous nous trouvons dans une situation où nous utilisons du VPS sans que la définition de source de données soit définie sur localhost. Donc, si quelqu'un d'autre avait déjà vécu cela, cela pourrait l'aider.

0
MaGnumX

Je publie cette réponse car je suis confronté à de nombreux problèmes tout en recherchant la réponse. Voici le message d'erreur détaillé que je recevais:

Division des erreurs dans les parties car l'erreur était trop longue:

  1. System.Data.Entity.Core.EntityException: * Une exception a probablement été déclenchée en raison d'une défaillance transitoire. Si vous êtes connexion à une base de données SQL Azure, envisagez d’utiliser SqlAzureExecutionStrategy. * --->

  2. System.Data.Entity.Core.EntityCommandExecutionException: une erreur s'est produite lors de l'exécution de la définition de commande. Voir l'intérieur exception pour les détails. ---> System.Data.SqlClient.SqlException: ID de ressource: 1. La limite de demandes pour la base de données est de 30 et a été atteinte. Voir ' http://go.Microsoft.com/fwlink/?LinkId=267637 ' pour obtenir de l'aide. à System.Data.SqlClient.SqlConnection.OnError (Exception SqlException, Boolean breakConnection, Action`1 wrapCloseInAction)

Après des recherches, j'ai constaté qu'il était lié aux limites du nombre maximal de connexions à la base de données Azure SQL. J'utilisais le service pneu 'Basic' et je pouvais me connecter avec un nombre maximal d'utilisateurs simultanés égal à 30. 

Azure a des niveaux de tarification qui présentent des différences de performances assez spectaculaires. Pour ce faire, ils limitent de nombreuses mesures de performances, par exemple, Puissance du processeur, nombre de requêtes par minute, etc.

Cela signifie que si vous poussez sur votre niveau, vos demandes commenceront à être mises en file d'attente car la puissance/le volume de demandes du CPU est trop élevé pour être traité. Cela se traduit par des délais d'attente, puis la limite de demandes augmente lorsque les demandes attendent d'être traitées. Finalement, cela arrive au point où la base de données tombe essentiellement en panne.

D'après mon expérience, les niveaux de base de données inférieurs, tels que S0 et S1, sont sous-alimentés et ne doivent pas être utilisés pour autre chose que le développement ou des sites très basiques.

Le portail Azure contient d’excellents outils qui vous permettent de déboguer ce qui se passe dans votre base de données, tels que les graphiques de la CPU, le conseil d’indexation et les informations sur les performances des requêtes.

Voici les liens connexes:

Conclusion:

Merci.

0
Developer

La solution à ce problème passe par la réponse suggérée. Utilisez SetExecutionStrategy() pour activer une stratégie de nouvelle tentative. Assurez-vous également de dériver de la classe DbConfiguration pour qu'Entity Framework puisse exécuter la méthode automatiquement.

Vous voulez également vous assurer que votre résilience de connexion fonctionne réellement en configurant une interception de commande qui crée des erreurs de connexion afin que vous puissiez confirmer que cela fonctionne. 

Plus d'informations sur la gestion des erreurs de connexion transitoires

0
Joshua George

Cela peut être dû au paramètre TLS, le framework .net 4.5 ne prend pas en charge tls 1.2 par défaut et la nouvelle base de données SQL n’est pas compatible avec les versions antérieures de tls ver . soit désactivez tls 1.0,1.1 sur votre machine ou mettez à jour vers .net 4.6.2 

0
Taran