【问题标题】:C# Close() or using/Dispose() frequently used SQLite objectC# Close() 或 using/Dispose() 常用 SQLite 对象
【发布时间】:2016-09-28 17:32:36
【问题描述】:

有时我看到人们喜欢在使用后丢弃任何东西,无论它们被使用的频率如何(可能与 SQLite 问题无关,但我现在正在处理 SQLite,我很困惑)——或者也许我错了。这给我造成了极大的困惑。

例如(取自别处):

using(var con = new SQLiteConnection(conString))
using(var cmd = new SQLiteCommand(con))
{
    con.Open();
    // ...
} // also closes the connection

我的问题是,我是否应该将SQLiteConnectionSQLiteCommand 对象存储在字段中,并使用.Open().Close() 方法来处理数据库连接,而在应用程序终止之前根本不处理它们——或者将它们放入垃圾收集器中,好像在我看来这不是一个优雅的想法?

编辑:如果有人说处置,那为什么呢?我需要更好的答案,我需要真正的原因,而不是因为汇集等等。我需要知道除了人为错误之外可能出现的确切问题,并提供示例或示例链接。

例如类字段:

private static SQLiteConnection sQLiteConnection; /// <summary>SQLiteConnection.</summary>
public static SQLiteConnection SQLiteConnection { get { return sQLiteConnection; } }

private static SQLiteCommand sQLiteCommand; /// <summary>SQLiteCommand.</summary>
public static SQLiteCommand SQLiteCommand { get { return sQLiteCommand; } }

私有字段是用私有方法初始化的,并且对象将被重用而不释放它们;因此是只读属性。

编辑 2:为了更清楚地说明,你们是不是误读了?我说的是“重用”。这意味着创建了一个,并将其存储在该字段的某个位置以供重复使用。我将它存储在静态类的静态字段中,以便在应用程序关闭之前重复使用。告诉我,我为什么要丢弃它?

为什么,做,我,有,去,处置,它?如果,我,要“重用”,它呢?为什么?

【问题讨论】:

  • 尝试重用 DBCommand 对象可能会导致各种问题 - 通常以 SO 问题结束。 DBConnection 对象有点不同,并且更多地取决于应用程序/数据库,但一般来说,连接池意味着您不会节省太多尝试重用它们的时间。
  • 一般来说,您希望在尽可能小的范围内创建、使用和销毁外部依赖项。如果创建这些对象是一个 heavy 操作(可能不是),那么您可以研究某种重用。但这会打开各种各样的蠕虫罐头,如果您不尝试在不同的操作/范围内重用相同的依赖对象,这些蠕虫不会成为问题。
  • like to dispose just anything after use 喜欢他们的应用不要泄露的人。如果某物有 Dispose 方法,则需要在完成后将其处理掉
  • 嗯,例如,什么样的问题,以及它们是如何泄漏的?我已经搜索了论坛,他们所说的只是去处理它们,汇集和诸如此类的东西。没有人真正具体提到这种情况会引起什么问题——或者我可能没有环顾四周。
  • 还有什么种类的?这个地方很糟糕,有关于开放数据读取器、愚蠢、莫名其妙的 SQL 错误和资源耗尽问题的问题,这些问题要么来自草率的编程,要么是因为有人认为构建一个 DB 帮助器类来重用不应该重用的东西会很酷。很难想象比 DBCommand 对象更难重用的东西。

标签: c# sqlite


【解决方案1】:

连接由 .NET 汇集,因此创建它们通常不是一项昂贵的操作。使用“标准”方法通常比尝试跟踪连接是打开还是关闭等要干净得多。

除非您有可衡量的连接问题,否则我会坚持创建、使用和处理它们的惯用方法。

【讨论】:

  • 据我所知,SQLite 支持连接池。 Same as Microsoft Access OleDB :-(
  • The .NET Framework Data Provider for OLE DB automatically pools connections using OLE DB session pooling. link 不过,对基于文件的数据库使用相同的连接可能会有一些好处。
  • @UweKeim 是的,这两个都可以。对于 OleDB,不能同时使用 ODBC 连接池和 OleDB 资源池,但可以选择其中之一。
  • @UweKeim 老实说,我从来没有使用过 SQLite,所以我无法具体说明它,但是 OleDB 连接(包括 Access)是由 .NET 汇集的 - 您回答中的知识库文章指的是OLE-DB 和 ASP 使用不同于 ADO.NET 的池化机制。
  • 我的观点是:SQLite 和 Access 确实支持连接池。 See my (probably naive but at least comparable) test results 类似主题。
猜你喜欢
  • 2011-11-23
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
  • 2011-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多