是否有任何陷阱使用类型<T> 回归类为SQL数据?
-
05-07-2019 - |
题
我的问题是关于SQL连接状况负荷,等等。基于下列代码:
public IEnumberable<MyType> GetMyTypeObjects()
{
string cmdTxt = "select * from MyObjectTable";
using(SqlConnection conn = new SqlConnection(connString))
{
using(SqlCommand cmd = new SqlCommand(cmdTxt, conn))
{
conn.Open();
using(SqlDataReader reader = cmd.ExecuteReader())
{
while(reader.Read())
{
yield return Mapper.MapTo<MyType>(reader);
}
}
}
}
yield break;
}
我可以看到这可能是一个问题,如果有许多正在运行的进程类似的代码长的执行时间迭代之间的综合对象,因为连接,将会开放更长的时间,等等。然而,它也似乎是合理的,这将会减少占用SQL服务器上,因为它只返回时的数据类型的对象是使用。这也降低了存储器的使用上的客户,因为客户只有到负荷的一个实例的指示,同时它的作品,而不是装出现的所有指示(通过循环访问的整个数据读取器和返回的一个清单或某事)。
是否有任何实例可以认为在那里你不会想使用类型以这种方式或任何情况下,你认为它完全适合?
什么样的装载不该把SQL服务器上?
是这东西你会用自己的代码(除任何提及的原则才能享受它的全部好处的亚音速,等等)?
-
解决方案
我不会用它,因为它隐藏什么事情发生,它可能离开的数据库连接,没有适当处理。
连接对象将被关闭,当你有读取过去的记录,并且如果你停止阅读在这之前的连接对象不是设置的。如果例如知道,你总是有十个记录在一个结果只有一个循环读取这些十记录枚举,而不会使第十一读通话,读之外的最后一个项目,连接是不正确关闭。此外,如果你想要只使用的部分结果是,你有没有办法关闭连接不阅读其余的记录。
甚至是内在扩展的调查员可能会导致这甚至如果你seamlingy正确地使用它们:
foreach (MyType item in GetMyTypeObjects().Take(10)) {
...
}
其他提示
这不是一个模式,我将遵循。我不会担心,因为很多关于服务器的负载为我会约锁。以下这种模式集数据检索过程进你的商务逻辑的流动,这似乎是一种全谱用的麻烦;你不知道会发生什么迭代边,而你插入自己进入它。检索的数据在一个拍摄,然后允许客户的代码一一列举在它一旦你已经封闭的读者。
我建议对预优化。在许多情况下,连接将汇集。
我也不期望任何差别载于SQL服务器的查询已经编写,并将运行。
我担心的是,你把自己完全受客户代码。
你已经提到的调用代码的可能的连接的开放更长的时间超过严格必要的,但也有这种可能性,它将永远不会允许的目的是关闭设置的。
所以只要客户的代码使用 foreach
, using
等或明确要求枚举的 Dispose
方法那么你是好的,但没有什么可以阻止它这样做像这样的东西:
var e = GetMyTypeObjects().GetEnumerator();
e.MoveNext(); // open the connection etc
// forget about the enumerator and go away and do something else
// now the reader, command and connection won't be closed/disposed
// until the GC kicks in and calls their finalisers