[SQL] 수동 가까이 SqlDataReader 개체의 처분 할 필요가 있습니까?
SQL수동 가까이 SqlDataReader 개체의 처분 할 필요가 있습니까?
여기 레거시 코드로 일하고 있어요 및 폐쇄하거나 배치 않습니다 SqlDataReader 개체의 많은 경우가있다. 연결이 나는 확실히 그것을 수동으로 독자를 관리하기 위해 필요한 경우 아니다, 닫혀 있지만.
이 성능 저하가 발생할 수 있을까요?
해결법
-
==============================
1.이 같은 독자를 사용하지 않도록하십시오 :
이 같은 독자를 사용하지 않도록하십시오 :
SqlConnection connection = new SqlConnection("connection string"); SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection); SqlDataReader reader = cmd.ExecuteReader(); connection.Open(); if (reader != null) { while (reader.Read()) { //do something } } reader.Close(); // <- too easy to forget reader.Dispose(); // <- too easy to forget connection.Close(); // <- too easy to forget
대신 문을 사용하여 그들을 포장 :
using(SqlConnection connection = new SqlConnection("connection string")) { connection.Open(); using(SqlCommand cmd = new SqlCommand("SELECT * FROM SomeTable", connection)) { using (SqlDataReader reader = cmd.ExecuteReader()) { if (reader != null) { while (reader.Read()) { //do something } } } // reader closed and disposed up here } // command disposed here } //connection closed and disposed here
using 문은 개체의 정확한 처리를 보장하고 자원을 해제합니다.
당신은 당신이 걸릴 수 가비지 컬렉터, 최대 청소를 떠나 잊어 버린 경우.
-
==============================
2.SqlDataReader 개체를 배치하는 것은를 SqlCommand.ExecuteReader를 (사용하여 인스턴스화하는 것이 주) 닫지 / 기본 연결을 처리합니다.
SqlDataReader 개체를 배치하는 것은를 SqlCommand.ExecuteReader를 (사용하여 인스턴스화하는 것이 주) 닫지 / 기본 연결을 처리합니다.
일반적인 두 가지 패턴이있다. 제에서, 리더가 개방되고, 연결의 범위 내에서 폐쇄 :
using(SqlConnection connection = ...) { connection.Open(); ... using(SqlCommand command = ...) { using(SqlDataReader reader = command.ExecuteReader()) { ... do your stuff ... } // reader is closed/disposed here } // command is closed/disposed here } // connection is closed/disposed here
때로는 데이터 액세스 방법은 연결을 열고 독자를 반환하도록 편리합니다. 이 경우는 마감이 / 독자를 폐기하는 것은 기본 연결을 닫습니다 있도록 반환 독자가, 위해 CommandBehavior.CloseConnection을 사용하여 열 것이 중요합니다. 패턴은 다음과 같은 :
public SqlDataReader ExecuteReader(string commandText) { SqlConnection connection = new SqlConnection(...); try { connection.Open(); using(SqlCommand command = new SqlCommand(commandText, connection)) { return command.ExecuteReader(CommandBehavior.CloseConnection); } } catch { // Close connection before rethrowing connection.Close(); throw; } }
및 호출 코드는 이렇게 독자를 처리 할 필요가 :
using(SqlDataReader reader = ExecuteReader(...)) { ... do your stuff ... } // reader and connection are closed here.
-
==============================
3.안전하려면 사용 성명에서 모든 SqlDataReader 개체 개체를 래핑.
안전하려면 사용 성명에서 모든 SqlDataReader 개체 개체를 래핑.
-
==============================
4.그냥 문을 "사용"하여 SqlDataReader 개체를 래핑. 그건 당신이 문제의 대부분의주의를 기울여야한다.
그냥 문을 "사용"하여 SqlDataReader 개체를 래핑. 그건 당신이 문제의 대부분의주의를 기울여야한다.
from https://stackoverflow.com/questions/744051/is-it-necessary-to-manually-close-and-dispose-of-sqldatareader by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] FULL OUTER SQLite는 함께 가입 (0) | 2020.04.03 |
---|---|
[SQL] 어떻게 SQL Server 2008의 복합 기본 키를 만들 수 있습니다 (0) | 2020.04.03 |
[SQL] SQL 문자열에 이스케이프 앰퍼샌드 문자 (0) | 2020.04.03 |
[SQL] 어떻게 SQL Server에서 월의 일 수를 결정하기 위해? (0) | 2020.04.03 |
[SQL] 두 번 같은 테이블에 가입하는 가장 좋은 방법은 무엇입니까? (0) | 2020.04.03 |