System.AccessViolationException en OleDbConnection.Query utilizando Dapper

.net c# dapper oledb vb.net

Pregunta

Estoy usando OleDbConnection en .Net 4.0 para consultar una base de datos de Microsoft Access 2010 con el motor ACE OleDb 12.0. Es posible que el proceso ejecute un gran número de consultas por segundo, ya que tengo alrededor de 60 posibles hilos paralelos (establecí un límite de ThreadPool para TPL después de leer este artículo ). El archivo mdb está en una unidad de red. Creo y dispongo una conexión en cada consulta, con el siguiente código:

Using connection As New OleDb.OleDbConnection(connectionString)
    result = connection.Query(Of Foo)(query, New With {.Param1 = param1, .Param2 = param2}).FirstOrDefault()
End Using

De vez en cuando, aparentemente de forma aleatoria, obtengo System.AccessViolationException in System.Data.dll en la llamada a connection.Query . Se supone que esta excepción se debe a un código no administrado, pero no uso directamente el código no administrado, por lo que ocurre después de la llamada a Query . También quería asegurarme de que no se trataba de un problema obviamente relacionado con multi-threading, pero, si entendía la documentación correctamente, usar un IDbConnection por consulta debería ser seguro para subprocesos, y se supone que Dapper también es seguro para subprocesos.

El error no siempre ocurre en la misma consulta o tipo de POCO, y probablemente no sea un problema con el hardware (CPU <50%, memoria <75% y mi proceso no consume más de 250 MB). Todavía no he visto un problema con un código similar en un SqlConnection to SQL Server.

Además, estoy trabajando con VS Express 2012, por lo que incluso si configuré "Break on exception", no puedo usar el Exception Assistant para solucionar problemas. Obviamente no quiero ver la excepción en la pila, ya que es una excepción relacionada con la memoria (ya que no me gustaría ver una OutOfMemoryException).

¿Estoy haciendo algo mal? ¿Hay alguna forma de depurar esto, ya que solo ocurre de vez en cuando? ¿Podría ser esto un error con Dapper o el motor OleDb?

Respuesta aceptada

Sospecho que el problema sería tener múltiples hilos golpeando el Access DB. Por lo que sé, MS Access no está diseñado para aplicaciones de multi-threaded , ya que tiene un límite de concurrencia.

No hay mucha documentación al respecto, pero here se menciona que MS Access no está diseñado para alto estrés y alta concurrencia.

EDITAR : Basado en comentarios

  1. Puede volcar la base de datos de acceso directamente en SQL Server, como un proceso de ensayo y luego ejecutar su código .Net contra los datos en la tabla de etapas en su tabla final en SQL.
  2. Utilice SSIS data flow to manipulate the data , posiblemente utilizando una tarea de secuencia de comandos para el código .Net
  3. He visto un proceso en el que las Reactive Extensions se usaban en archivos CSV grandes de 2 gb, utilizando el búfer para transmitir los datos. Entonces, si puede volcar los datos de acceso de ms en un archivo CSV, podría ejecutar un proceso similar en la memoria.


Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué