Я использую OleDbConnection
в .Net 4.0 для запроса базы данных Microsoft Access 2010 с помощью механизма ACE OleDb 12.0. Возможно, процесс выполняет большое количество запросов в секунду, так как у меня есть около 60 возможных параллельных потоков (я установил ограничение ThreadPool
для TPL после прочтения эту статью). Файл mdb находится на сетевом диске. Я создаю и удаляю соединение для каждого запроса со следующим кодом:
Using connection As New OleDb.OleDbConnection(connectionString)
result = connection.Query(Of Foo)(query, New With {.Param1 = param1, .Param2 = param2}).FirstOrDefault()
End Using
Время от времени, казалось бы, случайно, я получаю System.AccessViolationException in System.Data.dll
при звонке connection.Query
. Это исключение должно вызываться неуправляемым кодом, но я напрямую не использую неуправляемый код, поэтому это происходит после вызова Query
. Я также хотел убедиться, что это не проблема, явно связанная с многопоточностью, но, если я правильно понимаю документацию, использование одного IDbConnection
на запрос должно быть потокобезопасным, и Dapper также должен быть потокобезопасным.
Ошибка не всегда возникает при одном и том же запросе или типе POCO, и, вероятно, это не проблема с оборудованием (процессор ‹ 50%, память ‹ 75% и мой процесс не ест более 250 МБ). Я еще не видел проблемы с подобным кодом на SqlConnection
для SQL Server.
Кроме того, я работаю с VS Express 2012, поэтому, даже если я настроил «Разрыв при исключении», я не могу использовать помощник по исключениям для устранения неполадок. Я, очевидно, не хочу перехватывать исключение вверх по стеку, так как это исключение, связанное с памятью (поскольку я бы не хотел перехватывать исключение OutOfMemoryException).
Я делаю что-то неправильно? Есть ли способ отладить это, так как это происходит только время от времени? Может ли это быть ошибкой Dapper или движка OleDb?