2010-08-10 8 views
0

나는 ASP.Net MVC 2, Ninject2, NoRM (http://github.com/atheken/NoRM) 및 MongoDB와 Rob의 mvc startesite http://mvcstarter.codeplex.com/을 사용하고 있습니다. 그것은 너무 빨리 작동하고 개발은 더 빠르지 만 커다란 문제에 직면하고 있습니다. 어떤 점에서는 연결 시간이 초과되었습니다. 나는 내가 뭘 잘못하고 있는지 알 수 없다.Norm.MongoException : 연결 풀에서 연결을 시도하는 연결 시간 초과가

나는 이미 여기에 질문을했습니다 : I get this error that I don't understand why, using NoRM and Mongo in my MVC project 그리고 여기 http://groups.google.com/group/norm-mongodb/browse_thread/thread/7882be16f030eb29 그러나 나는 여전히 어둠 속에 있습니다.

도움을 주셔서 감사합니다.

수정 됨 * 여기 내 MongoSession 객체의 : 공용 클래스 MongoSession : ISession {

private readonly Mongo _server; 

    public MongoSession() 
    { 
     //this looks for a connection string in your Web.config - you can override this if you want 
     _server = Mongo.Create("MongoDB"); 
    } 

    public T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class { 
     return _server.GetCollection<T>().AsQueryable().Where(expression).SingleOrDefault(); 
    } 

    public IQueryable<T> All<T>() where T : class { 
     return _server.GetCollection<T>().AsQueryable(); 
    } 

    public void Save<T>(IEnumerable<T> items) where T : class { 
     foreach (T item in items) { 
      Save(item); 
     } 
    } 

    public void Save<T>(T item) where T : class { 
     var errors = DataAnnotationsValidationRunner.GetErrors(item); 
     if (errors.Count() > 0) 
     { 
      throw new RulesException(errors); 
     } 
     _server.Database.GetCollection<T>().Save(item); 
    } 

    public void Delete<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T : class 
    { 
     var items = All<T>().Where(expression); 
     foreach (T item in items) 
     { 
      Delete(item); 
     } 
    } 

    public void Delete<T>(T item) where T : class 
    { 
     _server.GetCollection<T>().Delete(item); 
    } 

    public void Drop<T>() where T : class 
    { 
     _server.Database.DropCollection(typeof(T).Name); 

    } 

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


} 

그리고 지금 내 MongoRepositoryBase

public abstract class MongoRepositoryBase<T> : ISession<T> where T : MongoObject 
{ 
    protected ISession _session; 

    protected MongoRepositoryBase(ISession session) 
    { 
     _session = session; 
    } 

    public T Single(ObjectId id) 
    { 
     return _session.All<T>().Where(x => x.Id == id).FirstOrDefault(); 
    } 

    public T Single(Expression<Func<T, bool>> expression) 
    { 
     return _session.Single(expression); 
    } 

    public IQueryable<T> All() 
    { 
     return _session.All<T>(); 
    } 

    public void Save(IEnumerable<T> items) 
    { 
     foreach (T item in items) 
     { 
      Save(item); 
     } 
    } 

    public void Save(T item) 
    { 
     _session.Save(item); 
    } 

    public void Delete(System.Linq.Expressions.Expression<Func<T, bool>> expression) 
    { 
     var items = _session.All<T>().Where(expression); 
     foreach (T item in items) 
     { 
      Delete(item); 
     } 
    } 

    public void DeleteAll() 
    { 
     var items = _session.All<T>(); 
     foreach (T item in items) 
     { 
      Delete(item); 
     } 
    } 

    public void Delete(T item) 
    { 
     _session.Delete(item); 
    } 

    public void Drop() 
    { 
     _session.Drop<T>(); 
    } 

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

와 다른 저장소 implemantation의 exemple :

public class PlaceRepository : MongoRepositoryBase<Place>, IPlaceRepository 
{ 
    public PlaceRepository(ISession session) : base(session) 
    { 
    } 

    public List<Place> GetByCategory(PlaceCategory category, bool publishedOnly) 
    { 
     var query = _session.All<Place>() 
      .OrderBy(x => x.Name) 
      .Where(x => x.Category == category); 

     if (publishedOnly) query = query.Where(x => x.Published); 
     if (publishedOnly) query = query.Where(x => x.ShowOnMap); 

     return query.ToList(); 
    } 

    public Place FindByName(string name) 
    { 
     var query = _session.All<Place>() 
      .Where(x => x.Name.ToLower().Contains(name.ToLower())) 
      .Where(x => x.Published); 

     return query.FirstOrDefault(); 
    } 

    public string[] FindSuggestionsByName(string name) 
    { 
     var query = _session.All<Place>() 
      .OrderBy(x => x.Name) 
      .Where(x => x.Name.ToLower().StartsWith(name.ToLower())) 
      .Where(x => x.Published); 

     var places = query.ToList(); 

     var names = new string[places.Count]; 
     var i = 0; 
     foreach (var place in places) 
     { 
      names[i++] = place.Name; 
     } 

     return names; 
    } 


} 
+0

[MVC 프로젝트에서 NoRM과 Mongo를 사용하는 이유를 이해하지 못하는이 오류가 발생하기 쉽습니다.] (http://stackoverflow.com/questions/3159811/i-get- 이 - 오류 - 그 - 난 - 이해 - 왜 - 사용 - 표준 및 몽고 -에서 - 내 - mvc - proj) – jfar

+0

알다시피,이 날 미친 운전! 나는 다른 제목과 다른 설명과 키워드로 어쩌면 내가 도와 줄 사람을 찾을 수 있었다. 나는 더 많은 코드를 추가했다. – VinnyG

답변

0

Vinny,

저는 Ninject를 한번도 사용하지 않았으므로이 제안을하는 것이 좋습니다. 하지만 정적 인 MongoSession 인스턴스를 가지고 있으면 연결이 열려있을 수 있습니다. SingletonBehavior 대신 TransientBehavior를 사용해 보셨습니까? 또는 ShortcutLinks를 List로 변환 한 후 Dispose를 호출하거나 사용하여 코드를 변경할 수 있습니까? 모두

var shortcutLionks = _session.All<ShortcutLinks>().ToList(); 
_session.Dispose(); 

더 나은 방법은 세션 세부 정보가 컨트롤러에서 숨겨져있는 일종의 저장소 또는 DAO를 사용하는 것입니다. RepositoryBase 샘플은 http://www.codevoyeur.com/Articles/20/A-NoRM-MongoDB-Repository-Base-Class.aspx입니다.

스튜어트 해리스 http://red-badger.com/Blog/post/A-simple-IRepository3cT3e-implementation-for-MongoDB-and-NoRM.aspx

풀링 MongoDB를 연결에서 유사한, 틀림없이 더 완전한 구현이 것은 만들 상대적으로 저렴하므로 데이터 액세스 방법이 이루어지고/데이터 저장 후 폐기되어 있는지 확인하는 것이 가장입니다.

+0

Thx John이 답장을 보내고 TrahsientBehavior를 시도했지만 여전히 동일한 문제가 있습니다. 나는 연결을 닫지 않거나 처리하지 않기 때문에 그 일이 꽤 쉽지만, Ninject가 나를 위해 그것을 할 것을 강요합니다. 나는 당신이 게시물을 찾은 나의 문답 세션을 처리하는 가장 좋은 방법을 찾고있는 동안 youre 포스트와 많이 닮은 기본 리포지토리 클래스를 가지고있다. 나는 여전히 같은 문제가 있는지 오늘 밤이나 내일 아침에 시도 할 것이다. . – VinnyG

0

새로운 NotImplementedException()을 추가하면; 내 MongoRepositoryBase 클래스의 폐기() 메소드에 그렇게 전화되지 않습니다 내가 내 컨트롤러는 전화가 나올까요에서

protected override void OnActionExecuted(ActionExecutedContext filterContext) 
     { 
      _recipeRepo.Dispose(); 
      base.OnActionExecuted(filterContext); 
     } 

이 있다면 나는 Ninject에 나를 위해이 문제를 처리하지 않습니다 같아요. 그것은 좋은 것, thx 보인다!

관련 문제