2017-05-15 1 views
0

이전에는 너무 오래 지속되는 하나의 트랜잭션에서 500 개의 작업이 있었기 때문에 foreach 블록에서 500 개의 트랜잭션을 변경해야했습니다.nHibernate 여러 트랜잭션이 느려짐

나는 각 트랜잭션 (나는 스톱워치를 사용) 만드는 시간을 확인하고 나는 모든 foreach 루프 (모든 새로운 트랜잭션이) 조금 더 이전보다 것으로 나타났습니다. ~ 80 밀리 초에서 ~ 400까지 올랐습니다. 내 코드 :

foreach (var single in data) 
{ 
    using (var tran = _session.BeginTransaction()) 
    { 
     // operations with "single" usage - _session.Save() or _session.Update() 
     //... 
     tran.Commit(); 
    } 
} 

내가 뭘 잘못하고 있니? 내가 처분해야 겠니, 트란 이후에 뭔가 씻어 버려. 명령()?

+0

가능한 복제 (http://stackoverflow.com/questions/43934112/queries-and-commits-take-longer-as-the-session-lives-on을 [쿼리 및 세션이 살아로 오래 걸릴 커밋]) –

답변

1

Nhibernate는 세션의 각 엔티티의 상태를 추적하므로 루프를 돌 때마다 점점 더 많은 엔티티를 검사해야합니다.

일반적으로 이에 대한 대답은 각 트랜잭션에 대해 새 세션을 만드는 것입니다.

여기서 문제는 다음 ORM을 사용하는 "수다"방법이며 일반적으로 안티 패턴을 고려 500 작은 트랜잭션을 가지고있다. NHibernate에 3.2 배치에서

내부적으로 implmented되었고, 나는 당신이 세부 사항에 대한 Batch Update in NHibernate를 참조하시기 바랍니다. 의

+0

당신이 그것을 쓰는 동안, 나는 _session이 "통계"속성에있는 요소들로 가득 찼다는 것을 알아 차렸다. 각 트랜잭션이 끝난 후에 나는 세션을 만들었습니다. 분명히 (그것은) 내 하루를 만든 것처럼 보였습니다. 그러나 그것을 사용하는 데 몇 가지 강한 결과가 있는지 나는 알지 못합니다. – Staly

+0

[post] (/ q/43934112/1178314)에이 문제에 대한 토론이 이미 있습니다. 귀하의 질문은 다음과 같습니다. –

+0

검색하는 동안 찾지 못했습니다. 트랜잭션간에 종속성이 없으므로 사용할 수있는 것처럼 보입니다. 도와 줘서 고마워. 모두들. – Staly

관련 문제