0
votes

Service d'applications Azure Impossible de se connecter à la base de données SQL

J'ai un Azure Appservice écrit dans C # CODE> qui se connecte à une base de données SQL Server hébergée en dehors de Azure à l'aide de NHibernate code>. La chaîne de connexion ressemble à ceci: xxx pré>

la plupart du temps tout fonctionne bien, mais mon appserver perd de temps en temps la connexion et je reçois l'exception suivante: P>

 System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 0 - A connection
 attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.) ---> System.ComponentModel.Win32Exception: A connection
 attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond --- End of inner exception stack trace
 ---
 at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling, String accessToken)
 at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
 at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
 at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
 at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
 at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
 at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
 at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
 at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
 at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
 at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
 at System.Data.SqlClient.SqlConnection.Open()
 at NHibernate.Connection.DriverConnectionProvider.GetConnection()
 at NHibernate.Tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.Prepare()
 at NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.GetReservedWords(Dialect dialect, IConnectionHelper connectionHelper)
 at NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.Update(ISessionFactoryImplementor sessionFactory)
 at NHibernate.Impl.SessionFactoryImpl..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners)
 at NHibernate.Cfg.Configuration.BuildSessionFactory()
 at FluentNHibernate.Cfg.FluentConfiguration.BuildSessionFactory() --- End of inner exception stack trace


2 commentaires

Avez-vous mis en œuvre une politique de nouvelle tentative?


@Csharmprocks Oui j'ai, mais cela n'aide pas malheureusement. Cela ressemble plus à un problème de pare-feu, car une fois que mon application perd la connexion, elle ne peut pas récupérer, peu importe combien de fois je répète.


3 Réponses :


0
votes

Il s'agit d'un problème très courant et fréquent et cela arrive une instabilité du réseau dû. Le moyen de résoudre concerne simplement le bloc de code à l'aide d'un motif de tentative.

https://docs.microsoft.com/en-us / azur / architecture / motifs / réessayer


3 commentaires

J'ai déjà une politique de nouvelle tentative et cela n'aide pas beaucoup. Une fois que je reçois le premier sqlexception toutes les requêtes ultérieures échouent également, peu importe combien de fois je répète.


Utilisez-vous une base de données SQL Server SQL? Si vous le souhaitez, vous devez changer, car il prend jusqu'à 2 minutes jusqu'à ce qu'il se réchauffe à nouveau (après avoir été inactif pendant un moment) et renvoyez des données.


Nope, j'utilise une base de données SQL ordinaire. Et tout fonctionne depuis assez longtemps (il n'est donc pas une mauvaise chaîne de connexion ni un problème d'échauffement), mais à un moment donné, l'application déjà en cours d'exécution devient simplement incapable de se connecter à SQL.



0
votes

Dans votre pare-feu SQL Server Vous pouvez configurer / autoriser les adresses IP sortantes pour votre service App. Vous pouvez obtenir ces IP de la section immobilière de votre service d'applications ou en utilisant CLI.
Adresses IP entrantes et sortantes dans Azure App Service < / a>


1 commentaires

Mon serveur SQL n'est pas hébergé à Azure et il n'a pas de pare-feu



1
votes

Vous êtes très probablement frappé d'épuisement de la Snat. Sous diagnostiquez et résolvez les problèmes de la lame de la lame de «Connections TCP» qui vous montrera combien de connexions TCP à votre application. S'il y a un nombre élevé de connexions à SQL (~ 128 +), votre application est dans un état qui sera probablement dans le délai d'attente.

 Entrez la description de l'image ici

Services d'application exécutés dans la gamme 201-400 pour les services d'applications multi-locataires, une fois que vous avez une fois que vous l'appliquez de connecter 128 connexions TCP individuelles à une destination spécifique IP / Port, vous verrez probablement ces problèmes. https://docs.microsoft.com/ EN-US / AZURE / Équilibreuse / Équilibreuse / Équilibreuse-Équilibreuse-Outbound-Outbound

Mes recommandations seraient dans l'ordre suivant:

  1. Assurez-vous d'utiliser la mise en commun de la connexion pour limiter le nombre individuel de connexions TCP. J'ai travaillé avec des clients qui comptaient 1000 de connexions TCP et après avoir utilisé la mise en commun de la connexion pour toutes leurs connexions, il a chuté jusqu'à 100. La taille du plan ne fait pas de différence pour ce problème particulier. https://docs.microsoft. COM / EN-US / DOTNET / Framework / Data / Adonet / SQL-Server-Connection-Pooling -

  2. Utilisez l'intégration VNET régionale - Les ports SNAT n'entrent pas en jeu avec l'intégration VPET. Vous pouvez ensuite utiliser les points de terminaison de service pour suivre le trafic vers Azure SQL. HTTPS: //docs.microsoft.com/en-us/azure/app-service/web-sites-Integrate-with-vnet#regional-vnet-Integration

  3. Échelle de l'application à plusieurs instances - cela aide à étaler les demandes et la connexion SQL sortante sur plusieurs VMS

  4. Utilisez un ASE - c'est une option beaucoup plus chère mais je voulais juste vouloir Ajoutez-le pour la réponse à la finalité. Les ports SNAT dépendent de la Nombre d'instances que vous avez comme indiqué dans le document ci-dessus


6 commentaires

Quelle serait la solution? Limite Max Pool Taille en chaîne de connexion SQL? À quelle valeur? Cette valeur dépend-elle du plan d'appServie ou de quoi que ce soit d'autre que je puisse configurer à Azure?


Assurez-vous d'utiliser la mise en commun de la connexion pour limiter le nombre individuel de connexions TCP. J'ai travaillé avec des clients qui comptaient 1000 de connexions TCP et après avoir utilisé la mise en commun de la connexion pour toutes leurs connexions, il a chuté jusqu'à 100. La taille du plan ne fait pas de différence pour ce problème particulier. docs.microsoft.com/fr- US / DotNet / Framework / Data / Adonet / ...


Cela signifie-t-il que toute Appservice qui repose fortement sur la base de données SQL ne fonctionnera pas correctement si la mise en commun de la connexion est configurée? Cela semble être une restriction très perverse et non évidente.


Je pense que la meilleure pratique générale est de veiller à gérer les connexions car d'ouverture de nouvelles connexions peuvent être un processus coûteux. Il y a quelques façons de contourner ce problème. 1. Utilisez l'intégration VNET régionale - Les ports SNAT n'entrent pas en jeu avec VPET Integration 2. Échelle de l'application à plusieurs instances - Cela aide à étendre les demandes et la connexion SQL sortante sur plusieurs VMS 3. Utilisez une option ASE - c'est une option beaucoup plus chère, mais je voulais simplement l'ajouter pour la réponse à la finalité. Les ports SNAT dépendent du nombre d'instances que vous avez visitées dans le document ci-dessus.


Merci pour la clarification! Si vous incorporez certaines des solutions mentionnées dans les commentaires dans votre réponse, je vais le marquer comme accepté (sinon la réponse met simplement en évidence le problème sans parler de solutions)


Merci pour la suggestion, j'ai mis à jour ma réponse avec les recommandations.