2012-02-24 12 views
8

So che non è consigliabile utilizzare Sqlite su un'unità di rete, per due motivi: prestazioni e danneggiamento dei dati a causa di una cattiva implementazione dei file system di rete.Come rendere sqlite robusto su un'unità condivisa di Windows

Tuttavia, mi piacerebbe esplorare la possibilità di utilizzare Sqlite per supportare un'applicazione multiutente con un database centrale. Supportiamo già Sqlite su una macchina per utente singolo e diversi server di database (Oracle, PostgreSQL) per configurazioni multiutente. L'uso di Sqlite per la configurazione multiutente sarebbe comodo per consentire installazioni leggere su infrastrutture IT esistenti con unità condivise di Windows (SMB).

Non ci importa troppo delle prestazioni, quindi siamo pronti a pagare il prezzo necessario per evitare la corruzione. Citando http://www.sqlite.org/atomiccommit.html, sezione 9.1:

Ma se è necessario utilizzare un filesystem di rete per memorizzare database SQLite file, considerare l'utilizzo di un meccanismo di blocco secondario per evitare scritture simultanee alla stessa base di dati, anche se il filesystem meccanismo di bloccaggio nativo malfunzionamenti.

Sto cercando suggerimenti e consigli per implementare tale meccanismo o, più in generale, suggerimenti per evitare problemi con Sqlite su un'unità condivisa di Windows.

Ad esempio, sto considerando il seguente approccio cerebrale al blocco: prima di qualsiasi query SQLite (non di sola lettura), provare a creare un file vuoto nella stessa cartella condivisa e tenerlo aperto fino alla fine del la query; normalmente, qualsiasi altro processo di Windows che tenta di creare un file con lo stesso nome mentre è ancora aperto bloccherà o fallirà. Funzionerebbe? Qualcosa di meglio?

+1

SQLite non sostituisce un server di database. –

+2

Lo so e, come ho già detto, supportiamo già diversi tipi di server di database per la nostra applicazione. Vendiamo un'applicazione commerciale; i nostri utenti dispongono sempre di unità condivise prontamente disponibili, ma dover contare sui team IT e DBA per creare e amministrare, ad esempio, un'istanza Oracle per una piccola installazione con 2-10 utenti è estremamente costosa per loro. Stiamo solo cercando qualcosa di più leggero per semplificare l'implementazione (per test o anche per la produzione). –

+0

Non puoi semplicemente aprire il file per una lettura/scrittura non condivisa? Presumibilmente ogni app client ha la propria copia dei dati, quindi significa che non saranno in grado di ottenere una copia aggiornata mentre un altro client sta aggiornando il database. Si potrebbe finire con un sacco di attesa, ma dovrebbe funzionare se il database non è troppo grande. – roryok

risposta

2

Un altro suggerimento sarebbe quello di scrivere un'API che si trova sopra il file SQLite e fa il blocco per voi.

Problemi correlati