0

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の苦情にあることに加えて、現在DataTableのみを使用していますが、ドライバーがDataReaderを使用してDataTableをロードすることを期待しています...

なぜこのエラーが発生し続けるのかわかりません。データベースとの接続は永続的ではありません。そうであることを願っています。リクエストごとに 1 つの接続を期待していました。

これまでにこれが起こったことがある人はいますか?

4

1 に答える 1

2

DataReaderあなたが言及したように、基になるオブジェクトがを使用しているようです。この場合、データベース接続への同期アクセスが必要です。DataReaders 接続を開き、接続が確立されるまで接続をビジー状態に維持します。DataReaderClose

.NET Framework はConnection Poolingを大いに活用するため、同じデータベースへの複数の接続は、実際には 1 つの実際に確立された接続になろうとします (可能な場合)。複数の Web リクエストが同時に発生するため、この接続プーリングは優れていますが、DataReaderその利点が「損なわれています」。

これを支援するためにObject、アプリケーションのどこかに静的 (およびインスタンス化) を作成します。MySQL にアクセスするコードを次のようにカプセル化します。

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