System.AccessViolationException sur OleDbConnection.Query à l'aide de Dapper

.net c# dapper oledb vb.net

Question

J'utilise un OleDbConnection dans .Net 4.0 pour interroger une base de données Microsoft Access 2010 avec le moteur ACE OleDb 12.0. Il est possible que le processus exécute un nombre élevé de requêtes par seconde, car j'ai environ 60 threads parallèles possibles (j'ai défini une limite ThreadPool pour TPL après avoir lu cet article ). Le fichier mdb se trouve sur un lecteur réseau. Je crée et dispose d'une connexion sur chaque requête, avec le code suivant:

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

De temps en temps, apparemment au hasard, je reçois une System.AccessViolationException in System.Data.dll lors de l'appel à connection.Query . Cette exception est supposée être lancée par du code non géré, mais je n'utilise pas directement le code non géré, donc cela se produit après l'appel à Query . Je voulais aussi m'assurer que ce n'était pas un problème lié au multi-threading, mais si je comprends bien la documentation, utiliser une IDbConnection par requête devrait être thread-safe, et Dapper est supposé être aussi thread-safe.

L'erreur ne se produit pas toujours avec la même requête ou le même type POCO, et ce n'est probablement pas un problème avec le matériel (processeur <50%, mémoire <75% et mon processus ne consomme pas plus de 250 Mo). Je n'ai pas encore vu de problème avec un code similaire sur un SqlConnection vers SQL Server.

De plus, je travaille avec VS Express 2012, donc même si j'ai configuré "Break on exception", je ne peux pas utiliser l'Assistant Exception pour résoudre le problème. Je ne veux évidemment pas attraper l'exception dans la pile, car il s'agit d'une exception liée à la mémoire (car je ne voudrais pas intercepter une exception OutOfMemoryException).

Est-ce que je fais quelque chose de mal? Y a-t-il un moyen de déboguer ceci, puisque cela ne se produit que de temps en temps? Cela pourrait-il être un bug avec Dapper ou le moteur OleDb?

Réponse acceptée

Je soupçonne que le problème serait d'avoir plusieurs threads frapper la base de données Access. Autant que je sache, MS Access n'est pas conçu pour multi-threaded applications multi-threaded , car il a une limite sur la concurrence.

Il n'y a pas beaucoup de documentation à ce sujet, mais il mentionne here que MS Access n'est pas conçu pour un stress élevé et une concurrence élevée.

EDIT : Basé sur des commentaires

  1. Vous pouvez transférer la base de données d'accès directement dans SQL Server, en tant que processus intermédiaire, puis exécuter votre code .Net par rapport aux données de la table de transfert dans sa table finale sur SQL.
  2. Utiliser SSIS data flow to manipulate the data , éventuellement en utilisant une tâche de script pour le code .Net
  3. J'ai vu un processus où les Reactive Extensions étaient utilisées sur de gros fichiers CSV de 2 Go, en utilisant le tampon pour diffuser les données. Ainsi, si vous pouvez transférer les données d'accès ms dans un fichier CSV, vous pouvez exécuter un processus similaire en mémoire.


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi