我正在开发几个连接到MS数据库后端(.mdb)的应用程序来读取/插入/更新记录。
一切正常,但我注意到我的db操作非常慢。后端由其他用户访问,但在查询没有其他人连接的访问文件副本时,我仍然会遇到问题。
我设法缩小了范围,这样我就可以看到违规的代码是行了。
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 db查询,因为加载时间可能长达20秒)。
问题不在于代码本身,因为我能够在与服务器相同的网络上在笔记本上承载相同的应用程序,而且速度是完美的(每个请求大约200 as )。请参阅以下两台机器的规格:
MaxBufferSize键值从0增加(这需要重新启动吗?)GC.Collect()之前测量运行Close()所需的时间,以确保它不是垃圾收集器我尝试从一个新线程调用Close(),这个线程似乎在1次请求后才能工作,但是如果我再次尝试访问应用程序,服务器上会出现未处理的win32错误(即使我用try/catch包装了线程和connection.Close()调用)。我怀疑这可能是失败的,因为线程可能需要7秒才能关闭连接,但是resources进程在此之前就会终止,因此Close()可能需要一些缺少的资源。如果我能做到这一点,可能会很好,但我知道这是我在MVC中的糟糕实践,而且也没有真正解决这个问题。
我也可以只有一个OleDBConnection,并在整个会话中保持打开。我是在WCF服务(每个请求一个连接)中这样做的,它可以找到,但是我觉得它在ASP.MVC中不能很好地工作,在做了一些研究之后,看起来这不是一个好主意。
我已经为这件事挣扎了一周了,它让我发疯了,有人有什么建议吗?
发布于 2018-08-22 05:04:50
以我的经验来看,
其中一个access数据库超过20000条记录,大小约为150 MB。它开始放慢速度,性能急剧下降。所以移到了SQL。
您可以考虑使用SQL紧凑版或sql lite。
https://dba.stackexchange.com/questions/176257
复制相似问题