首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Dapper的System.AccessViolationException在OleDbConnection.Query上的应用

问基于Dapper的System.AccessViolationException在OleDbConnection.Query上的应用
EN

Stack Overflow用户
提问于 2013-12-03 18:34:16
回答 1查看 2.2K关注 0票数 2

我正在使用OleDbConnection中的.Net 4.0来使用Access 12.0引擎查询Microsoft 2010数据库。这个进程可能每秒执行大量的查询,因为我有大约60个可能的并行线程(我在读取ThreadPool之后为TPL设置了一个这篇文章限制)。mdb文件位于网络驱动器上。我使用以下代码在每个查询上创建和释放一个连接:

代码语言:javascript
复制
Using connection As New OleDb.OleDbConnection(connectionString)
    result = connection.Query(Of Foo)(query, New With {.Param1 = param1, .Param2 = param2}).FirstOrDefault()
End Using

有时,似乎是随机的,我在呼叫connection.Query时得到了一个connection.Query。这个异常应该由非托管代码引发,但我不直接使用非托管代码,因此它发生在对Query的调用之后。我还想确保这不是一个显然与多线程有关的问题,但是,如果我正确地理解了文档,那么每个查询使用一个IDbConnection应该是线程安全的,而Dapper也应该是线程安全的。

错误并不总是发生在相同的查询或POCO类型上,硬件可能没有问题(CPU < 50%,内存< 75%,我的进程不超过250 MB)。我还没有看到SqlConnection与Server的类似代码有什么问题。

此外,我正在使用VS Express 2012,所以即使我配置了“中断上的异常”,我也不能使用异常助理来排除故障。显然,我不想在堆栈上捕获异常,因为它是一个与内存相关的异常(因为我不想捕获OutOfMemoryException)。

我做错了什么吗?是否有一种方法来调试这一点,因为它只是不时发生吗?这可能是Dapper或OleDb引擎的错误吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-03 19:50:50

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

上面没有太多的文档,但是它提到了here,MS不是为高压力和高并发性而设计的。

编辑:基于注释

  1. 您可以将access数据库直接转储到Server,作为一个暂存过程,然后针对暂存表中的数据运行您的.Net代码到它在SQL上的最后一个表中。
  2. 使用SSIS data flow to manipulate the data,可能对.Net代码使用脚本任务
  3. 我看到了一个进程,在大型2gb CSV文件上使用Reactive Extensions,使用缓冲区对数据进行流。因此,如果可以将ms访问数据转储到CSV中,则可以在内存中运行类似的进程。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20358957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档