2017-04-13 10 views
3

아래 코드를 실행하면 데이터베이스에 대한 많은 연결이 수행되지 않습니다.Codefluent : 스레드 연결이 끝난 후에도 데이터베이스에 대한 연결이 남아 있습니다.

SELECT COUNT(dbid) as TotalConnections FROM sys.sysprocesses WHERE dbid > 0 

자세한 내용을 보려면 다음 명령을 실행하십시오. 당신은 '기다리는 중 COMMAND'상태와 연결을 많이 볼 수 있습니다 : 나는 스레드가 종료하고 연결을 닫은 후 Codefluent 지속성 컨텍스트가 없어 질 것이라고 가정했을

sp_who2 

. Codefluent가 풀의 연결을 닫도록 강제 할 수 있습니까?

public void TestThreads() 
{ 
    for (var i = 0; i < 1000; i++) 
    { 
     var t = new Thread(() => StaticticThreadContainer.Test()); 
     t.Start(); 
    } 
} 

public static int Test() 
{ 
    var p = CwObject.LoadByEntityKey("baf04c09-7415-497d-b3cd-00004266f503"); 
    return 1; 
} 

나는 조금 더 알아 냈습니다. 스레드에서 반환하기 전에 다음 코드를 호출하면 연결이 제대로 닫힙니다. 이게 가야 할 길인가?

CodeFluentContext.Get(Compareware.Constants.ApplicationStoreName).Persistence.ResetConnection(); 
+0

어떤 형태의 연결 풀링 때문일 수 있습니까? –

+0

난 그렇게 생각, Codefluent 스레드 당 하나의 연결을 사용합니다. 그러나 스레드가 사라지면 연결이 여전히 거기에 있습니까? –

+0

CodeFluent에 익숙하지 않기를 바랍니다. 하지만 DB 커넥션 풀링은 일반적으로 비활성 커넥션을 유지하고 재사용함으로써 DB 커넥션을 생성하고 개방하는 비교적 비싼 (시간) 프로세스를 피하려고 시도합니다. –

답변

0

Meziantou 내 질문에 대답하지만, 언급 과부하가 존재하지 않습니다 그래서, 스레드를 종료하기 전에 당신은 Dispose 메서드를 호출해야합니다. 다음 코드는 트릭을 수행해야합니다.

CodeFluent.Runtime.CodeFluentContext.GetExisting(Constants.MyStoreName)?.Persis‌​tence.ResetConnectio‌​n(); 
CodeFluent.Runtime.CodeFluentContext.GetExisting(Constants.MyStoreName)?.Persistence.Dispose(); 
0

CodeFluent 엔티티는 LocalDataStoreSlot을 사용하여 스레드 당 컨텍스트를 저장합니다. 스레드가 종료되면 스레드 로컬 데이터는 자동으로 삭제되지 않습니다.

CodeFluent.Runtime.CodeFluentContext.GetExisting(Constants.MyStoreName)?.Persistence.Dispose(true); 
+0

우리의 경우 'Constants.SoftFluent_RowShareStoreName'이 % ApplicationNamespace % .Constants % ApplicationNamespace % StoreName이라는 사실을 알게되었습니다. –

+0

이 트릭을 수행하지 않는 것이 두렵습니다. 반환하기 전에 테스트 코드에 다음 행을 추가하면 여전히 1000 개의 추가 연결이 생깁니다. CodeFluent.Runtime.CodeFluentContext.GetExisting (Compareware.Constants.ComparewareStoreName)? Dispose(); –

+0

트릭을 수행하는 유일한 방법은 CodeFluent.Runtime.CodeFluentContext.GetExisting (Compareware.Constants.ComparewareStoreName)? Persistence.ResetConnection();.Dispose 메서드가 불완전한 것일 수 있습니다? –