【问题标题】:How to properly close connection to access database如何正确关闭访问数据库的连接
【发布时间】:2012-03-29 17:57:48
【问题描述】:

目前我们的代码如下所示

   public void Close(bool saveChange)
    {
        if ((_Connection != null) && (_Connection.State == System.Data.ConnectionState.Open))
        {

            _Connection.Close();
            _Connection.Dispose();
            _Connection = null;
            GC.Collect();
        }
    }

需要 GC.Collect() 才能正确关闭文件并删除所有 .ldb 文件。 是否可以在不调用 GC 的情况下关闭 db 文件并立即删除所有临时 .ldb 文件?

【问题讨论】:

  • 你是问还是说?如果这不是问题,则不应将其作为一个问题发布。
  • 还有什么问题?您能否重新表述问题或指出不符合您要求的方面?
  • 因调用 GC.Collect 并提出一个废话解释为什么需要它而被解雇。严重地。不是那样的。
  • 我希望你能找到一份新工作,汤姆
  • 我相信@TomTom 的意思是为此被解雇了。

标签: c# database ms-access garbage-collection database-connection


【解决方案1】:

作为实现IDisposable 的每个类,您应该使用using-statement 来处理对象。在这种方式下,连接也会关闭。

例如:

using(var conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Server.MapPath("Pets/Pets.mdb")))
{
     conn.open();
     // do something with it
}

您还应该阅读this,因为您使用连接的方式可以得到改进。 根据经验:始终在同一位置创建、打开、使用和关闭连接,并让ADO.NET connection pool 管理底层连接。

【讨论】:

  • 其实这就是使用 GC 的原因。默认连接池行为看起来有点不可预测。如果需要在关闭连接后立即删除/重命名 db 文件,临时 .ldb 文件会导致问题
  • @Ask:然后看看这个答案(或其他答案)以找到解决您问题的方法:stackoverflow.com/a/1016027/284240
【解决方案2】:

如果您有一个在多个入口点使用数据的类。 你必须保持连接打开。 (因此不能使用 using(Connection x=...){} 语句)

.

你的类也应该继承 IDisposable 并实现

void Dispose()
{
  this.dbConnection.Dispose();
}

dbConnection.Dispose() 将负责优雅地关闭连接,除非您需要执行一些自定义操作(例如注销、保存缓存信息等...)

无论如何,我赞成@Tim Schmelter 的想法:

  1. 在任何事务后关闭连接。

  2. 连接将缓存在连接池中 => 对性能影响不大。

【讨论】:

    【解决方案3】:

    调用 GC.Collect() 可能不是最好的解决方案,因为这种方法会收集所有的“垃圾”。您可能会发现使用 using 关键字非常有帮助。例如

    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        connection.Open();
        // Do work here.
    }
    

    就在你的 using 块之后,连接对象将被释放!

    使用连接msdn

    使用关键字,msdn

    【讨论】:

    • 实际上调用 GFC.Collect 是徒劳的,因为它会阻止 GC 统计收集并产生严重的负面影响。
    • ldb 文件在这种情况下仍然存在一段不可预测的时间
    【解决方案4】:

    连接。关闭(); OleDbConnection.ReleaseObjectPool();

    这最终为我解决了这个问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 1970-01-01
      • 2021-12-21
      相关资源
      最近更新 更多