我有一个用连接字符串初始化的类,类中的各种函数使用它来访问引用的 SQL 数据库。目前,该类将传入的 ConnectionString 存储在私有只读字符串中。
因为我在函数中写了第一百次 using 语句:
using (SqlConnection SQLCon = new SqlConnection(_ConnectionString))
我想知道将连接字符串实际存储在私有只读 SqlConnection 中而不是字符串形式会更好吗?我猜这会节省多次创建 SqlConnection 的成本,代价是 SqlConnection 对象与字符串的内存使用量稍微多一点?
这是否也有利于后台运行的连接池和垃圾清理进程?
我是否正确,无论池和 GC 是否有好处,这都是更好的方法??
如果我这样做了,使用 using 语句来实际使用连接是否仍然有益,或者这会被视为愚蠢,我应该每次都使用 .Open() 和 .Close() 吗?
using(_SqlCon)
{
_SqlCon.Open();
...
}
不,尝试重新使用同一个连接对象不是一个好主意。出于一个原因,在
using
块结束后,连接被 disposed 并且不再可用。另一方面,if 强制您在应用程序中串行运行所有查询,并行工作的可能性有限。所以你可能会想要根本没有using
块,而这也是一个错误。
你可以做的是有一个快捷的方法来返回一个新的连接:
public static class DB
{
public static SqlConnection CreateCn()
{
return new SqlConnection(_connectionString);
}
}
然后问题中的第一个片段可以简化为:
using var SQLCon = DB.CreateCn();
我可能还会在名称中拼出完整的
Connection
,因为您可以在 IDE 中完成以保持快速打字。
但我倾向于更进一步,并将这种方法设为 private,这样所有数据库访问都必须作为此类的一部分进行。然后我将在此处构建一个公共方法来包装每个查询,因此应用程序的其余部分将调用像
DB.SomeQuery()
这样的代码,并且您永远不会在主应用程序中看到 SQL 字符串。随着应用程序的增长,我也可能将它分解成一个单独的程序集,这样我就可以有额外的类来对不同的区域进行逻辑分组,但仍然限制对核心连接的访问。