2010-08-10 164 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!