ASP.NET MVC UnitOfWorkとMySQLおよび睡眠接続
-
29-09-2019 - |
質問
次のアーキテクチャに基づいたMVC Webアプリがあります
ASP.NET MVC2、NINJECT、FLUENT NHIBERNATE、MYSQLは作業パターンの単位を使用します。
MySQLへの接続ごとに、Show ProcessListクエリの結果のエントリとして見ることができる睡眠接続が生成されます。
最終的に、これにより、アプリプールの制限を排除してWebアプリをクラッシュさせるのに十分な接続が生じます。
接続が正しく処分されていないのではないかと思います。
これがどこで、これがどのように起こるべきかの場合ですか?
これが私が使用しているコードのスナップショットです。
public class UnitOfWork : IUnitOfWork
{
private readonly ISessionFactory _sessionFactory;
private readonly ITransaction _transaction;
public ISession Session { get; private set; }
public UnitOfWork(ISessionFactory sessionFactory)
{
_sessionFactory = sessionFactory;
Session = _sessionFactory.OpenSession();
Session.FlushMode = FlushMode.Auto;
_transaction = Session.BeginTransaction(IsolationLevel.ReadCommitted);
}
public void Dispose()
{
if (Session != null)
{
if (Session.IsOpen)
{
Session.Close();
Session = null;
}
}
}
public void Commit()
{
if (!_transaction.IsActive)
{
throw new InvalidOperationException("No active transation");
}
_transaction.Commit();
Dispose();
}
public void Rollback()
{
if (_transaction.IsActive)
{
_transaction.Rollback();
}
}
}
public interface IUnitOfWork : IDisposable
{
void Commit();
void Rollback();
}
public class DataService
{
int WebsiteId = Convert.ToInt32(ConfigurationManager.AppSettings["Id"]);
private readonly IKeyedRepository<int, Page> pageRepository;
private readonly IUnitOfWork unitOfWork;
public PageService Pages { get; private set; }
public DataService(IKeyedRepository<int, Page> pageRepository,
IUnitOfWork unitOfWork)
{
this.pageRepository = pageRepository;
this.unitOfWork = unitOfWork;
Pages = new PageService(pageRepository);
}
public void Commit()
{
unitOfWork.Commit();
}
}
public class PageService
{
private readonly IKeyedRepository<int, Page> _pageRepository;
private readonly PageValidator _pageValidation;
public PageService(IKeyedRepository<int, Page> pageRepository)
{
_pageRepository = pageRepository;
_pageValidation = new PageValidator(pageRepository);
}
public IList<Page> All()
{
return _pageRepository.All().ToList();
}
public Page FindBy(int id)
{
return _pageRepository.FindBy(id);
}
}
解決
あなたの投稿では、UOWが作成される範囲の情報を提供しません。
それが一時的な場合。それはまったく処分されず、これはあなた次第です。
InRequestScopeの場合、GCがHTTPContextを収集した後に処分されます。しかし、最近ボブに言ったように NINJECTメーリングリスト httpapplicationの最後の要求イベントハンドラーですべてのオブジェクトをリリースすることができます。 Ninjectの次のリリースでこれをサポートします。
他のヒント
私はこの問題の根本原因についていくつかの調査をしました。ここにもう少し情報と可能な解決策があります。
http://blog.bobcravens.com/2010/11/using-ninject-to-manage-critical-resources/
楽しみ。
Ninjectは、いつ、どこであなたを保証しません IDisposable
Sはそうなります Dispose
d。
これを読む オリジナルのninject Manから投稿してください
また、ここで見てみることをお勧めします。これは、さまざまな永続メカニズムとさまざまなコンテナのために現れました。重要なことは、UOWのコミット/ロールバック/ディスセマンティクスに接続していることをコントロールし、いつ把握する必要があることです。偶然や一致に任せてください(慣習は素晴らしいですが)。