[suse-programming] Grundsatzfrage: SQL Verbindungen
Hallo alle zusammen, sollte eine SQL Verbindung schon beim Start einer Anwendung geöffnet werden, oder ist es besser sie bei Bedarf zu erzeugen? Nach welchen Kriterien läuft das ab? Any experience? Bye Andre
Hi, also prinzipiell: Dann öffnen wenn Du sie brauchst. Immerhin sind das Ressourcen, die Du sonst sinnlos nutzt. Wenn Du mehrere SQL Abfragen hintereinander senden möchtest, kannst Du das natürlich mit einer einzigen Verbindung und erst nach Ende aller Abfragen die Verbindung schließen. Mike
Moin,
* Andre Heine
sollte eine SQL Verbindung schon beim Start einer Anwendung geöffnet werden, oder ist es besser sie bei Bedarf zu erzeugen? Kommt darauf an, ob Du die Verbindung in jedem Fall brauchts. Wenn Du nur selten oder spät innerhalb der Lebenszeit auf die Datenbank zugreifst, solltest Du die Verbindung erst dann aufbauen.
Wenn Du die Verbindung eh ständig brauchst, kannst Du sie ebensogut sofort aufbauen, evtl. sogar einen Pool von Verbindungen. Thorsten -- If I have seen further, it is by standing on the shoulders of giants. - Sir Isaac Newton
Hi, Am Sonntag, 7. Juli 2002 20:58 schrieb Thorsten Haude:
* Andre Heine
[02-07-07 20:33]: sollte eine SQL Verbindung schon beim Start einer Anwendung geöffnet werden, oder ist es besser sie bei Bedarf zu erzeugen?
Kommt darauf an, ob Du die Verbindung in jedem Fall brauchts. Wenn Du nur selten oder spät innerhalb der Lebenszeit auf die Datenbank zugreifst, solltest Du die Verbindung erst dann aufbauen.
Ich möchte mit Qt einige GUI's entwickeln, die SQL Klassen möchte sehr allg. entwerfen bzw. implementieren. Ich brauche die Verbindungen eigentlich nur beim speichern,etc in der Maske... Das System soll belastbar & schnell (viele Clients) sein. Würde ich die connection immer wieder aufbauen, dauert das immer etwas.
Wenn Du die Verbindung eh ständig brauchst, kannst Du sie ebensogut sofort aufbauen, evtl. sogar einen Pool von Verbindungen.
Wie könnte man das mit dem Pool lösen? Ciao Andre
Moin,
* Andre Heine
Am Sonntag, 7. Juli 2002 20:58 schrieb Thorsten Haude:
* Andre Heine
[02-07-07 20:33]: sollte eine SQL Verbindung schon beim Start einer Anwendung geöffnet werden, oder ist es besser sie bei Bedarf zu erzeugen?
Kommt darauf an, ob Du die Verbindung in jedem Fall brauchts. Wenn Du nur selten oder spät innerhalb der Lebenszeit auf die Datenbank zugreifst, solltest Du die Verbindung erst dann aufbauen.
Ich möchte mit Qt einige GUI's entwickeln, die SQL Klassen möchte sehr allg. entwerfen bzw. implementieren. Ich brauche die Verbindungen eigentlich nur beim speichern,etc in der Maske...
Ich verstehe nicht. Willst Du Widgets bauen? Eine IDE?
Das System soll belastbar & schnell (viele Clients) sein. Würde ich die connection immer wieder aufbauen, dauert das immer etwas.
Klar.
Wenn Du die Verbindung eh ständig brauchst, kannst Du sie ebensogut sofort aufbauen, evtl. sogar einen Pool von Verbindungen.
Wie könnte man das mit dem Pool lösen?
public abstract class Pool { public Pool(int min, int max, int start) { } public Object getItem() { // return item from Pool, removing it } public void addItem(Object object) { // return item to Pool } protected abstract Object createItem(); protected abstract void destroyItem(); } Wenn ein neues Objekt hinzugefügt oder entfernt wird, überprüft ein zweiter Thread, ob die Größe des Pools angepaßt werden muß. Wenn ja, dann wird create/destroyItem aufgerufen. Interessant ist es, verschiedene Strategien zu unterstützen, indem man min, max und start geschickt wählt. public class ConnectionPool extends Pool { protected Object createItem() { // create connection } protected void destroyItem() { // destroy connection } } Die Connections würden dann bei Programmstart (oder sobald Bedarf zu erwarten ist) erstellt werden und von allen Teilen der Applikation benutzt werden. Über Transaktionen mußt Du nochmal nachdenken, evtl. mußt Du get/addItem() überladen. Es würde mich übrigens nicht überraschen, wenn Qt schon so ein Ding anbietet. Thorsten -- Whenever there is a conflict between human rights and property rights, human rights must prevail. - Abraham Lincoln
At 20:33 07.07.2002 +0200, Andre Heine wrote:
Hallo alle zusammen,
sollte eine SQL Verbindung schon beim Start einer Anwendung geöffnet werden, oder ist es besser sie bei Bedarf zu erzeugen?
Nach welchen Kriterien läuft das ab?
Any experience?
Bye
Andre
Hallo Andre, im Grunde ist das dieselbe Frage ob man(n) Variablen lokal oder global definieren sollte. Für übersichtlicheren Quellcode und einfachere Fehlersuche sollte man Verbindungen bei Bedarf öffnen und nach Gebrauch wieder schließen. Damit hast Du zwar etwas Code-Overhead aber auch keine Seiteneffekte. Schönen Sonntag noch Jörg
Moin,
* Joerg Frings-Fuerst
At 20:33 07.07.2002 +0200, Andre Heine wrote:
sollte eine SQL Verbindung schon beim Start einer Anwendung geöffnet werden, oder ist es besser sie bei Bedarf zu erzeugen? im Grunde ist das dieselbe Frage ob man(n) Variablen lokal oder global definieren sollte. Da sehe ich schon einige Unterschiede. Im Grunde sehe ich kaum Gemeinsamkeiten, beschreib doch mal näher, wie Du das meinst.
Für übersichtlicheren Quellcode und einfachere Fehlersuche sollte man Verbindungen bei Bedarf öffnen und nach Gebrauch wieder schließen.
Damit hast Du zwar etwas Code-Overhead aber auch keine Seiteneffekte. Man hat vor allem Performanceverluste, zudem sehe ich nicht, daß Auf- und Abbau einer Datenbankverbindung einfacher sind als auf eine bestehende Verbindung zu verweisen.
Thorsten -- Unterschätze nie die Macht dummer Leute, die einer Meinung sind. - Kurt Tucholsky
On Son, 07 Jul 2002 at 21:59 (+0200), Joerg Frings-Fuerst wrote:
At 20:33 07.07.2002 +0200, Andre Heine wrote:
Hallo alle zusammen,
sollte eine SQL Verbindung schon beim Start einer Anwendung geöffnet werden, oder ist es besser sie bei Bedarf zu erzeugen?
Nach welchen Kriterien läuft das ab? [...] im Grunde ist das dieselbe Frage ob man(n) Variablen lokal oder global definieren sollte.
Für übersichtlicheren Quellcode und einfachere Fehlersuche sollte man Verbindungen bei Bedarf öffnen und nach Gebrauch wieder schließen.
Damit hast Du zwar etwas Code-Overhead aber auch keine Seiteneffekte.
Das sehe ich anders. Nach meiner Erfahrung ist die Verbindungsaufnahme mit einer DB immer eine ziemlich zeitraubende Aktion. Wenn ich _weiss_, dass ich eine Verbindung zur Laufzeit benötige, dann öffne ich sie prinzipiell kurz nach dem Programmstart und schliesse sie erst kurz vor dem Ende wieder. Welche Seiteneffekte soll das haben? Im Gegenteil: Da ich sofort nach dem Programmstart weiss, ob die Verbindungsaufnahme geklappt hat, kann ich das (sonst unter Umständen ziemlich nutzlose) Programm auch gleich beenden - was nutzt mir z. B. der Aufbau einer Suchmaske, wenn ich dann nicht auf die zu durchsuchende DB komme? Der Overhead durch ständige Connects im DBMS ist IMHO viel kritischer zu bewerten. Wenn ich nur unter bestimmten Umständen eine DB-Verbindung brauche, dann kann das anders aussehen. Auch hier sollte man sich aber das Zeitverhalten anschauen. Und ich würde mir überlegen, ob ich dann die einmal aufgebaute Verbindung nicht aufrechterhalte, um weitere Connects zu vermeiden. BTW: Abhängig von der verwendeten Programmiersprache hat man oft keinen Einfluss darauf, wie die Parameter der DB-Verbindung gehalten werden. Arbeitet man z. B. in C mit Informix oder Oracle (esql bzw. proc), dann sind das durch die Präprozessoren generierte, globale Strukturen. Jan
Hi,
From: "Jan Trippler"
On Son, 07 Jul 2002 at 21:59 (+0200), Joerg Frings-Fuerst wrote:
At 20:33 07.07.2002 +0200, Andre Heine wrote:
sollte eine SQL Verbindung schon beim Start einer Anwendung geöffnet werden, oder ist es besser sie bei Bedarf zu erzeugen?
Nach welchen Kriterien läuft das ab? [...] im Grunde ist das dieselbe Frage ob man(n) Variablen lokal oder global definieren sollte.
Für übersichtlicheren Quellcode und einfachere Fehlersuche sollte man Verbindungen bei Bedarf öffnen und nach Gebrauch wieder schließen.
Damit hast Du zwar etwas Code-Overhead aber auch keine Seiteneffekte.
Das sehe ich anders. Nach meiner Erfahrung ist die Verbindungsaufnahme mit einer DB immer eine ziemlich zeitraubende
ACK.
Aktion. Wenn ich _weiss_, dass ich eine Verbindung zur Laufzeit benötige, dann öffne ich sie prinzipiell kurz nach dem Programmstart und schliesse sie erst kurz vor dem Ende wieder. Welche Seiteneffekte soll das haben? Im Gegenteil: Da ich sofort nach dem
Das mit den Seiteneffekten interessiert mich :) Es kann doch eigentlich nur die Verbindung durch z.B. einen Timeout "sterben". Wenn die Verbindung nicht mehr da ist, muß eben eine neue erzeugt werden.
Programmstart weiss, ob die Verbindungsaufnahme geklappt hat, kann ich das (sonst unter Umständen ziemlich nutzlose) Programm auch gleich beenden - was nutzt mir z. B. der Aufbau einer Suchmaske, wenn ich dann nicht auf die zu durchsuchende DB komme? Der Overhead durch ständige Connects im DBMS ist IMHO viel kritischer zu bewerten.
Daran habe ich noch gar nicht gedacht ;((
BTW: Abhängig von der verwendeten Programmiersprache hat man oft keinen Einfluss darauf, wie die Parameter der DB-Verbindung gehalten werden. Arbeitet man z. B. in C mit Informix oder Oracle (esql bzw. proc), dann sind das durch die Präprozessoren generierte, globale Strukturen.
Für mich ist Qt-Sql die Wahl, weil ich einfach verschiedene DB ansprechen kann. IMHO sind die originalen API's aber besser, jedenfalls finde ich das bei der MySQL++ API. Ich werde einfach dem Konzept folgen und die Verbindgung solange wie möglich offen halten... Mal sehen was da passieren kann. Ciao Andre
Am Sonntag, 7. Juli 2002 20:33 schrieb Andre Heine:
sollte eine SQL Verbindung schon beim Start einer Anwendung geöffnet werden, oder ist es besser sie bei Bedarf zu erzeugen?
Nach welchen Kriterien läuft das ab?
Also bei Servlets die ich schreibe, bau ich die Verbindung beim init auf und beim deaktivieren wirds wieder abgebaut. Bringt bei gut frequentierten Seiten eine enorme Geschwindigkeitssteigerung (vor allem, wenn man das dann noch mit prepared SQL-Statements kombiniert). Wann und ob es Sinn macht, dürfte vom konkreten Fall abhängen. Mit meinen Servlets hab ich da keine Probleme, denn nach einer halben Stunde ohne Zugriffe werden sie eh entladen und die Verbindung abgebaut. Bei einigen kommerziellen Datenbanken, die je nach Lizenz nur eine bestimmte Anzahl gleichzeitiger Verbindungen erlaubt, läst sich mit permanenten DB-Verbindungen leichter kontrollieren. -- Machs gut | http://www.iiv.de/schwinde/buerger/tremmel/ Manfred | http://www.knightsoft-net.de
participants (7)
-
Andre Heine
-
Andr� Heine
-
Jan.Trippler@t-online.de
-
Joerg Frings-Fuerst
-
Manfred Tremmel
-
Michael Gebhart
-
Thorsten Haude