我正在使用 ASP.NET MVC 4 Web API、MySQL 以及他的 .NET 连接器 ( http://dev.mysql.com/doc/refman/5.5/en/connector-net.html ) 构建一个 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...
我不明白为什么它总是向我抛出这个错误。我与数据库的连接不是持久的,我希望如此,我期望每个请求一个连接。
以前有人遇到过这种情况吗?
最佳答案
正如您提到的,底层对象似乎正在使用DataReader
。在这种情况下,您必须能够同步访问数据库连接。 DataReader
打开一个连接,并使其保持忙碌,直到DataReader
关闭
为止。
.NET Framework 充分利用 Connection Pooling ,因此与同一数据库的多个连接实际上会尝试成为一个真正已建立的连接(如果可能)。由于同时发生多个 Web 请求,这种连接池很好,但是,DataReader
正在“破坏”这一优势。
为了帮助解决此问题,请在应用程序中的某处创建一个静态对象
(并实例化)。继续封装访问MySQL的代码:
lock (_StaticLockingObject)
{
// Data access code here
}
关于带有 MySQL 的 ASP.NET MVC 4 Web API 不断抛出 DataReader Open 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15190877/