3

가끔이 예외가 발생하여 디버깅 방법에 대한 통찰력을 얻을 수있는 여기 또는 Google에서 찾을 수없는 것 같습니다.TransactionInterop.GetDtcTransaction() throw ArgsNullException ... 간혹

System.ArgumentNullException: Value cannot be null. 
Parameter name: transaction 
    at System.Transactions.TransactionInterop. 
         GetDtcTransaction(Transaction transaction) 
    at Oracle.DataAccess.Client.OracleConnection.Open() 
    at RetrieveMessage() ... 

내 코드는 매우 간단합니다. RetrieveMessage()은 대기열에서 메시지를 팝업하는 호출이지만 연결을 열려고 할 때 실패하기 때문에 관련이 없습니다.

using (var scope = new TransactionScope(TransactionScopeOption.Required, 
              TimeSpan.FromMinutes(10))) 
{ 
    message = RetrieveMessage(); 
    // ... 
    scope.Complete(); 
} 

//... 

public Message RetrieveMessage() 
{ 
    using (var cnn = new OracleConnection(ConnString)) 
    { 
     cnn.Open(); //sometimes fails??? 
     //... execute a stored procedure that calls dbms_aq.dequeue() 
    } 
    //... return dequeued message or null if queue is empty 
} 

내 연결 문자열처럼 보이는 다음 Data Source=abc;User ID=test1;Password=test1;Pooling=true;Validate Connection=True

ODP.NET : 나는 '경우 버전 2.112.1.0, .NET 프레임 워크 3.5 SP0

왜이 트랜잭션을 사용할 수 없습니다 것 이미 명시 적으로 만들었습니까?

+0

전체 스택입니까, 아니면 일부 프레임을 건너 뛰셨습니까? ODP.NET의 어떤 버전을 사용하고 있습니까? 또한 연결 문자열을 알려주시겠습니까? 거래 입대가 필요합니까? –

+0

'RetrieveMessage()'메쏘드의 본문을 볼 수 있습니까? 일부 'OracleConnection' 인스턴스에서'.Open()'이라고하는 줄이 있어야합니다. 인스턴스가 어떻게 설정되어 있습니까? –

+0

Simon, Jeppe, 내가 요청한 정보를 추가했습니다. 생략 된 추가 프레임은 없으며 연결 문자열과 ODP.NET 버전을 나열했습니다. –

답변

-1

에만 가끔 실패하면이 같은 시도 : 그 모든 그래서 나는이 때 발생하는 생각

+0

문제가 있으면 의견을 말하고 downvote하지 마십시오. – m12

+0

답변을 드리기 위해 노력한 것을 고맙게 생각하지만 내 코드가 예외를 던지고있는 것이므로 완전한 해결책은 아닙니다. 또한 어쨌든 저와 같은 단단한 회전 루프를 차단할 이유가 없습니다. 최악의 경우, 코드가 현재 쓰여지는 방식대로 CPU를 스파이크시킬 수 있습니다. 이상적으로는 예외의 원인을 이해하고 시나리오를 수정하여 예외가 발생하지 않도록하고 싶습니다. 귀하의 답변 downvote 자격이 ....하지만 나는 그것을 떠날거야. –

+2

사실 투표 메커니즘이 여기에 권장됩니다 ... 의견은 게시물 개선을 위해 도움이되지만 필수적으로 기대해서는 안됩니다. 또한 일반적으로 다운 투표는 질문의 포스터가 아닌 다른 사용자가 수행합니다. 너무 많은 전문가가 있으므로 여기에 대해 많이 알지 못한다는 것을 인정할 수 있다면 다른 사람에게 남겨 두는 것이 가장 좋습니다 - 또는 downvotes에 대비하십시오. – RThomas

1

을 도울 수, 나는, "거래"에 대해 잘 모르는

while (true){ 
    if (ConnString == null) 
     continue; 
    var cnn = new OracleConnection(ConnString); 
    if (cnn == null) 
     continue; 
    cnn.Open() 
    //... execute a stored procedure that calls dbms_aq.dequeue() 
    break; 
} 
//... return dequeued message or null if queue is empty 

미안 클라이언트가 사용하려고하는 TCP 포트는 데이터베이스 서버 또는 클라이언트 이외의 에이전트에 의해 닫힙니다. 우리는 TCPView를 사용하여 클라이언트와 서버 사이의 포트 1521에있는 모든 연결을 닫은 다음 동일한 프로세스 내에서 연결을 열려고 시도함으로써 이것을 시뮬레이션 할 수있었습니다. 현실 세계에서는 내부 방화벽이 비활성으로 인해 연결을 닫고 있다고 생각합니다. 연결이 닫히는 것을 막기에는 부족하지만, 아직이 문제에 대한 실제 해결책을 찾지 못했습니다.

관련 문제