Nhibernate 为什么重新启动应用程序池会修复失败的登录System.Data.SqlClient.SqlException?

Nhibernate 为什么重新启动应用程序池会修复失败的登录System.Data.SqlClient.SqlException?,nhibernate,orchardcms,azure-sql-database,azure-web-app-service,Nhibernate,Orchardcms,Azure Sql Database,Azure Web App Service,我们收到以下关于登录失败的错误。通过对web.config进行无意义的更改来回收应用程序池,修复了错误,我们可以随后登录。从备份还原数据库后,可能(也可能不是)已开始出现错误。在任何情况下,为什么重新启动应用程序池会修复登录失败 2014-08-27 21:17:48,477 [10] Orchard.Tasks.BackgroundService - Error while processing background task NHibernate.TransactionExcepti

我们收到以下关于登录失败的错误。通过对web.config进行无意义的更改来回收应用程序池,修复了错误,我们可以随后登录。从备份还原数据库后,可能(也可能不是)已开始出现错误。在任何情况下,为什么重新启动应用程序池会修复登录失败

2014-08-27 21:17:48,477 [10] Orchard.Tasks.BackgroundService - Error while processing background task    
NHibernate.TransactionException: Begin failed with SQL exception --->     
System.Data.SqlClient.SqlException: Cannot open database "some_database_name" requested by the login. The login failed.    
Login failed for user 'some_database_user'.    
This session has been assigned a tracing ID of 'aaa-aaa-aaa-aaa-aaa'.  Provide this tracing ID to customer support when you need assistance.    
   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.TryOpenInner(TaskCompletionSource`1 retry)       
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)       
   at System.Data.SqlClient.SqlConnection.Open()       
   at Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.SqlAzure.ReliableSqlConnection.<Open>b__7()       
   at Microsoft.Practices.TransientFaultHandling.RetryPolicy.<>c__DisplayClass1.<ExecuteAction>b__0()       
   at Microsoft.Practices.TransientFaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 func)       
   at Microsoft.Practices.TransientFaultHandling.RetryPolicy.ExecuteAction(Action action)       
   at Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.SqlAzure.ReliableSqlConnection.<Open>b__6()       
   at Microsoft.Practices.TransientFaultHandling.RetryPolicy.<>c__DisplayClass1.<ExecuteAction>b__0()       
   at Microsoft.Practices.TransientFaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 func)       
   at Microsoft.Practices.TransientFaultHandling.RetryPolicy.ExecuteAction(Action action)       
   at Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.SqlAzure.ReliableSqlConnection.Open(RetryPolicy retryPolicy)       
   at NHibernate.SqlAzure.ReliableSqlDbConnection.Open()       
   at NHibernate.Connection.DriverConnectionProvider.GetConnection()       
   at NHibernate.AdoNet.ConnectionManager.GetConnection()       
   at NHibernate.Impl.SessionImpl.get_Connection()       
   at NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel isolationLevel)       
   --- End of inner exception stack trace ---       
   at NHibernate.Transaction.AdoTransaction.Begin(IsolationLevel isolationLevel)       
   at NHibernate.Impl.SessionImpl.BeginTransaction(IsolationLevel isolationLevel)       
   at Orchard.Data.SessionLocator.RequireNew(IsolationLevel level)       
   at Orchard.Data.SessionLocator.RequireNew()       
   at Orchard.Tasks.BackgroundService.Sweep()
2014-08-27 21:17:48477[10]Orchard.Tasks.BackgroundService-处理后台任务时出错
NHibernate.TransactionException:开始失败,SQL异常--->
System.Data.SqlClient.SqlException:无法打开登录请求的数据库“some_database_name”。登录失败。
用户“某个数据库用户”登录失败。
此会话已分配一个跟踪ID“aaa”。当您需要帮助时,请向客户支持提供此跟踪ID。
位于System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject、UInt32 waitForMultipleObjectsTimeout、Boolean allowCreate、Boolean OnlyOnEckConnection、DbConnectionOptions userOptions、DbConnectionInternal和connection)
位于System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject、TaskCompletionSource`1重试、DbConnectionOptions用户选项、DbConnectionInternal和connection)
位于System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection、TaskCompletionSource`1重试、DbConnectionOptions用户选项、DbConnectionInternal oldConnection、DbConnectionInternal&connection)
位于System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection、DbConnectionFactory connectionFactory、TaskCompletionSource`1重试,DbConnectionOptions用户选项)
位于System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection、DbConnectionFactory connectionFactory、TaskCompletionSource`1重试、DbConnectionOptions用户选项)
位于System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1重试)
位于System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1重试)
在System.Data.SqlClient.SqlConnection.Open()处
在Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.SqlAzure.ReliableSqlConnection.b_u 7()上
在Microsoft.Practices.TransientFaultHandling.RetryPolicy.c__DisplayClass1.b__0()上
在Microsoft.Practices.TransientFaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 Func)
在Microsoft.Practices.TransientFaultHandling.RetryPolicy.ExecuteAction(操作)
在Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.SqlAzure.ReliableSqlConnection.b_u 6()上
在Microsoft.Practices.TransientFaultHandling.RetryPolicy.c__DisplayClass1.b__0()上
在Microsoft.Practices.TransientFaultHandling.RetryPolicy.ExecuteAction[TResult](Func`1 Func)
在Microsoft.Practices.TransientFaultHandling.RetryPolicy.ExecuteAction(操作)
在Microsoft.Practices.EnterpriseLibrary.WindowsAzure.TransientFaultHandling.SqlAzure.ReliableSqlConnection.Open(RetryPolicy RetryPolicy)
在NHibernate.SqlAzure.ReliableSqlDbConnection.Open()处
在NHibernate.Connection.DriverConnectionProvider.GetConnection()处
在NHibernate.AdoNet.ConnectionManager.GetConnection()中
在NHibernate.Impl.SessionImpl.get_Connection()上
在NHibernate.Transaction.AdoTransaction.Begin处(IsolationLevel IsolationLevel)
---内部异常堆栈跟踪结束--
在NHibernate.Transaction.AdoTransaction.Begin处(IsolationLevel IsolationLevel)
在NHibernate.Impl.SessionImpl.BeginTransaction(隔离级别隔离级别)
在Orchard.Data.SessionLocator.Requirement(隔离级别)
在Orchard.Data.SessionLocator.require()中
在Orchard.Tasks.BackgroundService.Sweep()中

此外,我们还有一个后续问题:

在大多数情况下,连接池问题都与“连接泄漏”有关。您的应用程序可能无法正确且一致地关闭其数据库连接。 默认情况下,SQL Server最多允许32767个连接。
重新启动应用程序池后,您将断开所有连接。

可能的情况很多-很难说。可能是应用程序中仍缓存了一些错误的连接数据(当发生备份时)、连接池耗尽等。结果表明,在从备份还原数据库之前发生了无效的登录错误。在分析日志之后,我们看到了以下模式。大约二十个“登录失败”错误,接着是大约二十个“无效对象名称”错误,接着又是大约二十个“登录失败”错误。