2015-05-13 22 views
7

Tôi có một ứng dụng rất đơn giản bằng EF. Nhưng khi nó chạy một tuần, việc sử dụng bộ nhớ là khủng khiếp (chỉ 80MB lúc đầu, 700MB sau một tuần). Khi tôi sử dụng dotMemory để cấu hình ứng dụng của tôi. Tôi tìm thấy bộ nhớ của Heap thế hệ 2 đang tăng lên tất cả các thời gian.Rò rỉ bộ nhớ khi sử dụng Entity Framework

only run 40 minutes

I Get một bản chụp, cuối cùng tìm thấy các byte giữ lại của dbcontext ef là nhiều nhất.

enter image description here

Tôi rất bối rối. Ứng dụng của tôi rất đơn giản. Mẫu mã:

protected CarbonBrushMonitorEntities _entities = new MYEntities(); 
public void Add(HistoryData data) 
{ 
    _entities.HistoryDatas.Add(data); 
    _entities.SaveChanges(); 
} 

_entities chỉ tắt một lần vào thời điểm bắt đầu, sau đó sử dụng tất cả các thời gian.

Chức năng Add thường được gọi là, khoảng 3 lần/giây

Tôi google một thời gian dài, và thử một số phương pháp như:

_entities.Configuration.ValidateOnSaveEnabled = false; 
_entities.Configuration.AutoDetectChangesEnabled = false; 
_entities.Configuration.LazyLoadingEnabled = false; 

nhưng không có tác dụng.

+0

Bạn quản lý toàn bộ thời gian của ngữ cảnh EF của mình như thế nào? Bạn có bao giờ vứt bỏ/tái tạo nó không? – ken2k

+0

@ ken2k tạo tại thời điểm bắt đầu, sau đó được sử dụng mọi lúc. không bao giờ vứt bỏ/tái tạo. Bởi vì Kiến trúc ứng dụng của tôi sử dụng Ioc và Dependency Injection。 – yubaolee

+0

Lớp nào là phương thức bổ sung? – lloyd

Trả lời

15

Nếu bạn sử dụng khuôn khổ tổ chức nào, bạn nên tạo ra bối cảnh ngay trước khi bạn cần nóvứt bỏ nó càng sớm càng tốt:

using (var someContext = new SomeContext()) 
{ 
    // your commands/queries 
} 

Không bao giờ giữ bối cảnh trong bộ nhớ hoặc chia sẻ nó trên các cuộc gọi khác nhau .

Những gì tôi thường làm là đăng ký bối cảnh với một container IoC:

DependencyFactory.RegisterType(typeof(SomeContext)); 

và sử dụng một resolver ngữ cảnh (cũng đăng ký với IoC tất nhiên) như:

using (var someContext = _contextResolver.ResolveContext()) 
{ 
    // your commands/queries 
}  

nơi có độ phân giải được thực hiện như:

public class ContextResolver : IContextResolver 
{ 
    public ISomeContext ResolveContext() 
    { 
      return DependencyFactory.Resolve<SomeContext>(); 
    } 
} 

Ngữ cảnh EF thực sự là đơn vị công việc của bạn, xử lý một khi bạn không cần nó nữa.

+0

cảm ơn bạn rất nhiều – yubaolee

+1

Để thêm nó không phải là chủ đề an toàn! và vì vậy không có lý do gì để giữ nó/chia sẻ giữa các chủ đề. –

+0

@ G.Y: điểm tốt quá! –