0

当有多个用户同时使用系统(15-25 个用户)并从数据库中检索和发布数据时,我们在 Azure 中托管的网站会定期抛出异常。异常与与数据库的连接有关。

我们使用 Azure SQL 和 Linq to SQL。我检查了数据库的监视器,并没有关于连接失败的报告,并且连接数量远远低于它应该能够处理的范围。

我正在使用 IoC 容器来创建数据上下文的新实例,它只是正在启动的数据上下文的一个实例,并且用于查询所有表。

我深入研究了事件日志,发现了正在抛出的异常:


事件代码:3005 事件消息:发生未处理的异常。事件时间:02.04.2013 11:48:45 事件时间(UTC):02.04.2013 11:48:45 事件 ID:09157c3457904c99b2b57abb44bef857 事件序列:5911 事件发生:74 事件详细代码:0

应用信息:应用域:/LM/W3SVC/1273337584/ROOT-1-130093075659455176 信任等级:完整应用虚拟路径:/应用路径:E:\sitesroot\0\机器名:RD00155D36AB20

进程信息:进程ID:2420 进程名称:w3wp.exe 帐户名称:NT AUTHORITY\NETWORK SERVICE

异常信息:异常类型:SqlException 异常消息:服务当前正忙。10 秒后重试请求。事件 ID:{26F49B32-6DD8-4149-89FA-780AF4BD74D3}。代码:32771 当前命令出现严重错误。结果,如果有的话,应该丢弃。在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 在 System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 在 System.Data.SqlClient.SqlDataReader.get_MetaData() 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,1.System.Linq.IQueryProvider.Execute[S](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 来源,Expression`1 谓词)在 Holte.UK.Service.People.PersonServiceCRUD.GetCompanyIdByUserProfile(Object userID) 在 Holte.UK.MvcApplication.Application_PostAcquireRequestState(Object sender, EventArgs e) 在 System.Web.HttpApplication.SyncEventExecutionStep.System。 Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,布尔值&完成同步)

请求信息: 请求URL:http://www.xx/ 请求路径:/ 用户主机地址:xxxx 用户:
是否认证:False 认证类型:
线程账号名:NT AUTHORITY\NETWORK SERVICE

线程信息:线程 ID:20 线程帐户名称:NT AUTHORITY\NETWORK SERVICE 正在模拟:False 堆栈跟踪:在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning 的 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection) () 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 在 System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 在 System.Data.SqlClient.SqlDataReader.get_MetaData () 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior,布尔返回流,布尔异步)在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,字符串方法,DbAsyncResult 结果)在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔returnStream, String 方法) 在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为, String 方法) 在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior 行为) 在 System.Data.Linq.SqlClient.SqlProvider.Execute(Expression查询,QueryInfo queryInfo,IObjectReaderFactory 工厂,Object[] parentArgs,Object[] userArgs,ICompiledSubQuery[] subQueries,Object lastResult) 在 System.Data.Linq.SqlClient.SqlProvider.ExecuteAll(表达式查询,QueryInfo[] queryInfos,System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute 中的 IObjectReaderFactory 工厂、Object[] userArguments、ICompiledSubQuery[] subQueries)(System.Data.Linq.DataQuery 中的表达式查询)1.System.Linq.IQueryProvider.Execute[S](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 来源,Expression`1 谓词)在 Holte.UK.Service.People.PersonServiceCRUD.GetCompanyIdByUserProfile(Object userID) 在 Holte.UK.MvcApplication.Application_PostAcquireRequestState(Object sender, EventArgs e) 在 System.Web.HttpApplication.SyncEventExecutionStep.System。 Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,布尔值&完成同步)

自定义活动详情:


事件代码:3005 事件消息:发生未处理的异常。事件时间:02.04.2013 11:46:56 事件时间(UTC):02.04.2013 11:46:56 事件 ID:a8dc5c34109e4a7d9f1c74bb697d86b8 事件序列:5905 事件发生:72 事件详细代码:0

应用信息:应用域:/LM/W3SVC/1273337584/ROOT-1-130093075659455176 信任等级:完整应用虚拟路径:/应用路径:E:\sitesroot\0\机器名:RD00155D36AB20

进程信息:进程ID:2420 进程名称:w3wp.exe 帐户名称:NT AUTHORITY\NETWORK SERVICE

异常信息:异常类型:SqlException 异常消息:从服务器接收结果时发生传输级错误。(提供者:TCP 提供者,错误:0 - 现有连接被远程主机强制关闭。)在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning( ) 在 System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() 在 System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 错误) 在 System. Data.SqlClient.TdsParserStateObject.ReadByte() 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,1.System.Linq.IQueryProvider.Execute[S](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 来源,Expression`1 谓词)在 Holte.UK.Service.People.PersonServiceCRUD.GetCompanyIdByUserProfile(Object userID) 在 Holte.UK.MvcApplication.Application_PostAcquireRequestState(Object sender, EventArgs e) 在 System.Web.HttpApplication.SyncEventExecutionStep.System。 Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,布尔值&完成同步)

请求信息: 请求URL:http://www.xx/ 请求路径:/ 用户主机地址:xxxx 用户:
是否认证:False 认证类型:
线程账号名:NT AUTHORITY\NETWORK SERVICE

线程信息:线程 ID:20 线程帐户名称:NT AUTHORITY\NETWORK SERVICE 正在模拟:False 堆栈跟踪:在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning 的 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection) () 在 System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 错误) 在 System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() 在 System System.Data.SqlClient.TdsParserStateObject.ReadByte() 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) 在系统。Data.SqlClient.SqlDataReader.ConsumeMetaData() 在 System.Data.SqlClient.SqlDataReader.get_MetaData() 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) 在 System.Data.SqlClient.SqlCommand。 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,String 方法,DbAsyncResult 结果)在 System.Data.SqlClient.SqlCommand.RunExecuteReader 的 RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,布尔异步) System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,String 方法)处 System.Data.SqlClient.SqlCommand 处的(CommandBehavior cmdBehavior、RunBehavior runBehavior、布尔 returnStream、String 方法)。System.Data 中的 System.Data.Linq.SqlClient.SqlProvider.Execute(表达式查询、QueryInfo queryInfo、IObjectReaderFactory 工厂、Object[] parentArgs、Object[] userArgs、ICompiledSubQuery[] subQueries、Object lastResult)中的 ExecuteDbDataReader(CommandBehavior 行为)。 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider 处的 Linq.SqlClient.SqlProvider.ExecuteAll(表达式查询,QueryInfo[] queryInfos,IObjectReaderFactory 工厂,Object[] userArguments,ICompiledSubQuery[] subQueries)。在 System.Data.Linq.DataQuery 执行(表达式查询)ExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) at System.Data.Linq.DataQueryExecuteAll(Expression query, QueryInfo[] queryInfos, IObjectReaderFactory factory, Object[] userArguments, ICompiledSubQuery[] subQueries) at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) at System.Data.Linq.DataQuery1.System.Linq.IQueryProvider.Execute[S](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 来源,Expression`1 谓词)在 Holte.UK.Service.People.PersonServiceCRUD.GetCompanyIdByUserProfile(Object userID) 在 Holte.UK.MvcApplication.Application_PostAcquireRequestState(Object sender, EventArgs e) 在 System.Web.HttpApplication.SyncEventExecutionStep.System。 Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,布尔值&完成同步)

自定义活动详情:


事件代码:3005 事件消息:发生未处理的异常。事件时间:02.04.2013 11:20:11 事件时间(UTC):02.04.2013 11:20:11 事件 ID:cbf42c3adf63405293a803cb75577076 事件序列:5652 事件发生:71 事件详细代码:0

应用信息:应用域:/LM/W3SVC/1273337584/ROOT-1-130093075659455176 信任等级:完整应用虚拟路径:/应用路径:E:\sitesroot\0\机器名:RD00155D36AB20

进程信息:进程ID:2420 进程名称:w3wp.exe 帐户名称:NT AUTHORITY\NETWORK SERVICE

异常信息:异常类型:SqlException 异常消息:服务器“xxx”上的数据库“xxx”当前不可用。请稍后重试连接。如果问题仍然存在,请联系客户支持,并向他们提供会话跟踪 ID '30b6d33f-4976-44b8-a586-8bfe2bc66182'。用户“xxx”登录失败。在 System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 在 System.Data。 System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser 用户)在 System.Data.Linq 的 SqlClient.SqlConnection.Open()。1.System.Linq.IQueryProvider.Execute[S](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 来源,Expression`1 谓词)在 Holte.UK.Service.People.PersonServiceCRUD.GetCompanyIdByUserProfile(Object userID) 在 Holte.UK.MvcApplication.Application_PostAcquireRequestState(Object sender, EventArgs e) 在 System.Web.HttpApplication.SyncEventExecutionStep.System。 Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,布尔值&完成同步)

请求信息:请求URL:http://mail.xx/FindInspector/Companies/128?InspectorCompaniesViewModel-page=5&InspectorCompaniesViewModel-sort=Telephone-asc 请求路径:/FindInspector/Companies/128 用户主机地址:66.249.76.91 用户:
是已验证:False 验证类型:
线程帐户名:NT AUTHORITY\NETWORK SERVICE

线程信息:线程 ID:21 线程帐户名称:NT AUTHORITY\NETWORK SERVICE 正在模拟:错误堆栈跟踪:在 System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) 在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection ) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 在 System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) 在 System.Data System.Data.SqlClient.SqlConnection.Open() .Linq.SqlClient.SqlProvider.get_IsSqlCe() 在 System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() 在 System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(表达式查询)在 System.Data.Linq。数据查询1.System.Linq.IQueryProvider.Execute[S](Expression expression) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 来源,Expression`1 谓词)在 Holte.UK.Service.People.PersonServiceCRUD.GetCompanyIdByUserProfile(Object userID) 在 Holte.UK.MvcApplication.Application_PostAcquireRequestState(Object sender, EventArgs e) 在 System.Web.HttpApplication.SyncEventExecutionStep.System。 Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤,布尔值&完成同步)

自定义活动详情:

4

2 回答 2

2

这些是 SQL Azure 中非常常见transient的情况。我猜你没有在你的代码中实现任何重试逻辑。

查看、通读并在您的应用程序中实现瞬态故障处理。

于 2013-04-03T10:28:49.120 回答
0

根据我的理解,无论你是否得到它,这个问题都可能是非常随机的。一台 SQL 服务器上运行着大约 600 个 Azure SQL 安装/实例。Azure 安装共享该服务器上的所有资源、mdf 和 ldf 文件(这就是您必须联系支持人员以恢复您的数据库的原因)。因此,如果你不走运并且最终在有人使用繁重的数据库操作的服务器上,那么这将影响你的 Azure SQL 的性能。

如果您不走运并且经常遇到暂时性错误,那么另一种解决方案是创建一个新的 Azure SQL 并将您的数据库移到那里。希望这会将您的新 Azure SQL 放置在不同的服务器上,并且使用该服务器的其他人的数据库操作较少。

于 2013-05-29T10:59:13.770 回答