我使用.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引擎的错误吗?
答案 0 :(得分:1)
我怀疑问题是有多个线程命中Access DB。据我所知,MS Access
不是专为multi-threaded
应用程序设计的,因为它对并发性有限制。
关于它的文档不多,但它提到here
MS Access不是为高压力和高并发性而设计的。
编辑:根据评论
SSIS data flow to manipulate the data
,可能使用.Net代码的脚本任务Reactive Extensions
用于大型2gb CSV文件,使用缓冲区来传输数据。因此,如果您可以将ms访问数据转储为CSV,则可以在内存中运行类似的过程。