Moje pytanie dotyczące statusu połączenia SQL, obciążenia itp na podstawie następującego kodu:Czy są jakieś pułapki związane z używaniem typu IEnumerable <T> dla danych 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;
}
widzę to może być problemem, jeśli istnieje wiele uruchomione procesy podobny kod z długich czasów wykonania między iteracji obiekt IEnumerable, ponieważ połączenia będą otwierane dłużej, itp. Wydaje się jednak, że może to zmniejszyć użycie procesora na serwerze SQL, ponieważ zwraca dane tylko wtedy, gdy używany jest obiekt IEnumerable. Obniża także użycie pamięci na kliencie, ponieważ klient musi załadować tylko jedną instancję MyType, podczas gdy działa, zamiast ładowania wszystkich wystąpień MyType (przez iterowanie przez cały obiekt DataReader i zwracanie listy lub coś podobnego).
Czy istnieją przypadki, można myśleć, gdzie nie chcesz używać IEnumerable w ten sposób, czy jakiekolwiek przypadki uważasz, że doskonale pasuje?
Jaki rodzaj obciążenia to stawia na serwerze SQL?
Czy jest to coś, co można użyć we własnym kodzie (z wyjątkiem jakiejkolwiek wzmianki o NHibernate, Subsonic, itp.)?
-
To dobra uwaga, również tego nie uważałem. Jestem tak zaślepiony tym, jak bym go użył! – scottm
@Guffa: Używanie metod rozszerzających, takich jak 'Take', nie byłoby problemem: metoda' GetMyTypeObjects' jest po prostu syntaktycznym cukrem, który tworzy obiekt iteratora 'IDisposable'. 'Take' wywoła metodę iteratora' Dispose', kiedy to zostanie zrobione, a następnie pozbędzie się połączenia, polecenia, czytnika itp. – LukeH
@Guffa: To samo dotyczy innych częściowych odczytów zestawu wyników: Tak długo, jak wywołaj polecenie "Dispose", kiedy skończysz (lub najlepiej po prostu zapakuj wszystko w blok 'using'), a następnie połączenie, polecenie, czytnik itp. zostaną również usunięte. – LukeH