2012-07-31 4 views
11

SQLite (버전 3.7.2)를 사용하여 데이터를 저장하는 애플리케이션이 있습니다. SQLite 연결을 동일한 SQLite db에서 쓰고 읽는 여러 스레드간에 공유합니다. SQLite는 DSQLITE_THREADSAFE = 1로 컴파일됩니다. 이는 SQLite가 직렬화 모드임을 의미합니다. 직렬화 된 SQLite docsSQLite : 읽고 쓰는 쓰레드 간의 연결 공유

에서 인용

: 직렬화 모드에서 SQLite는 안전하게 제한없이 여러으로 스레드를 사용할 수 있습니다. 반대로

SQLite Wiki 항목은 말한다

내가 그 급부상 샘플 응용 프로그램을 시도

이상의 하나의 스레드에서 동시에 동일한 데이터베이스 연결을 사용하지 마십시오 수백 스레드 및 공유 SQLite 핸들 & 잘 작동하는 쓰기를 읽을 수 있습니다.

SQLite 위키 항목이 오래되었거나 SQLite가 동일한 연결을 사용하여 동시에 다른 스레드에서 읽고 쓰는 것을 처리하지 못할 수도 있습니까?

답변

7

EDIT

DSQLITE_THREADSAFE = 2 : 용어 "다중 스레드"SQLite는 약간의 혼란 멀티 스레드 모드. 멀티 쓰레드 모드에서와 같이 보이듯이, 연결 자체는 mutex를 사용하지 않기 때문에 하나의 쓰레드가 다른 쓰레드가 그것을 사용하는 동안 커넥션을 수정하지 못하게하기 때문에 다른 쓰레드와 연결을 공유 할 수 없다.

DSQLITE_THREADSAFE = 1 직렬화 모드 그러나 직렬화 모드에서, 그것은 데이터 파일을 잠그는 것 및 공유 연결에 대한 액세스를 제어하는 ​​뮤텍스를 사용한다.

docs : ... SQLite가 SQLITE_THREADSAFE = 1로 컴파일되면 SQLite 라이브러리는 데이터베이스 연결 및 준비된 명령문에 대한 액세스를 직렬화하여 응용 프로그램이 동일한 데이터베이스 연결 또는 동일한 prepared statement를 자유롭게 사용할 수 있도록합니다 같은 시간에 다른 스레드에서. 연결을 처리 할 때 당신은 여전히 ​​동일한 데이터베이스에 여러 연결을 가질 수 있지만

그래서, 직렬화 모드스레드 안전 모드가 아닌하지만 멀티 스레드입니다.

출처 : http://www.sqlite.org/c3ref/c_config_getmalloc.html#sqliteconfigmultithread

감사합니다!당신이있을 때

+2

위키가 오래되었거나 SQLite 연결이 여러 스레드의 동일한 연결에서'reads' 및'writes'를 지원하는지 궁금합니다. – omggs

+0

@omggs 당신 말이 맞습니다. 용어는 SQLite 문서에서 약간 혼란 스럽습니다. 나에게 * 멀티 스레드 * 및 * 직렬화 *는 동일했지만 그렇지 않았습니다. 직렬화 된 연결을 사용하지만 스레드간에 공유하지는 않습니다 ... 이제는 공유하는 것이 안전하다는 것을 배웠습니다 :) – devundef

+1

확인해 주셔서 감사합니다! SQLite wiki는 실제로 오래되었습니다 !!! – omggs

0

그것은 하나 개 이상의 스레드 중 하나의 연결을 공유하는 나쁜 생각 DSQLITE_THREADSAFE = 0

1이 코드 실행 스레드 상상 :

1. connection.setAutoCommit(false); 
2. statement.executeUpdate(sql); 
3. connection.commit(); 

및 스레드 (2)이 실행됩니다 동시에 코드 :

1. connection.setAutoCommit(true); 

이제 THREAD 2의 명령어 1이 THREAD 1의 명령어 3 이전에 정확히 실행되면 어떻게됩니까? "자동 커밋 모드의 데이터베이스"라는 메시지가있는 SQLException이 발생합니다 (자동 커밋 메소드가 동일한 Connection 객체에서 실행되기 때문에).

이 하나가 자신의 코드 광석 사용 DSQLITE_THREADSAFE = 1

당신은 당신이 다른을 선택하기로 결정했을 때 더 나은 성능을 얻을 수있는 거 개발할 멀티 스레드 코드라면도 최선을 것이다 연결 풀링을 사용하여 동기화해야 의미 DBMS.

관련 문제