我正在使用OleDbConnection中的.Net 4.0来使用Access 12.0引擎查询Microsoft 2010数据库。这个进程可能每秒执行大量的查询,因为我有大约60个可能的并行线程(我在读取ThreadPool之后为TPL设置了一个这篇文章限制)。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时得到了一个connection.Query。这个异常应该由非托管代码引发,但我不直接使用非托管代码,因此它发生在对Query的调用之后。我还想确保这不是一个显然与多线程有关的问题,但是,如果我正确地理解了文档,那么每个查询使用一个IDbConnection应该是线程安全的,而Dapper也应该是线程安全的。
错误并不总是发生在相同的查询或POCO类型上,硬件可能没有问题(CPU < 50%,内存< 75%,我的进程不超过250 MB)。我还没有看到SqlConnection与Server的类似代码有什么问题。
此外,我正在使用VS Express 2012,所以即使我配置了“中断上的异常”,我也不能使用异常助理来排除故障。显然,我不想在堆栈上捕获异常,因为它是一个与内存相关的异常(因为我不想捕获OutOfMemoryException)。
我做错了什么吗?是否有一种方法来调试这一点,因为它只是不时发生吗?这可能是Dapper或OleDb引擎的错误吗?
发布于 2013-12-03 19:50:50
我怀疑问题可能是有多个线程访问Access DB。据我所知,MS Access 不是为multi-threaded应用程序设计的,因为它对并发性有限制。
上面没有太多的文档,但是它提到了here,MS不是为高压力和高并发性而设计的。
编辑:基于注释
SSIS data flow to manipulate the data,可能对.Net代码使用脚本任务Reactive Extensions,使用缓冲区对数据进行流。因此,如果可以将ms访问数据转储到CSV中,则可以在内存中运行类似的进程。https://stackoverflow.com/questions/20358957
复制相似问题