我正在使用ASP.NET和他的.NET Connector(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 ......
我无法找到为什么它一直把这个错误扔给我。我与数据库的连接并不持久,我希望如此,我期待每个请求有一个连接。
以前有人发生过这种情况吗?
答案 0 :(得分:2)
正如您所提到的,似乎底层对象正在使用DataReader
。在这种情况下,您必须具有对数据库连接的同步访问权限。 DataReader
打开一个连接,并保持忙,直到DataReader
为Close
d。
.NET Framework充分利用了Connection Pooling,因此与同一数据库的多个连接实际上将尝试成为一个真正建立的连接(如果可能)。由于同时发生了多个Web请求,这种连接池很好,但DataReader
正在“打破”这种优势。
为了帮助解决这个问题,请在应用程序的某处创建一个静态Object
(和实例化)。继续使用以下内容封装访问MySQL的代码:
lock (_StaticLockingObject)
{
// Data access code here
}