2012-01-20 2 views
5

웹 서비스에서 데이터를 가져 와서 데이터를 데이터베이스에 추가하고 삭제하고 업데이트합니다. 하지만 때로는 내 응용 프로그램을 실행할 때 모든 작업이 성공적으로 수행되지만 때로는 추가, 삭제 또는 데이터를 업데이트 할 때이 오류가 발생합니다.데이터베이스 파일이 잠겼습니다.

서버가 요청을 처리 할 수 ​​없습니다. ---> 데이터베이스 파일이 잠겼습니다. 데이터베이스가 잠겼습니다.

같은 프로그램이 제대로 작동하는 것을 이해할 수는 없지만 바로 그 프로그램에서이 메시지가 나타납니다.

+0

어떤 데이터베이스 엔진을 사용하고 있습니까? 데이터베이스 로그를 확인 했습니까? –

+0

어떤 데이터베이스에 연결하고 있습니까? MS Access .mdb 파일 또는 SQL Server? 또한 연결 문자열을 표시 할 수 있습니까? –

+0

사용중인 데이터베이스와 액세스 방법에 대한 세부 정보를 제공해야합니다. –

답변

5

SqlLite는 두 개의 스레드가 동시에 데이터베이스를 사용할 수 없도록합니다.

가장 쉬운 방법은 모든 데이터베이스 호출에 대해 lock 문을 사용하는 것입니다.

+1

하지만 문제는 웹 사이트에 4 개의 데이터베이스가 있고 다른 모든 응용 프로그램이 잘 작동하지만이 응용 프로그램 만 웹 서비스와 작동하지 않는다는 것입니다. 작동하지 않는다는 것은 때로는 작동하고 언젠가는 같은 앱이 내가 말한 것처럼 오류를 준다는 것을 의미합니다. –

+0

다른 사이트를로드하려고 시도 했습니까? 조만간 문제에 봉착하게 될 것입니다. 당신은 아마도 webservice에서 동일한 HTTP 요청에 대해 여러 db 연결을 사용하려고합니까? – jgauffin

3

Access와 같은 파일 기반 데이터베이스를 사용합니까?

데이터베이스 파일이 항상 잠겨 있습니다 (거의 모든 데이터베이스 시스템에서). 데이터베이스 서비스를 중지하여 파일 잠금을 해제하십시오.

+0

sqLite 데이터베이스 파일을 사용하고 있습니다 . 웹 서비스는 파일 잠금을 해제하는 것을 의미합니다. –

4

SysInternals라는 훌륭한 패키지가 있습니다. 내부의 구성 요소 중 하나가 프로세스 모니터 (procmon)입니다. 그것을 사용하여 데이터베이스 파일을 잠그는 응용 프로그램과 응용 프로그램의 두 인스턴스가 DB 파일을 잠그는 것에 대해 "싸우는"경우 확인하십시오.

Sqlite에서는 여러 프로세스가 DB 파일에서 읽을 수 있지만 특정 시간에 하나만 변경 (INSERT/UPDATE/DELETE) 할 수 있습니다. 둘 이상의 프로세스가 동시에 DB를 변경하려는 경우이 오류가 발생합니다. Mutex를 사용하여 DB에 액세스하는 프로세스간에 동기화 할 수 있습니다.

둘째, sqlite 설명서에서는 여러 스레드에서 데이터베이스를 사용하지 않는 것이 좋습니다. 동시에 하나의 스레드 만 DB에 액세스 할 수 있도록하려면 데이터베이스와의 모든 상호 작용을 수행하는 정적 클래스를 만들고이 클래스 내부의 잠금 문을 사용하여 여러 스레드에서 동시에 DB에 액세스하지 않도록 할 수 있습니다.

관련 문제