2010-08-10 238 views
0

我使用Rob的mvc startesite http://mvcstarter.codeplex.com/與ASP.Net MVC 2,Ninject2,NoRM(http://github.com/atheken/NoRM)和MongoDB。它的工作速度非常快,開發速度更快,但我面臨一個大問題,我在某些時候會遇到連接超時。我無法弄清楚我做錯了什麼。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但我仍然在黑暗中。

非常感謝您的幫助!

EDITED * 這裏是我的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的爲例:

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-這錯誤,我不知道爲什麼使用規範和mongo在我的mvc項目) – jfar 2010-08-10 17:13:54

+0

我知道,這是讓我瘋了!我用另一個標題和不同的解釋和關鍵字,也許我可以找到人來幫助我......我添加了更多的代碼。 – VinnyG 2010-08-10 23:03:11

回答

0

Vinny,

我從來沒有使用過Ninject,所以我可以在這個建議之外解決。但是看起來可能有一個靜態的MongoSession實例可能會使連接處於打開狀態。你是否嘗試過使用TransientBehavior而不是SingletonBehavior?或者,也可以在將快捷鏈接轉換爲列表後,更改代碼以調用Dispose(或使用)?所有

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

一個更好的辦法可能是使用某種其中會話細節從控制器隱藏庫或DAO的。我在http://www.codevoyeur.com/Articles/20/A-NoRM-MongoDB-Repository-Base-Class.aspx有一個RepositoryBase示例。

斯圖爾特·哈里斯在http://red-badger.com/Blog/post/A-simple-IRepository3cT3e-implementation-for-MongoDB-and-NoRM.aspx

彙集MongoDB的連接類似,可以說是更完整的實現相對便宜打造,因此它可能是最好的,以確保數據訪問方法你做獲取/保存數據後處置。

+0

Thx約翰的答覆,我試過TrahsientBehavior,我仍然有同樣的問題。我非常喜歡這是因爲我沒有關閉或處理我的連接,但我努力讓Ninject爲我做到這一點。我有一個基礎知識庫類,看起來很像你的帖子,而尋找最好的方式來處理我的mongo會話,我發現你後,我會嘗試它今晚或明天早上,看看我是否仍然有同樣的問題。 – VinnyG 2010-08-10 22:53:18

0

如果我添加新的NotImplementedException();在我MongoRepositoryBase類的Dispose()方法,它不會打電話,所以我想Ninject不處理這對我來說,如果我有

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

在我的控制器它得到調用。這似乎很好,thx!

相關問題