@Jeff - я - определенно не эксперт по этому, но у меня были хорошие результаты с инстанцированием нового контекста почти на каждом вызове. Я думаю, что это подобно созданию нового объекта Соединения на каждом вызове с ADO. Издержки не так плохи, как Вы думали бы, так как организация пула подключений будет все еще использоваться так или иначе.
я просто использую глобального статического помощника как это:
public static class AppData
{
/// <summary>
/// Gets a new database context
/// </summary>
public static CoreDataContext DB
{
get
{
var dataContext = new CoreDataContext
{
DeferredLoadingEnabled = true
};
return dataContext;
}
}
}
и затем я делаю что-то вроде этого:
var db = AppData.DB;
var results = from p in db.Posts where p.ID = id select p;
И я сделал бы то же самое для обновлений. Так или иначе у меня нет почти такого же трафика как Вы, но я определенно получал некоторую блокировку, когда я использовал общий DataContext вначале только с горсткой пользователей. Никакие гарантии, но могло бы стоить дать попытку.
Обновление : С другой стороны, смотря на Ваш код, Вы только совместно используете контекст данных в течение времени жизни того конкретного экземпляра контроллера, который в основном кажется прекрасным, если это так или иначе не привыкает одновременно вызовами mutiple в контроллере. В потоке по теме заявил ScottGu:
Контроллеры только живут для единственного запроса - так в конце обработки запроса, они собраны "мусор" (что означает, что DataContext собран)...
Так так или иначе, который не мог бы быть им, но снова это, вероятно, стоит попытки, возможно, в сочетании с некоторым тестированием загрузки.
Взгляните на j-Exchange и SyncEx .
Эта проблема когда-то обсуждалась на форумах Java