2016-08-25 3 views
1

데이터베이스 최적화 작업에서 우리는 데이터베이스를 db와 db2의 두 데이터베이스로 분리했습니다. 우선 순위가 낮은 백그라운드 스레드가 db2에 삽입 중입니다. db에 대한 일부 쿼리는 db2와 결합되므로 db2를 db에 연결해야합니다. 우리는 WAL을 가능하게하기 때문에 모든 것이 다중 스레드되기를 원합니다.SQLite : 첨부 된 데이터베이스가있는 Write-Ahead Logging (WAL 저널 모드)

문제를 이해하기 위해 간단한 두 스레드 테스트를 실행합니다. 첫 번째 스레드는 db에 행을 삽입하고 두 번째 스레드는 db에서 선택합니다. 각 스레드는 이전 루프의 시간 델타와 우리가 데이터베이스 내에 있었던 시간을 인쇄합니다.

thread 1 loop:        | thread 2 loop: 
    t1 = getTime()       | t1 = getTime() 
    db2.execSQL("insert into ....");  | db2.execSQL("select ...."); 
    t2 = t3        | t2 = t3 
    t3 = getTime()       | t3 = getTime() 
    log("i: "+(t3-t1)+", delta: "+(t2-t1)) | log("s: "+(t3-t1)+", delta: "+(t2-t1)) 

우리가 보는 것은 선택 스레드가 삽입 스레드를 차단하고 있다는 것입니다. 이것은 엄청난 (그리고 느린) 선택과 작은 삽입을함으로써 강조 될 수 있습니다. 삽입 시간과 델타가 대략 선택 시간까지 증가한다는 것을 알 수 있습니다. 느린 쓰레드를 실행하지 않으면 삽입 쓰레드가 상당히 빠르게 진행됩니다. 내 질문에 이제

// make sure this database has NO attached databases because sqlite's write-ahead-logging 
// doesn't work for databases with attached databases 
if (mHasAttachedDbsLocked) { 
    if (Log.isLoggable(TAG, Log.DEBUG)) { 
     Log.d(TAG, "this database: " + mConfigurationLocked.label 
       + " has attached databases. can't enable WAL."); 
    } 
    return false; 
} 

:

  1. 주석의 의미는 무엇입니까

    의 SQLiteDatabase의 소스 코드에 파고 나는 SQLiteDatabase#enableWriteAheadLogging()에서 다음 줄을 찾았나요? 정확히 작동하지 않는 것은 무엇입니까? 몇 가지 오래된 코드가 남아 있습니까? ATTACH 데이터베이스 (https://www.sqlite.org/lang_attach.html)의 문서는 ATTACH + WAL이 괜찮습니다 (작은주의 사항이 있음).

  2. 왜 안드로이드 바인딩 코드가 SQLite 내부 문제에서 우리를 보호하려고합니까? 내가 보는 방식은 얇은 인터페이스 레이어라고 가정합니다.

편집 : 나는 AOSP issue tracker에서 버그로보고했다. 거기에 답변이 있으면 업데이트됩니다.

답변

0

WAL은 독자와 동시에 라이터를 허용하지만 다른 연결에서만 가능합니다. 여러 스레드에서 동일한 연결 (SQLiteDatabase 개체)을 절대로 사용해서는 안됩니다.

WAL 설정은 영구적입니다. 데이터베이스를 연 후에 매번 실행할 필요가 없습니다.

  1. 설명의 의미는 정확하게 말합니다. (아무도이 설명이 맞는지 아무도 보장하지 않습니다.)

  2. 가끔은 Android 프레임 워크가 영리하려고합니다. 그러나 PRAGMA journal_mode = WAL을 수동으로 실행할 수 있습니다.

+0

내 질문을 이해하지 못했습니다. SQLiteDatabase 객체의 소스 코드에 대해 이야기하고 있습니다. – grebulon

+0

그리고 그 저자는 누구도 서면으로 질문에 답할 수 없습니다. –

+0

나는 그들이 그것을 읽고, 나는 또한 밖에 물었다. – grebulon

관련 문제