2012-09-12 5 views
0

공유 폴더에 SQLite3 데이터베이스가 있습니다. Java 응용 프로그램에서 db 파일을 덮어 쓰려고합니다. 이 파일에 대한 읽기 및 쓰기 트래픽이 적지 만 덮어 쓰기로 인해 db 파일이 손상되지 않고 b) db 파일에 액세스하려고하는 사람은 덮어 쓸 때까지 잠겨 있음을 확인합니다. 완료되었습니다. 나의 현재 계획은 공유 네트워크 폴더에 SQLite 데이터베이스 덮어 쓰기

String query = "BEGIN EXCLUSIVE TRANSACTION"; 
/* Execute this query*/ 
File sourceFile = new File(LocalPath); 
File destFile = new File(DbPath); 

InputStream inStream = new FileInputStream(sourceFile); 
OutputStream outStream = new FileOutputStream(destFile); 

byte[] buffer = new byte[1024]; 

int length; 

while((length = inStream.read(buffer)) > 0) { 
    outStream.write(buffer, 0, length); 
} 

inStream.close(); 
outStream.close(); 

/* Now release lock */ 

query = "ROLLBACK TRANSACTION"; 

/* Execute query */ 

그래서 여기 SQLite는에서 http://www.sqlite.org/howtocorrupt.html을 지침을 읽고 ... 이런 식으로 뭔가를 보이는,이 잠금 저널에 존재하는 것이며, 내가 롤백 트랜잭션을 실행하면 복사 한 후 업데이트 될 것 같다. 그 동안 클라이언트가 복사하는 동안 Db에 액세스하려고하면 파일을 찾지 못할 것이고 SQLite 드라이버는 db가 존재하지 않는다고 가정합니다. 권리?

제 질문은 ... 데이터베이스에 잠금을 설정하는 것이 아닌가하는 의문점이 있습니까? 더 나은 전략이나 누락 된 것보다는 잠긴 것처럼 보이는 DB를 만드는 방법이 있습니까? 또한 DB 손상에서 엄청난 위험을 감수하고 있습니다. 한 가지 다른 생각은 db 파일을 잠그고 다른 이름으로 새 파일을 작성한 다음 작성이 완료된 후 이름을 바꾼 다음 잠금을 해제하는 것입니다.

DB 파일을 덮어 쓰는 것이 훌륭한 아이디어인지는 모르겠지만 내가 처분 할 수있는 리소스 (네트워크상의 공유 폴더에있는 DB에서 거대한 트랜잭션을 실행하는 것은 용납 할 수 없을 정도로 느리다)에 대해 생각할 수있는 유일한 방법은 확실합니다 . 나는 공유 폴더의 SQLite db로 작업하는 손상 위험이 더 높다는 것을 알고 있습니다. 나는 로컬에서 업데이트를 작성하고 사용자가 변경 내용을 커밋하고 db 파일 복사본을 시작하도록 선택하게합니다. 내 질문에 대답하는 것 외에도,이 경우에 어떤 일반적인 조언을 환영합니다

...

+1

당신이 https://www.sqlite.org/faq.html#q5을 알고 계십니까? –

+0

https://www.sqlite.org/faq.html#q5 덮어 쓰는 동안 SQLite 데이터베이스를 덮어 쓰거나 액세스 전략을 지정하지 않습니다. – bristophocles

답변

1

Backup API는 데이터베이스를 덮어 쓸 수 있습니다.

(자바 래퍼가이 API를 노출 나도 몰라.)

관련 문제