我正在开发一些连接到MS Access数据库后端(.mdb
)以读取/插入/更新记录的应用程序。
一切正常,但我注意到我的数据库操作非常慢。后端由其他用户访问,但在查询访问文件的副本时仍然遇到问题,而该文件没有其他用户连接。
我设法将其缩小,以便我现在可以看到违规代码是行
connection.Close()
在刚刚执行了一些查询的开放OleDBConnection
上调用,例如:
var con = new OleDbConnection(connectionString);
con.Open();
var query = "SELECT * FROM subGRCReceived WHERE GRVNo=@grv";
var args = new DynamicParameters();
args.Add("@grv", grvNumber);
// Using Dapper
var pallets = (List<Pallet>)con.Query<Pallet>(query, args);
con.Close(); // This is often taking between 7-10 seconds
我可以确认在使用using
/ con.Close()
/ con.Dispose()
时发生这种情况,使用或不使用Dapper
没有任何区别。
我注意到这似乎只发生在基于Web的prjojects(ASP MVC
或WCF
soap服务)而不是控制台应用程序。这个问题似乎是间歇性的,但经常发生,因为它对用户来说是一种痛苦(特别是当导航到页面使用2-3个数据库查询时,因为加载时间可能长达20秒)。
问题不在于代码本身,因为我能够在与服务器相同的网络上托管我的笔记本电脑上的相同应用程序并且速度是完美的(每个请求约200ms)。请参阅以下两台机器的规格:
MaxBufferSize
键值从0增加(这是否需要重新启动?)GC.Collect()
之前测量运行Close()
所需的时间,以确保它不是垃圾收集器我尝试从一个新线程调用Close()
,这似乎在1个请求之后工作,但如果我再次尝试访问该应用程序,我在服务器上收到未处理的win32错误(即使我包裹了我的线程并且{ {1}}中的{1}}调用。我怀疑这可能会失败,因为线程可能需要7秒才能关闭连接,但IIS工作进程在此之前被终止,因此可能会有一些缺少的资源{{ 1}}需要。如果我可以使用它可能会很好,但我明白这是我在MVC中的不良做法,并且实际上并没有解决问题。
我也可以只有1 connection.Close()
并在整个会话期间保持开放状态。我使用WCF服务(每个请求1个连接)做了这个并且它可以找到,但是我感觉它与ASP MVC不能很好地工作,并且经过一些研究后看起来这不是一个好主意。
我一直在为这个问题苦苦挣扎一个星期,它让我发疯,有没有人有任何建议?