0

我正在使用 MySQL 和他的 .NET 连接器(http://dev.mysql.com/doc/refman/5.5/en/connector-net.html)构建一个带有 ASP.NET MVC 4 Web API 的 Web 服务;

但是在我的测试中,当我从我的 HTML5 客户端向我的 Web 服务发出 3 个同时请求时,它有时只返回 2 个或 1 个请求的正确数据,其他请求向我抛出 505 错误,表示已经存在关联的 DataReader 对象通过连接,更具体地说:

There is already an open DataReader associated with this Connection which must be closed first.
   at MySql.Data.MySqlClient.ExceptionInterceptor.Throw(Exception exception)
   at MySql.Data.MySqlClient.MySqlCommand.Throw(Exception ex)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior)   
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
   at App.Backservice.Models.Persistence.DataTable..ctor(MySqlDataAdapter adp)

除了 DataReader 投诉的错误外,我目前只使用 DataTables,但我希望驱动程序使用 DataReader 加载 DataTable ...

我找不到为什么它一直向我抛出这个错误。我与数据库的连接不是持久的,我希望如此,我期待每个请求一个连接。

以前有人遇到过这种情况吗?

4

1 回答 1

2

DataReader正如您所提到的,似乎基础对象正在使用 a 。在这种情况下,您必须对数据库连接具有同步访问权限。DataReaders 打开一个连接,并保持它忙碌直到d .DataReaderClose

.NET Framework 充分利用了连接池,因此到同一个数据库的多个连接实际上会尝试成为一个真正建立的连接(如果可能的话)。由于同时发生多个 Web 请求,这种连接池是好的,但是,DataReaders 正在“打破”这一优势。

为了帮助解决这个问题,Object请在应用程序的某处创建一个静态(并实例化)。继续使用以下代码封装访问 MySQL 的代码:

lock (_StaticLockingObject)
{
    // Data access code here
}
于 2013-03-03T23:48:00.513 回答