Estou fazendo programação de banco de dados usando Java com SQLite.
Descobri que apenas uma conexão de cada vez com o banco de dados possui recursos de gravação, enquanto muitas conexões ao mesmo tempo têm capacidade de leitura.
Por que a arquitetura do SQLite foi projetada assim? Contanto que as duas coisas que estão sendo gravadas não sejam gravadas no mesmo local no banco de dados, por que duas gravações não podem ocorrer ao mesmo tempo?
database
concurrency
sqlite
Biqueira de aço
fonte
fonte
Respostas:
Como "várias gravações simultâneas" é muito, muito mais difícil de realizar no mecanismo de banco de dados principal do que um único gravador e vários leitores. Está além dos parâmetros de design do SQLite, e incluí-lo provavelmente subverteria o tamanho e a simplicidade deliciosamente pequenos do SQLite.
O suporte a altos graus de simultaneidade de gravação é uma marca registrada de grandes mecanismos de banco de dados, como DB2, Oracle, SQL Server, MySQL, PostgreSQL, NonStop SQL e Sybase. Mas é tecnicamente difícil de realizar, exigindo estratégias abrangentes de controle e otimização de simultaneidade, como bloqueio de banco de dados, tabela e linha ou, em implementações mais modernas, controle de simultaneidade com várias versões . A pesquisa sobre esse problema / exigência é volumosa e remonta a décadas .
O SQLite tem uma filosofia de design muito diferente da maioria dos DBMSs centrados no servidor que oferecem suporte a vários gravadores. Ele foi projetado para trazer o poder do SQL e do modelo relacional para aplicativos individuais e, de fato, ser incorporado em cada aplicativo. Esse objetivo requer trocas significativas. Não é necessário adicionar a infraestrutura significativa e a sobrecarga necessárias para lidar com vários gravadores simultâneos.
A filosofia pode ser resumida por uma declaração na página de usos apropriados do SQLite :
fonte
fopen()
, portanto, considere todo o penteado que vem com a gravação simultânea em um arquivo de texto simples.Porque não há servidor que possa dizer se as coisas devem ser gravadas no mesmo local ou não. Existem apenas dois processos tentando gravar em um arquivo.
Conforme apontado em um comentário, gravações simultâneas também podem ser suportadas por um encadeamento interno. Não tenho certeza de como isso funcionaria (também não pensei muito nisso). Enfim, aqui está o porquê do SQLite não usar threads: o Dr. Hipp acha que os threads são ruins.
O fato de o DR Hipp achar que os threads são ruins está documentado nas Perguntas frequentes do SQLite .
fonte