2016-05-02 8 views
3

Ich verwende Play-Framework mit Java in einem Projekt. Wir hatten viele gleichzeitige Benutzer, also haben wir uns entschieden, das gesamte Projekt mithilfe von "Play" neu zu schreiben, um von der nicht blockierenden Funktion zu profitieren und mehr gleichzeitige Benutzer zu unterstützen. Die DB hinter dem Projekt ist Oracle, und wie Sie wissen, verwenden alle JDBC-Treiber blockierende IO mit Ausnahme von ReactivMongo. Ich habe viel gesucht und bin zu dem Schluss gekommen, dass es derzeit keine Arbeit gibt, Oracle JDBC-Treiber nicht blockierend zu machen. Allerdings unterstützt Oracle nicht blockierende Aufrufe in seinem nativen OCI-Treiber (Leider basiert es auf Abfragen statt auf Callback oder Interrupt). Es gibt nicht einmal experimentelle Projekte! Dies beweist, dass das Bedürfnis noch nicht spürbar ist und einen Grund haben muss. Natürlich habe ich den folgenden Link gefunden, der für Java ein my-sql asynchronous connector ist, aber nichts für Oracle.Ist es vorteilhaft, das Play-Framework zu verwenden, während JDBC in der Natur blockiert?

Das bringt mich zu meiner Frage. Ist es wirklich vorteilhaft, Play Framework zu verwenden, während ich einen blockierenden JDBC-Treiber für Oracle habe?

+0

Siehe [slick] (http://slick.lightbend.com/doc/3.1.1/introduction.html#reactive-applications). – marcospereira

+0

Es scheint, dass Slick die Leistung verbessert und unter Last belastbar ist, aber trotzdem blockieren Ihre DB-Aufrufe. Übrigens kann ich Slick in Java-Projekten verwenden? – Morshedian

Antwort

0

Verwenden Sie Hintergrundthread für JDBC-Verbindung und kommunizieren Sie mit diesem Thread über Nachrichten.

Ehrlich, Niemand verwendet OCI im nicht blockierenden Modus. Es hat verschiedene nicht dokumentierte Einschränkungen. Und einige OCI-Aufrufe schalten die Bibliothek unvorhergesehen zurück in den Blockiermodus. Auf der anderen Seite ist OCI ziemlich sicher, aus einer Multi-Thread-Umgebung verwendet zu werden.

+0

Es spielt keine Rolle, wo Sie es behandeln, da es einen anderen Thread an einem anderen Ort oder Server blockiert. Ihre CPU wird immer noch verschwendet, wo sie nicht benötigt wird (IO). – Morshedian

+0

Dann schläft ein Thread (wartet auf Antwort von DB), keine Ressourcen werden verschwendet. – ibre5041

+0

Eigentlich ist der Thread im Leerlauf momentan unser Problem. Gemäß dem Konzept der nicht blockierenden Threads dürfen sie nicht im Leerlauf bleiben, sie müssen freigegeben werden, damit sie andere Anfragen bearbeiten können. – Morshedian