문제

다음 코드는 간단한 삽입 명령을 실행합니다. 연속 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();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top