使用Dapper对OleDbConnection.Query进行System.AccessViolationException

时间:2013-12-03 18:34:16

标签: c# .net vb.net oledb dapper

我使用.Net 4.0中的OleDbConnection来使用ACE OleDb 12.0引擎查询Microsoft Access 2010数据库。这个过程可能每秒执行大量查询,因为我有大约60个可能的并行线程(我在阅读this article后为TPL设置了ThreadPool限制。 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类型上,并且它可能不是硬件问题(CPU <50%,内存<75%且我的进程没有#&# 39;吃超过250 MB)。我还没有看到SqlConnection到SQL Server上类似代码的问题。

此外,我正在使用VS Express 2012,所以即使我配置了&#34; Break on exception&#34;,我也无法使用异常助手进行故障排除。我显然不想在堆栈中捕获异常,因为它是一个与内存相关的异常(因为我不想捕获OutOfMemoryException)。

我做错了吗?有没有办法调试这个,因为它只是不时发生?这可能是Dapper或OleDb引擎的错误吗?

1 个答案:

答案 0 :(得分:1)

我怀疑问题是有多个线程命中Access DB。据我所知,MS Access 不是专为multi-threaded应用程序设计的,因为它对并发性有限制。

关于它的文档不多,但它提到here MS Access不是为高压力和高并发性而设计的。

编辑:根据评论

  1. 您可以将访问数据库直接转储到SQL Server中,作为登台过程,然后针对临时表中的数据运行.Net代码到SQL的最终表中。
  2. 使用SSIS data flow to manipulate the data,可能使用.Net代码的脚本任务
  3. 我看过一个过程,其中Reactive Extensions用于大型2gb CSV文件,使用缓冲区来传输数据。因此,如果您可以将ms访问数据转储为CSV,则可以在内存中运行类似的过程。