풀링된 연결 시간이 초과되었습니다.
프로덕션 서버에서 랜덤으로 ORacle 데이터베이스 연결이 실패하는 경우가 있습니다.나는 많은 것을.
Oracle.DataAccess.Client.OracleException
Pooled connection request timed out
at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck, Int32 isRecoverable)
at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src)
at Oracle.DataAccess.Client.OracleConnection.Open()
at ws.DataConnection() in path.
몇 가지 해결책을 찾아봤지만 실패했습니다.예외에 Ora-123과 같은 식별자가 없다는 것이 이상합니다.Oracle Data Access 클라이언트를 사용합니다.이 문제가 5-10초 동안 발생할 수도 있고, 문제를 해결하기 위해 IIS(6.1, 윈도우즈 서버 2008 R2)를 다시 시작해야 할 수도 있습니다.답답하네요...우리는 거대한 웹사이트를 가지고 있기 때문에 pooling=false를 설정할 수 없습니다.해결책이 있습니까?
이 문제의 가장 일반적인 원인은 Oracle과 관련된 ID 일회용 개체를 제대로 처리하지 못한 것입니다.데이터 액세스.고객.
아마도 당신이 가지고 있는 어떤 코드가 일부 물체를 적절하게 처리하지 못하고 있을 것입니다.이렇게 하면 Oracle이 실제로 사용되지 않는 연결을 유지하여 풀에서 사용 가능한 연결이 부족하게 됩니다.IIS를 다시 시작하면 연결이 모두 끊어지므로 문제가 해결됩니다.
코드를 주의 깊게 검토하고 모든 ID 일회용 개체가 문을 사용하여 올바르게 폐기되거나 캡슐화되었는지 확인합니다.
가장 일반적인 연결 문제는 다음과 같습니다.
- 응용 프로그램에서 연결을 열어두고 있습니다.이렇게 하면 사용 가능한 연결이 모두 사용되므로 임의로 연결이 거부됩니다.이를 위한 가장 쉬운 코드 솔루션은 변수가 범위를 벗어날 때까지 기다리지 않고 응용 프로그램이 가능한 한 빨리 연결을 닫도록 하는 것입니다.의 "사용" 문입니다.NET은 이에 적합합니다.
- 연결 풀을 재활용해야 할 수 있습니다.자세한 내용은 다음 사이트를 참조하십시오. http://docs.oracle.com/cd/E11882_01/java.112/e12265/manage.htm#BABICIII
- 연결 풀이 충분히 크지 않을 수 있습니다(기본 최대 크기는 100).이것을 늘려보세요.
도움이 될 수 있는 또 다른 사이트는 http://blog.ilab8.com/2011/09/02/odp-net-pooling-and-connection-request-timed-out/ 입니다.
열쇠는 전화하는 것입니다.DbContext에서 ()를 삭제하거나 컨테이너가 호출 중인지 확인합니다.폐기()를 대신 처리합니다(폐기를 재정의하고 각 새 DbContext에 해당하는 호출이 있는지 확인).폐기().
Dispose()를 호출하면 앱에서 연결이 열려 있는 문제(즉, DbContext에서 Dispose()를 호출하지 않음)를 해결할 수 있는지 확인하기 위해 destrator ~MyDbContext()를 빠른 해킹으로 사용하는 것이 좋습니다.
Oracle 공급자의 경우 직접 Dispose(또는 컨테이너에서 직접 처리)를 호출해야 합니다. 그렇지 않으면 연결이 누출되거나 부족해질 수 있습니다.
괜찮으시다면 몇 가지 예제 코드를 제공할 수 있을까요?
데이터베이스에 최근에 연결하지 않았는지 확인합니다.예:
// collection to wrap several db records
private List<YourClassItems> list
get
{
if (Session["FOO"] == null)
{
// this method connect to the database
List<YourClass> lst = GetItems();
Session["FOO"] = lst;
return lst;
}
return (List<YourClass>)Session["FOO"];
}
// then we have the GetItems() method
private List<YourClass> GetItems()
{
// get several items from database.
while (read())
{
// assume this row is an item
RowItem i = read.Row;
// THIS might be your problem. It will recursively call this method
yourClassItems.Add(i);
}
//to solve this, create a List<YourClass> tempList and then
//yourClassItems = tempList outside the loop
}
언급URL : https://stackoverflow.com/questions/20352677/pooled-connection-timed-out
'programing' 카테고리의 다른 글
| MySQL에서 빈 문자열 삽입을 금지하는 제약 조건 (0) | 2023.09.04 |
|---|---|
| Chrome 검색되지 않은 구문 오류:예기치 않은 토큰 불법 (0) | 2023.09.04 |
| Swift를 사용하면 탐색 제목이 표시되지 않는 이유는 무엇입니까?UI? (0) | 2023.09.04 |
| Git 폴더를 하위 모듈로 소급하여 변환하시겠습니까? (0) | 2023.09.04 |
| python으로 gensim의 word2vec 모델을 이용한 문장 유사성 계산 방법 (0) | 2023.08.30 |