2013-07-06 5 views
9

Ich arbeite derzeit mit einer sehr großen Datenbank (> 50GB) und versuche den effizientesten, brauchbaren Ansatz zu verstehen, der gut mit Akkas inhärentem Threading funktioniert.Slick Datenbank Sessions, Effizienz und Threading in Akka

In Bezug auf die "Wrapping alles in withSession {}" Ansatz, während dies eine einfachere Lösung wäre, mache ich mir Sorgen, dass dies Akka Threading zwischen Akteuren beschränken würde. Ich bin nicht so gut informiert darüber, wie Akkas Threading funktioniert und wie das Umwickeln eines ganzen Actor-Systems in withSession es bewirken würde.

Ein anderer Ansatz besteht darin, withSession immer dann aufzurufen, wenn auf die Datenbank zugegriffen wird, was zu ineffizient ist. Das "withSession {" Code-Segment benötigt ~ 6ms, um ausgeführt zu werden, und wir machen Millionen von Anfragen.

Im Wesentlichen: Was ist der beste Weg, schnell auf eine Datenbank mit Slick und Akka zugreifen, ohne Threading zu brechen?

Ich habe von Ansätzen mit impliziten Sitzungen und Transaktionen gehört, aber ich habe Mühe, Dokumentation zu diesen beiden zu finden.

+0

Siehe [diese Antwort] (http://stackoverflow.com/a/16834855/406435), um einige Ratschläge zu erhalten. – senia

+0

Wie genau können Sie einen ExecutionContext mit Sitzungen verbinden? Oder wäre die beste Lösung, einfach den gesamten Datenbankzugriffscode unter einen anderen ExecutionContext zu stellen als den Rest? – TreeWhale

+0

Sie könnten N Schauspieler erstellen, jede mit ihrer eigenen Sitzung. Jeder Akteur sollte seine eigene Sitzung verwenden und die gesamte Kommunikation mit der Datenbank sollte durch diese Gruppe von Akteuren geleitet werden. – senia

Antwort

4

Besser spät als nie:

Der empfohlene Weg, um eine JDBC-Verbindung Pool verwendet (z c3p0). Sie müssen sicherstellen, dass eine Sitzung erworben und zurückgegeben wird und dazwischen in demselben Thread beibehalten wird. withSession Lazily erwirbt eine Verbindung aus dem Pool und gibt sie am Ende des Bereichs zurück. Erwerben Sie schnell Verbindungen, wenn Sie sie brauchen, und geben Sie sie sofort wieder in den Pool zurück.