我在.Net 4.0中使用OleDbConnection
来使用ACE OleDb 12.0引擎查询Microsoft Access 2010数据库。由于我有大约60个可能的并行线程(我在阅读本文后为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
有时看似随机,我在调用connection.Query
System.AccessViolationException in System.Data.dll
得到一个System.AccessViolationException in System.Data.dll
。这个异常应该是由非托管代码引发的,但是我没有直接使用非托管代码,所以它在调用Query
之后发生。我还想确保它不是一个明显与多线程相关的问题,但是,如果我正确理解文档,则每个查询使用一个IDbConnection
应该是线程安全的,并且Dapper也应该是线程安全的。
错误并不总是发生在同一查询或POCO类型上,并且它可能不是硬件问题(CPU <50%,内存<75%且我的进程不超过250 MB)。我还没有看到SqlConnection
到SQL Server上类似代码的问题。
另外,我正在使用VS Express 2012,所以即使我配置了“Break on exception”,我也无法使用Exception Assistant进行故障排除。我显然不希望在堆栈中捕获异常,因为它是一个与内存相关的异常(因为我不想捕获OutOfMemoryException)。
难道我做错了什么?有没有办法调试这个,因为它只是不时发生?这可能是Dapper或OleDb引擎的错误吗?
我怀疑问题是有多个线程命中Access DB。据我所知, MS Access
不是为multi-threaded
应用程序设计的,因为它对并发性有限制。
关于它的文档不多,但它here
提到MS Access不是为高压力和高并发性而设计的。
编辑 :根据评论
SSIS data flow to manipulate the data
,可能使用.Net代码的脚本任务Reactive Extensions
用于大型2gb CSV文件,使用缓冲区来传输数据。因此,如果您可以将ms访问数据转储为CSV,则可以在内存中运行类似的过程。