OLEDBEXCEPTION 시스템 리소스가 초과되었습니다
-
03-07-2019 - |
문제
다음 코드는 간단한 삽입 명령을 실행합니다. 연속 2,000 배 (2,000 행을 삽입하기 위해)라고 부르는 경우 메시지 = "시스템 리소스 초과"가있는 OLEDBEXCEPTion이 던져집니다. 자원을 확보하기 위해 내가해야 할 일이 있습니까?
using (OleDbConnection conn = new OleDbConnection(connectionString))
using (OleDbCommand cmd = new OleDbCommand(commandText, conn))
{
conn.Open();
cmd.ExecuteNonQuery();
}
해결책
시스템 리소스를 초과 한 오류가 관리되는 코드에서 오류가 발생하지 않으며 데이터베이스 (JET?)를 죽이는 것입니다.
당신은 많은 연결을 열고 빠르게하는 방법 ...
몇 가지 팁 :
- 모든 명령에 대한 새 연결을 열지 않아 라운드를 피하고 단일 연결을 사용하여 인서트를 수행하십시오.
- 데이터베이스 연결 풀링이 작동하는지 확인하십시오 (OLEDB 연결과 작동하는지 확실하지 않음).
- 보다 최적화 된 방법을 사용하여 데이터를 삽입하십시오.
이것을 시도해 보셨습니까?
using (OleDBConnection conn = new OleDBConnection(connstr))
{
while (IHaveData)
{
using (OldDBCommand cmd = new OldDBCommand())
{
cmd.Connection = conn;
cmd.ExecuteScalar();
}
}
}
다른 팁
예외없이 Access 2007 데이터베이스 로이 코드를 테스트했습니다 (13000 인서트만큼 높았습니다).
그러나 내가 알아 차린 것은 매번 연결을 만들 때 매우 느리다는 것입니다. 루프 외부에 "사용 (연결)을 넣으면 훨씬 더 빠릅니다.
위의 것 외에도 (데이터베이스에 한 번만 연결) 연결을 닫고 폐기하는지 확인하고 싶습니다. C#의 대부분의 객체는 WRT 메모리 관리이므로 연결 및 스트림에는 항상 사치품이 없으므로 이와 같은 객체가 폐기되지 않으면 청소를 보장하지 않습니다. 이것은 프로그램 수명을 위해 해당 연결을 열어 두는 효과가 추가됩니다.
또한 가능하면 거래를 사용해 보겠습니다. 이 코드를 사용하는 것을 말할 수는 없지만 데이터베이스에 많은 행을 삽입하고 업데이트 할 때 OLEDBTRANSACTIONS가 유용합니다.
세부 사항에 대해 잘 모르겠지만 비슷한 문제를 해결했습니다. 우리는 IIS와 함께 액세스 데이터베이스를 사용하여 고객에게 서비스를 제공합니다. 우리는 많은 고객이 없지만 단일 세션 중에 많은 연결이 열리고 닫히고 있습니다. 약 일주일의 작업 후, 우리는 동일한 오류를 받고 모든 연결 시도가 실패합니다. 문제를 해결하기 위해 우리가해야 할 일은 작업자 프로세스를 다시 시작하는 것입니다.
일부 연구 후, 나는이 환경에서 액세스가 잘 작동하지 않는다는 것을 발견했습니다. 리소스는 올바르게 출시되지 않으며 시간이 지남에 따라 실행 파일이 다 떨어집니다. 이 문제를 해결하기 위해 Oracle 데이터베이스로 이동합니다. 이것이 문제를 해결하지 못하면, 나는 당신에게 내 결과를 계속 업데이트 할 것입니다.
생성 된 연결 및 명령 개체를 처리하지 않기 때문에 발생할 수 있습니다. 항상 결국 물체를 처분하십시오.
OledbCommand.Dispose();