8

저는 MongoDB와 NoSQL에 대해 매우 익숙합니다. MongoDB/Norm/ASP.NET MVC 3으로 사이트를 구축하기 시작했습니다.언제 MongoDB 연결을 열고 닫아야합니까?

Mongo 데이터베이스에 연결 범위를 지정해야하는 지 궁금합니다. .

바로 지금 내가 MongoSession을 instanciases하고 onActionExecuted 내가 그것을 파기 그래서 내 모든 파생 컨트롤러는 내 MongoSession에 액세스 할 수 있습니다 Basecontroller있다. MongoSession 클래스는 생성자에서 연결을 열고 오늘 작동하는 방식 인 Dispose()에 처리 클래스를 배치합니다.

private IMongo _mongo; 

public MongoSession() 
{   
    _mongo = Mongo.Create("connString");  
} 

public void Dispose() 
{ 
    _mongo.Dispose(); 
} 

컨트롤러에서 다른 작업을하고있는 경우 연결이 너무 길어질 수 있습니다.

너무 많은 연결을 열어 두는 것을 위험에 빠뜨리지 않는 접근 방법입니까, 아니면 아래의 예제 방법과 비슷한 것을해야합니까?

public void Add<T>(T item) where T : class, new() 
    { 
     using (var mongo = Mongo.Create("connString")) 
     { 
     mongo.GetCollection<T>().Insert(item); 
     } 
    } 

또 다른

후속 질문은 : 개방과 규범을 통해 MongoDB의 연결을 닫는

"비싼"작업?

+0

놈은 거의, 더 이상 유지되지되고있다. –

+0

코드에서 연결을 열고 닫는이 질문 옆에 인터넷 연결 공급자 연결에 문제가있어서 EndOfStreamException이있는 코드가 있습니다. settings.MaxConnectionIdleTime = TimeSpan.FromSeconds (30);를 사용하여 문제를 해결했습니다. https://stackoverflow.com/a/44606284/194717 – Tony

답변

8

연결을 다시 만들면 비용이 많이 들기 때문에 연결을 열어 둡니다. Mongo는 오랜 기간 동안 많은 연결을 통해 문제없이 사용할 수 있습니다. 이상적인 것은 응용 프로그램의 모든 부분과의 연결을 지속적인 연결로 공유하는 것입니다. C# 드라이버는 내부적으로 연결을 재사용하게하는 "연결 풀링"을 사용하므로 너무 많은 연결을 만들지 않도록이 작업을 수행 할만큼 충분히 영리해야합니다. "서버 연결은 자동으로 뒤에서 처리됩니다 (연결 풀을 사용하여 효율성을 높입니다)."

환호, Derick

+1

동의. 실제로 MongoSession 클래스를 작성하지 않아도됩니다. 응용 프로그램 범위에 MongoServer 인스턴스를 저장하는 것이 적절할 것입니다. MVC 응용 프로그램이 닫힐 때 단 한번만이 인스턴스에서 Disconnect()를 호출해야합니다. –

+0

@Sean 연결을 닫을 때 유용한 정보를 보내 주셔서 감사합니다. –

2

당신은 연결을 전화 또는

는 C# 드라이버가 효율적으로 서버에 연결을 사용하는 연결 풀을 가지고 분리 할 필요가 없습니다. 연결 또는 연결 끊기를 호출 할 필요가 없습니다. 드라이버가 연결을 처리하게하십시오 (Connect 호출은 무해하지만 연결 풀의 모든 연결을 닫으므로 연결 끊기는 좋지 않습니다). 당신은 LINQ 지원이 그 위에 FluentMongo와 공식 몽고 드라이버로 이동하려는 경우

http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-csharp-driver/

+0

링크 (지금)는 아무 것도 언급하지 않고 여러 다른 페이지의 부모 페이지 일뿐입니다. – danio