2013-07-06 5 views
9

Attualmente sto lavorando con un database molto grande (> 50 GB) e sto cercando di capire l'approccio più efficiente e utilizzabile che funzioni bene con il threading intrinseco di Akka.Sincronizzazione di sessioni, efficienza e threading di database in Akka

Per quanto riguarda l'approccio "avvolgere tutto all'interno diSession {}", mentre questa sarebbe una soluzione più semplice, sono preoccupato che ciò limiti il ​​threading di Akka tra gli attori. Non sono così ben informato su come funziona il threading di Akka, e su come avvolgere un intero sistema di attori all'interno di withSession lo farebbe.

Un altro approccio consiste nel chiamare withSession ogni volta che si accede al database, che è troppo inefficiente. Il segmento di codice "withSession {" richiede ~ 6 ms per essere eseguito e stiamo facendo milioni di query.

In sostanza: qual è il modo migliore per accedere rapidamente a un database con Slick e Akka senza interrompere il threading?

Ho sentito parlare di approcci che utilizzano sessioni e transazioni implicite, ma non riesco a trovare la documentazione su nessuno di questi.

+0

Vedere [questa risposta] (http://stackoverflow.com/a/16834855/406435) per ottenere alcuni consigli. – senia

+0

In che modo è possibile interfacciare un ExecutionContext con Sessions? Oppure la soluzione migliore sarebbe semplicemente mettere tutto il codice di accesso al database in un diverso ExecutionContext rispetto al resto? – TreeWhale

+0

È possibile creare N attori, ciascuno con una propria sessione. Ogni attore dovrebbe utilizzare la propria sessione e tutte le comunicazioni con il database dovrebbero essere passate attraverso questo gruppo di attori. – senia

risposta

4

Meglio tardi che mai:

Il modo consigliato utilizza un pool di connessioni JDBC (ad esempio c3p0). È necessario assicurarsi che una sessione sia acquisita e restituita da e conservata nello stesso thread. withSession acquisisce pigramente una connessione dal pool e la restituisce alla fine del campo di applicazione. Acquisisci rapidamente le connessioni quando ne hai bisogno e restituiscile subito dopo al pool.