2010-07-09 13 views
5

Folks Sto implementando una coda basata su file (see my earlier question) usando sqlite. Ho i seguenti thread in esecuzione in background:sqlite database connection/locking question

  1. filo-1 svuotare una struttura di memoria nella tabella "coda" (un inserimento in tabella "coda").
  2. thread-1 per leggere e "elaborare" la tabella "queue" viene eseguita ogni 5-10 secondi
  3. thread-3 - viene eseguita molto raramente e elimina i vecchi dati non più necessari dalla tabella "coda" e anche esegue vuoto in modo che la dimensione del file di database rimanga piccola.

Ora il comportamento che desidero è che ogni thread ottenga il blocco necessario (in attesa con un timeout se possibile) e quindi il completamento della transazione. Va bene se i thread non vengono eseguiti contemporaneamente: ciò che è importante è che la transazione una volta che inizia non fallisce a causa di errori di "blocco" come "il database è bloccato".

Ho guardato il transaction documentation ma non sembra esserci una funzione di "timeout" (sto usando JDBC). Il timeout può essere impostato su una grande quantità nella connessione?

Una soluzione (non provata) a cui posso pensare è disporre di un pool di connessione di max 1 connessione. Quindi solo un thread può connettersi alla volta e quindi non dovremmo vedere errori di blocco. Ci sono modi migliori?

Grazie!

risposta

2

Se fosse il mio caso, utilizzerei un unico handle di connessione al database. Se un thread ne ha bisogno, può allocarlo all'interno di una sezione critica (o mutex, o simile) - questo è fondamentalmente il pool di connessioni di un uomo povero con una sola connessione nel pool :) Può fare affari con il database. Al termine, esce dalla sezione critica (o libera il mutex o?). Non si otterranno errori di blocco se si utilizza attentamente la singola connessione db.

-Don

+0

Grazie Don, questo è ciò che potrei finire facendo però impostazione tramite un pool db sarebbe più modo "standard" di farlo (e meno confusione dal momento che si sta trattando lo SQLite come altri database nel codice. – serverman