C# Close() 或 using/Dispose() 常用 SQLite 对象
Posted
技术标签:
【中文标题】C# Close() 或 using/Dispose() 常用 SQLite 对象【英文标题】:C# Close() or using/Dispose() frequently used SQLite object 【发布时间】: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
我的问题是,我是否应该将SQLiteConnection
和SQLiteCommand
对象存储在字段中,并使用.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 对象更难重用的东西。
【参考方案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 类似主题。以上是关于C# Close() 或 using/Dispose() 常用 SQLite 对象的主要内容,如果未能解决你的问题,请参考以下文章
C# System.InvalidOperationException on sqlconnection close
c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.ExitThread(); System.Environmen
winform问题,close()方法能关闭窗体吗?谢谢 c#
C#中winform中有啥办法区分Close()和点击窗体右上角关闭按钮来关闭窗体
C# form发起backgroundworker 当form close时 backgroundworker 还会继续工作吗