Pergunta

Eu tenho dois processos:

  1. Escreve em duas mesas a cada segundo (ish)
  2. Lê das mesas mesas periodicamente

Sei que, com o SQLite, qualquer gravação bloqueia todo o banco de dados e, às vezes, o segundo processo pode falhar com um banco de dados bloqueado.

Existe algo que você possa sugerir que remova completamente a necessidade desses dois processos para tocar no mesmo banco de dados? Por exemplo, eu poderia atomicamente Transfira os dados do banco de dados que está sendo gravado para um segundo banco de dados somente leitura?

Obrigado :)

Foi útil?

Solução

Você pode configurar a conexão com o banco de dados no segundo processo para aguardar um determinado momento em que ela encontra um banco de dados ocupado, acordando periodicamente para verificar se há um banco de dados gratuito, antes de desistir.

sqlite3_busy_timeout(sqlite3*, int ms);

http://www.sqlite.org/c3ref/busy_timeout.html

Outras dicas

Posso sugerir ler as perguntas frequentes no SQLite Segurança do thread?

Os tópicos são maus. Evite-os.

Sqlite é ThreadSafe. Fazemos essa concessão, pois muitos usuários optam por ignorar os conselhos dados no parágrafo anterior. Mas, para ser segura por threads, o SQLite deve ser compilado com a macro pré-processadora SQLITE_THREADSAFE definida como 1.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top