언어

SQLiteDatabase.EnableWriteAheadLogging 메서드

정의

미리 쓰기 로깅을 사용하면 동일한 데이터베이스의 여러 스레드에서 쿼리를 병렬로 실행할 수 있으며 파일 시스템 동기화가 중단될 가능성이 줄어듭니다.

[Android.Runtime.Register("enableWriteAheadLogging", "()Z", "GetEnableWriteAheadLoggingHandler")]
public virtual bool EnableWriteAheadLogging();
[<Android.Runtime.Register("enableWriteAheadLogging", "()Z", "GetEnableWriteAheadLoggingHandler")>]
abstract member EnableWriteAheadLogging : unit -> bool
override this.EnableWriteAheadLogging : unit -> bool

반품

미리 쓰기 로깅을 사용하는 경우 True입니다.

특성

예외

이 메서드를 호출할 때 진행 중인 트랜잭션이 있는 경우 WAL 모드는 진행 중인 트랜잭션이 없는 경우에만 변경할 수 있습니다.

설명

미리 쓰기 로깅을 사용하면 동일한 데이터베이스의 여러 스레드에서 쿼리를 병렬로 실행할 수 있으며 파일 시스템 동기화가 중단될 가능성이 줄어듭니다. 미리 쓰기 로깅은 대부분의 시나리오에서 훨씬 더 빠릅니다.

<h3>이점 및 모범 사례</h3>

미리 쓰기 로깅은 기본적으로 사용하도록 설정되지 않습니다. 그러나 앱이 미리 쓰기 로깅과 호환되지 않는 SQLite 기능을 사용하지 않는 한 앱에서 미리 쓰기 로깅을 사용하도록 설정하는 것이 좋습니다.

미리 쓰기 로깅을 사용하도록 설정하면 다른 스레드의 읽기를 동시에 진행할 수 있는 별도의 로그 파일에서 쓰기 작업이 수행됩니다. 쓰기가 진행되는 동안 다른 스레드의 판독기는 쓰기가 시작되기 전과 마찬가지로 데이터베이스의 상태를 인식합니다. 쓰기가 완료되면 다른 스레드의 판독기는 데이터베이스의 새 상태를 인식합니다.

미리 쓰기 로깅의 또 다른 이점은 기본 파일 시스템에 대한 호출 수를 fsync 줄인다는 것입니다. 호출 fsync 은 시스템 잠금을 차단할 수 있으며 느린 파일 시스템을 사용하는 디바이스에서 비상 대기 시간이 저하될 수 있습니다.

미리 쓰기 로깅을 사용하도록 설정하는 가장 효율적인 방법은 플래그를 #ENABLE_WRITE_AHEAD_LOGGING 전달하는 것입니다 #openDatabase. 호출하는 것보다 #enableWriteAheadLogging더 효율적입니다. <pre> SQLiteDatabase db = SQLiteDatabase.openDatabase("db_filename", cursorFactory, SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.ENABLE_WRITE_AHEAD_LOGGING, myDatabaseErrorHandler); </pre> <h3>미리 쓰기 로깅</h3 사용 안 됨>

데이터베이스에 연결된 데이터베이스가 있는 경우 쿼리를 병렬로 실행할 수 없습니다. 마찬가지로 미리 쓰기 로깅은 읽기 전용 데이터베이스 또는 메모리 데이터베이스에 대해 지원되지 않습니다. 이 경우 false를 반환합니다 #enableWriteAheadLogging() .

미리 쓰기 로깅을 사용하도록 설정하지 않은 경우(기본값 또는 호출 #disableWriteAheadLogging후) 읽기 및 쓰기가 데이터베이스에서 동시에 발생할 수 없습니다. 데이터베이스를 수정하기 전에 기록기는 데이터베이스에 대한 배타적 잠금을 암시적으로 획득하여 쓰기가 완료될 때까지 판독기가 데이터베이스에 액세스하지 못하게 합니다.

미리 쓰기 로깅하면 SQLite에서 메모리 사용량이 약간 증가합니다. meminfo와 같은 도구를 사용하여 메모리에 미치는 영향을 측정할 수 있습니다.

<h3>사용량</h3>

플래그를 사용하여 #ENABLE_WRITE_AHEAD_LOGGING 데이터베이스를 열거나 이 메서드를 호출하면 데이터베이스가 열려 있는 한 병렬로 쿼리를 실행할 수 있습니다. 쿼리 실행을 병렬로 사용하지 않도록 설정하려면 데이터베이스를 호출 #disableWriteAheadLogging 하거나 닫고 다시 엽니다.

쿼리의 병렬 실행은 데이터베이스에 대한 여러 연결을 열고 각 쿼리에 대해 다른 데이터베이스 연결을 사용하여 수행됩니다. 쓰기가 읽기와 동시에 진행되도록 데이터베이스 저널 모드도 변경됩니다. 쿼리를 병렬로 실행하는 데 사용되는 최대 연결 수는 디바이스 메모리 및 기타 속성에 따라 달라집니다.

쿼리가 트랜잭션의 일부인 경우 트랜잭션이 시작된 동일한 데이터베이스 핸들에서 실행됩니다.

작성기는 트랜잭션을 사용 #beginTransactionNonExclusive() 하거나 #beginTransactionWithListenerNonExclusive(SQLiteTransactionListener) 시작해야 합니다. 비독점 모드를 사용하면 쿼리를 실행하는 다른 스레드에서 데이터베이스 파일을 읽을 수 있습니다.

데이터베이스에 연결된 데이터베이스가 있는 경우 쿼리를 병렬로 실행할 수 없습니다. 마찬가지로 미리 쓰기 로깅은 읽기 전용 데이터베이스 또는 메모리 데이터베이스에 대해 지원되지 않습니다. 이 경우 false를 반환합니다 #enableWriteAheadLogging .

미리 쓰기 로깅의 작동 방식에 대한 자세한 내용은 SQLite Write-Ahead 로깅 도 참조하세요.

에 대한 android.database.sqlite.SQLiteDatabase.enableWriteAheadLogging()Java 설명서

이 페이지의 일부는 만들고 공유한 작업을 기반으로 하며 에 설명된 조건에 따라 사용됩니다.

적용 대상

참고 항목