Leitor e escritor Processo SQLite
-
22-09-2019 - |
Pergunta
Eu tenho dois processos:
- Escreve em duas mesas a cada segundo (ish)
- 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 :)
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);
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.