Posso ler e gravar em um banco de dados SQLite simultaneamente a partir de várias conexões?


87

Tenho um banco de dados SQLite que é usado por dois processos. Eu gostaria de saber, com a versão mais recente do SQLite, enquanto um processo (conexão) inicia uma transação para gravar no banco de dados, o outro processo será capaz de ler do banco de dados simultaneamente?


pergunta relacionada, veja aqui .. stackoverflow.com/questions/12117016/…
AndroidGeek

Respostas:


142

Coletei informações de várias fontes, principalmente de sqlite.org, e as reuni:

Primeiro, por padrão, vários processos podem ter o mesmo banco de dados SQLite aberto ao mesmo tempo, e vários acessos de leitura podem ser satisfeitos em paralelo.

No caso de gravação, uma única gravação no banco de dados bloqueia o banco de dados por um curto período de tempo, nada, nem mesmo a leitura, pode acessar o arquivo do banco de dados.

A partir da versão 3.7.0, uma nova opção “Write Ahead Logging” (WAL) está disponível, na qual a leitura e a gravação podem ocorrer simultaneamente.

Por padrão, o WAL não está habilitado. Para ativar o WAL, consulte a documentação do SQLite.


então, hipoteticamente, se você tivesse que resolver um problema em que desejava dados localmente sem torná-los acessíveis para o público em geral, mas a capacidade de gravar vários arquivos em paralelo, você precisará de um arquivo de banco de dados para cada gravação, de modo que várias gravações possam ocorrer simultaneamente. é isso? Sei que vários arquivos geralmente são desaprovados, mas estou tentando descobrir uma maneira de fazer várias gravações de uma tarefa de aipo sem usar um banco de dados do lado do servidor, pois preciso dos dados apenas para cálculos locais
PirateApp

Existe um pragma, locking_mode = exclusive que pode ser usado para bloquear o banco de dados para um único processo, se você quiser evitar esta funcionalidade.
Scovetta

20

SQLite3 permite explicitamente várias conexões :

(5) Vários aplicativos ou várias instâncias do mesmo aplicativo podem acessar um único arquivo de banco de dados ao mesmo tempo?

Vários processos podem ter o mesmo banco de dados aberto ao mesmo tempo. Vários processos podem fazer um SELECT ao mesmo tempo. Porém, apenas um processo pode fazer alterações no banco de dados a qualquer momento.

Para conexões de compartilhamento, use o cache compartilhado SQLite3 :

A partir da versão 3.3.0, o SQLite inclui um modo especial de "cache compartilhado" ( desativado por padrão )

Na versão 3.5.0, o modo de cache compartilhado foi modificado para que o mesmo cache possa ser compartilhado em um processo inteiro, em vez de apenas em um único encadeamento.

5.0 Habilitando o modo de cache compartilhado

O modo de cache compartilhado é habilitado por processo. Usando a interface C, a seguinte API pode ser usada para ativar ou desativar globalmente o modo de cache compartilhado:

int sqlite3_enable_shared_cache (int);

Cada chamada sqlite3_enable_shared_cache () afeta as conexões de banco de dados subsequentes criadas usando sqlite3_open (), sqlite3_open16 () ou sqlite3_open_v2 (). As conexões de banco de dados que já existem não são afetadas. Cada chamada para sqlite3_enable_shared_cache () sobrescreve todas as chamadas anteriores dentro do mesmo processo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.