Asp.net mvc Norm.MongoException:尝试从连接池获取连接时出现连接超时
我将Rob的mvc startesite与ASP.NETMVC2、Ninject2、NoRM和MongoDB一起使用。它工作得如此之快,开发速度甚至更快,但我面临一个大问题,我在某些时候,连接超时。我不知道我做错了什么 我已经在这里问了一个问题:在这里,但我仍然在黑暗中 非常感谢你的帮助 编辑* 这是我的MongoSession对象: 公共类MongoSession:ISession{Asp.net mvc Norm.MongoException:尝试从连接池获取连接时出现连接超时,asp.net-mvc,mongodb,ninject,norm,Asp.net Mvc,Mongodb,Ninject,Norm,我将Rob的mvc startesite与ASP.NETMVC2、Ninject2、NoRM和MongoDB一起使用。它工作得如此之快,开发速度甚至更快,但我面临一个大问题,我在某些时候,连接超时。我不知道我做错了什么 我已经在这里问了一个问题:在这里,但我仍然在黑暗中 非常感谢你的帮助 编辑* 这是我的MongoSession对象: 公共类MongoSession:ISession{ private readonly Mongo _server; public MongoSe
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();
}
}
以及其他存储库实施的示例:
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;
}
}
文尼
我从来没有使用过Ninject,所以我可能会偏离这个建议。但是,有一个静态MongoSession实例可能会使连接保持打开状态。您是否尝试过TransientBehavior而不是SingletonBehavior?或者在您将快捷链接转换为列表后,可能会将代码更改为调用Dispose或using?全部
var shortcutLionks = _session.All<ShortcutLinks>().ToList();
_session.Dispose();
更好的方法可能是使用某种存储库或DAO,其中会话细节对控制器隐藏
Stuart Harris在
池式MongoDB连接的创建成本相对较低,因此最好确保在获取/保存数据后处理数据访问方法。如果我添加throw new NotImplementedException;在我的MongoRepositoryBase类的Dispose方法中,它没有得到调用,因此我想Ninject不会为我处理这个问题,如果我有
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
_recipeRepo.Dispose();
base.OnActionExecuted(filterContext);
}
在我的控制器中,它确实收到呼叫。看起来很好,thx!这很容易-可能是我知道的,这让我发疯了!我认为,通过其他标题、不同的解释和关键字,也许我可以找到人帮助我…我添加了更多代码。thx John作为回复,我尝试了TraxientBehavior,我仍然有same问题。我很确定这是因为我没有关闭或处理我的连接,但我认为Ninject会为我这样做。我确实有一个基本的存储库类,它看起来很像youre posts,在寻找处理我的mongo会话的最佳方法时,我发现youre post,我会在今晚或明天早上尝试,看看我是否还有相同的p问题。