2014-06-22 13 views
16

Sto provando con greenDAO e finora sta andando piuttosto bene. Una cosa che non sembra essere coperta dai documenti o dal sito Web (o da qualsiasi luogo :() è come gestisce la sicurezza dei threadEsistono best practice per la sicurezza delle filettature greenDAO?

Conosco le basi citate altrove, come "usa una singola sessione dao" (pratica generale per Android + SQLite) e capisco abbastanza bene il modello di memoria Java: gli interni delle biblioteche appaiono anche sicuri o almeno costruiti con questa intenzione, ma nulla di ciò che ho visto copre:

greenDAO esegue il caching delle entità per impostazione predefinita Questo è eccellente per un programma completamente single-threaded - trasparente e un enorme incremento di prestazioni per la maggior parte degli usi, ma se per esempio, loadAll() e poi modifichi uno degli elementi, sto modificando lo stesso oggetto globale attraverso la mia app. Se lo sto usando sul thread principale (ad es. Per la visualizzazione) e aggiornando il DB su un thread in background (come è giusto e corretto), ci sono problemi di threading evidenti a meno che non si prenda particolare cura.

GreenDAO fa qualcosa "sotto la cappa" per proteggersi da problemi di threading a livello dell'applicazione? Ad esempio, modificare un'entità memorizzata nella cache nel thread dell'interfaccia utente salvandola in un thread in background (meglio sperare che non si interfordino! Specialmente quando si modifica una lista!)? Ci sono delle "migliori pratiche" da proteggere contro di loro, al di là delle preoccupazioni generali sulla sicurezza del filo (cioè qualcosa che greenDAO si aspetta e funziona bene con)? O l'intera cache è fatalmente viziata da un punto di vista della sicurezza multithreaded?

risposta

1

non ho esperienza con greenDAO ma la documentazione qui: http://greendao-orm.com/documentation/queries/

Dice:

Se si utilizza query in più thread, è necessario chiamare forCurrentThread() sulla query per ottenere un Istanza di query per il thread corrente. A partire da greenDAO 1.3, le istanze oggetto di Query sono associate al thread proprietario che crea la query. Ciò consente di impostare in modo sicuro i parametri sull'oggetto Query mentre altri thread non possono interferire. Se altri thread cercano di impostare i parametri nella query o eseguono la query associata a un altro thread, verrà generata un'eccezione. In questo modo, non hai bisogno di una dichiarazione sincronizzata. In effetti si dovrebbe evitare il blocco perché questo potrebbe portare a deadlock se le transazioni simultanee utilizzano lo stesso oggetto Query.

Per evitare tali potenziali blocchi completamente, greenDAO 1.3 ha introdotto il metodo forCurrentThread(). Ciò restituirà un'istanza thread-local della Query, che è sicura da usare nel thread corrente. Ogni volta che viene chiamato forCurrentThread(), i parametri vengono impostati sui parametri iniziali al momento della creazione della query utilizzando il relativo builder.

Mentre per quanto posso vedere la documentazione non dice esplicitamente nulla sul multi-threading a parte questo sembra abbastanza chiaro che sia gestito. Si tratta di più thread che utilizzano lo stesso oggetto Query, quindi è possibile che più thread possano accedere allo stesso database. Certamente è normale che database e DAO gestiscano accessi concorrenti e in questa situazione ci sono molte tecniche collaudate per lavorare con le cache.

0

Per impostazione predefinita, GreenDAO memorizza nella cache e restituisce istanze di entità memorizzate nella cache per migliorare le prestazioni. Per impedire questo comportamento, è necessario chiamare:

daoSession.clear()

per cancellare tutte le istanze memorizzate nella cache.In alternativa è possibile chiamare:

objectDao.detachAll()

per cancellare le istanze memorizzate nella cache solo per l'oggetto DAO specifica.

È necessario chiamare questi metodi ogni volta che si desidera cancellare le istanze memorizzate nella cache, quindi se si desidera disabilitare la memorizzazione nella cache, è consigliabile chiamarli nei metodi di accesso Session o DAO.

Problemi correlati