2010-07-30 12 views
7

모든 요청시 Oracle 데이터베이스에 연결하는 .Net 서비스가 있습니다. 처음에는 문제가 없지만 몇 가지 요청이 있은 후에 다음과 같이 나타납니다.Oracle.DataAccess.Client.OracleException ORA-03135 : 연결이 끊어졌습니다

Oracle.DataAccess.Client.OracleException ORA-03135: connection lost contact 
    at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure) 
    at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, String procedure, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src) 
    at Oracle.DataAccess.Client.OracleCommand.ExecuteReader(Boolean requery, Boolean fillRequest, CommandBehavior behavior) 
    at Oracle.DataAccess.Client.OracleCommand.ExecuteReader() 
    at MyApp.Services.OracleConnectionWithRetry.ExecuteReader(OracleCommand command) 
    ... 

어떤 문제 일까? 모든 연결, 결과 및 매개 변수를 처리합니다. 이 서비스의로드는 매우 낮습니다.

+0

호기심에서 벗어난 상태에서 프로그래밍 방식으로 연결 상태를 확인하여이 문제를 해결 했습니까? 아니면 이미 열어 둔 상태에서 아무것도 수행하지 않거나 web.config에서 Validation Connection = true로 설정했거나 둘 다? –

+2

안녕하세요 @ 루크, 나는 개인적인 수준 에서이 문제를 "해결"- 박사 학위를 내 직장을 종료 :) – Grzenio

+0

hehe 축하, 불행히도, 나는 충분히 그 경로를 내려 갈 수 없어;) –

답변

11

코드가 Oracle Connection Pool로부터의 연결을 요청하고 연결 풀이 Oracle DB와의 연결이 끊겼거나 끊어진 연결을 반환하기 때문에 발생합니다. ODP.NET 자체는 클라이언트에 전송 된 연결의 연결 상태를 테스트하지 않습니다.

그래서 안전을 위해, 하나 당신이 Connection.Open()

또는

할 ODP.NET을 할 때 풀에서 수신 연결에 대한 connection status == Open을 확인 설정하여 검사 할 web.config의 연결 문자열에 Validate Connection = true.

이 두 가지 방법 모두 데이터베이스에 연결해야 할 때마다 연결 상태를 테스트 할 때 성능에 영향을줍니다.

내가 사용하는 세 번째 옵션은 예외 사용입니다. 먼저 낙천적이며 whateven connection이 연결 풀에서 반환됩니다. ORA-3135를 얻으면 새로운 연결을 요청하고 while 루프처럼 다시 쿼리를 실행하십시오. 가장 좋은 경우 첫 번째 연결을 유효한 것으로 설정하면 쿼리가 실행됩니다. 최악의 경우 풀에있는 모든 연결이 유효하지 않은 경우 코드가 N 시간 (N은 연결 풀 크기)으로 실행됩니다.

+0

유효성 검사 연결 옵션이 좋은 해결책임을 알게되었습니다. 그것은 내 응용 프로그램에 평균 20 %의 오버 헤드를 추가했습니다. 비록 당신이 사소한 질문을 많이한다면 그것은 더 높을 것이다. 또한 연결 상태를 확인하는 데 약간의 오버 헤드가 있습니다. 서버 왕복과 관련된 것으로 생각됩니다. 테스트 할 때 연결 문자열에 연결 유효성 검사 옵션을 설정하는 것보다 코드에서 매번 연결을 확인하는 것이 더 빠르지 않았습니다. –

+0

그 이유는 처음부터 확인하지 마십시오. 가지고있는 연결로 가십시오. 현재의 접속이 실패했을 경우는, 새로운 접속을 취득합니다. – sandyiit

+0

연결 문자열 안에 Validate Connection을 배치한다고 말하면 ORA 파일 또는 app.config에서 이야기하고 있습니까? – William

2

나는 이것도 보았다. 연결 문자열에서 "풀링 = 거짓"으로 연결 풀링을 해제하십시오. 풀에 유휴 연결이 만료된다는 이론이 있지만 ODP.NET은 만료되었다는 사실을 인식하지 못하고 앱이 무언가를 잡아 예외를 잡을 때 유용합니다.

+0

누군가는 데이터베이스가 바운스 된 후에 이런 일이 일어날 것을 제안했다. – Grzenio

관련 문제