2012-03-27 11 views
1

Ich wurde von einem Programmierer angesprochen, der einen Hintergrund in Oracle-Formularen hat und in den Java-Bereich wechselt. Er stellte mir eine Frage, für die ich keine gute Antwort hatte. Anstatt das zu beantworten; Ich mache es immer so oder so wurde mir beigebracht. Ich dachte, ich würde etwas recherchieren.Java-Datenbankverbindung

Frage: Mit Java Multi-Thread-Fähigkeiten; Warum richten Sie keine JDBC-Verbindung zur Datenbank für jeden Benutzer ein, jeder für seinen eigenen Thread? Anstatt einen Verbindungspool einzurichten und Sicherheit anzuwenden, auf die Benutzer auf den Pool zugreifen können?

+0

Was meinen Sie mit "Benutzer" in diesem Zusammenhang? Ein Oracle-Benutzer? Ein Anwendungsbenutzer? – Jon

+0

@Jon Der "Benutzer" wäre in diesem Fall die Anwendung Benutzer – Miller

+2

Ein Thread pro Anwendung Benutzer? Somit würden 500 gleichzeitige Benutzer 500 dedizierten Threads in der JVM entsprechen, bei einem Thread pro Benutzer, von denen viele in Zeiten, in denen der Benutzer gar nichts getan hat, im Leerlauf sind ... können Sie sehen, warum jetzt ein Thread-Pool vorzuziehen ist? Für jede nicht-triviale Anwendung würde der Ansatz nicht skalieren. – Jon

Antwort

3

Ein Verbindungspool kann besser skaliert werden. Wenn Sie eine dedizierte Verbindung pro Benutzer haben, benötigen Sie 50 Verbindungen für 50 Benutzer. Bei einem Pool können Sie wahrscheinlich mit etwa 10 - 20 Verbindungen arbeiten, um die 50 Benutzer zu verwalten (abhängig vom Anwendungsfall). Sehen Sie sich nun eine größere Gruppe an und denken Sie daran, 500, 5000 oder 50000 Benutzer zu verwalten, und Sie werden sehen, dass die 1 Verbindung pro Benutzermodell nicht skaliert wird.

Mit einem Verbindungspool (und einem Thread-Pool) wird jede Anforderung weiterhin von einem Thread und einer Datenbankverbindung verarbeitet, sie werden jedoch aus einem Pool statt aus einem dedizierten pro Benutzer übernommen.

1

Da der Aufwand für die Verwaltung einer Vielzahl von Threads nicht effizient ist. Was passiert, wenn mehr Benutzer vorhanden sind als der Anwendungsserver oder die Datenbank verwalten kann? Was passiert, wenn in einer Datenbanktabelle viele Konflikte auftreten?

Durch die Verwendung eines Verbindungspools müssen Sie nicht von Grund auf neu mit der Datenbank "verbinden", sodass Sie durch die Wiederverwendung von Datenbankverbindungen aus einem Pool einen großen Leistungsschub erhalten.

Etwas wie Apache's DBCP ist ein guter Ausgangspunkt, wenn Sie keinen Anwendungsserver verwenden.