OleDBConnection.Close()在服务器

时间:2017-06-14 11:36:32

标签: c# asp.net-mvc wcf ms-access oledb

我正在开发一些连接到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 MVCWCF soap服务)而不是控制台应用程序。这个问题似乎是间歇性的,但经常发生,因为它对用户来说是一种痛苦(特别是当导航到页面使用2-3个数据库查询时,因为加载时间可能长达20秒)。

问题不在于代码本身,因为我能够在与服务器相同的网络上托管我的笔记本电脑上的相同应用程序并且速度是完美的(每个请求约200ms)。请参阅以下两台机器的规格:

笔记本电脑详情:

  • 处理器:Intel Core i7-6700HQ CPU @ 2.60GHz
  • RAM:16.0 GB
  • 操作系统:Windows 10 x64

服务器详细信息

  • 处理器:Intel Xeon CPU E5-2603 v4 @ 1.70GHz(2个处理器)
  • RAM:32.0 GB
  • 操作系统:Windows Server 2012 x64

设置

  • 32位MS Access 2016
  • 2016 Microsoft ACE OLE引擎
  • 64 it OS

我尝试了什么

  • 将数据库移至与应用程序
  • 相同的文件夹
  • 已禁用防病毒软件(ESET)
  • 在注册表中的Access Connectivity Engine中将MaxBufferSize键值从0增加(这是否需要重新启动?)
  • 在调用GC.Collect()之前测量运行Close()所需的时间,以确保它不是垃圾收集器

的变通方法

线程

我尝试从一个新线程调用Close(),这似乎在1个请求之后工作,但如果我再次尝试访问该应用程序,我在服务器上收到未处理的win32错误(即使我包裹了我的线程并且{ {1}}中的{1}}调用。我怀疑这可能会失败,因为线程可能需要7秒才能关闭连接,但IIS工作进程在此之前被终止,因此可能会有一些缺少的资源{{ 1}}需要。如果我可以使用它可能会很好,但我明白这是我在MVC中的不良做法,并且实际上并没有解决问题。

持久连接

我也可以只有1 connection.Close()并在整个会话期间保持开放状态。我使用WCF服务(每个请求1个连接)做了这个并且它可以找到,但是我感觉它与ASP MVC不能很好地工作,并且经过一些研究后看起来这不是一个好主意。

我一直在为这个问题苦苦挣扎一个星期,它让我发疯,有没有人有任何建议?

0 个答案:

没有答案