데이터베이스에 / 데이터베이스에서 일부 객체를 저장 / 검색하는 작업을 수행하는 여러 클래스 (리포지토리)가 있습니다. 모두 하나의 데이터베이스에 연결해야합니다.
나는 다시 정의하는 것을 방지하기 위해 생각 ConnectionString
과를 SqlConnection
그들에게 열려있는 연결을 전달, 각 클래스에서. 그렇다면 언제 어디서 언제 해당 연결을 정의 / 열고 클래스에 전달할 수 있습니까?
이 공통 자원에 액세스 할 수있는 더 나은 접근 방법 / 패턴이 있습니까?
답변
각 클래스에 공개 연결을 전달하는 것이 가장 좋은 아이디어는 아닙니다. 데이터베이스 연결 작성을 읽으십시오 -한 번 또는 각 쿼리마다 수행합니까?
열린 연결을 리포지토리에 전달하는 대신 실행하려는 각 쿼리마다 연결을 열고 닫는 것이 좋습니다.
연결 관리에 도움이되도록 이와 같은 방법을 시도해 볼 수 있습니다.
public class Repository
{
private readonly string _connectionString;
public Repository()
{
_connectionString = ConfigurationManager.ConnectionStrings["connString"].ConnectionString
}
protected SqlConnection GetConnection()
{
return new SqlConnection(_connectionString);
}
}
public sealed class UserRespository : Repository
{
public User GetUsers()
{
using (var connection = GetConnection())
{
using (var commnad = new SqlCommand("SqlQuery", connection))
{
//Execute Query
//Return results
}
}
}
}
답변
열린 연결을 가지고 클래스간에 전달하는 것은 일반적으로 나쁜 생각입니다. 물론 연결을 여는 것은 성능에 상당한 영향을 미치지 만 이미 열린 연결을 재사용하여 연결 풀에서 이미 처리했습니다. 그러나주의 사항 : 항상 connection.Open()
멀티 스레드 코드에서 가능한 한 오랫동안 호출 하면 메소드에 대한 연결이 할당되므로 데이터베이스에 대한 열린 연결의 필요량을 증가시킬 수 있기 때문에 항상 대기 하십시오.
클래스를 가능한 한 일반적으로 만들려면 IDbConnection을 사용하여 메소드를 노출하는 기본 클래스를 사용하는 것이 좋습니다. 저장소에는보다 일반적인 구현이 있습니다.
internal abstract class Repository
{
private static readonly string ConnectionString = ConfigurationManager.ConnectionStrings["myconnectionstring"].ConnectionString;
protected IDbConnection GetConnection()
{
return new SqlConnection(ConnectionString);
}
}
public class MyRepository : Repository
{
public IEnumerable<object> Get()
{
using (var connection = GetConnection())
{
connection.Open();
...
}
}
}