Statische Klasse => Flaschenhals?

Fohnbit

Top Contributor
Hallo!

Es laufen von diversen Klassen ca. 500-600 Instanzen.
Ziel ist es in eine Sqlite DB zuschreiben. Damit nicht jede eine Verbindung dahin aufbaut und einige zentrale DB Operationen Zeitgesteuert durchgeführt werden müssen, würde ich gerne diese Klasse als statisch deklarieren und bei meinen ganzen Projekten hinzufügen.

Statisch, wenn ich es richtig verstehe, heißt die Klasse ist nur 1x im Speicher, auch wenn ich diese in verschiedenen anderen Klassen nutze und in Eclipse im Projekt hinzugefügt habe, richtig?

Ich frage ich aber was passiert, wenn die Methode "writeData" (schreibt die Daten in die DB) alle 500 fast zur selben Zeit aufrufen und Daten zum schreiben übergeben.

Ist das eine sichere Methode? Wenn die Klassen die die statische Methode "writeData" aufrufen einige Millisekungen blockieren ist das kein Problem.
 

InfectedBytes

Top Contributor
was meinst du mit "fast zur selben Zeit"?
Wenn du mit mehreren Threads arbeitest, welche zeitgleich auf deine statische Methode zugreifen können, wird es mit ziemlicher Sicherheit zu Problemen kommen. In dem Fall solltest du die Methode synchronisieren. Dies geht z.B. mit dem synchronized Schlüsselwort.

Wenn du aber nur einen Thread hast, kann es natürlich zu keinen Komplikationen zwischen den Aufrufen kommen.
 

Fohnbit

Top Contributor
Hallo!

Ja, es werden mehrere Threads auf dieselbe Methode zugreifen. Das wird immer zu vollen Stunde sein und daher alle fast zeitgleich.
Also wenn ich "synchronized" nutze, habe ich das Problem nicht?
Gibt es auch einen Nachteil dabei? Denn warum nicht gleich alle statischen Methoden mit "synchronized" ausführen?
 

Thallius

Top Contributor
Natürlich gibt es einen Nachteil. Du verlierst alle Vorteile die du durch das Nutzen von mehreren Threads bekommen hast. Du könntest dann genausogut alle Deine Threads weglassen und einfach 500x nacheinander die gleiche Methode aufrufen.

Das Problem wird sich aber so oder so nicht lösen lassen wenn alle 500 Threads gleichzieitig schreibend auf die gleiche DB zugreifen sollen. Das wird auf jeden Fall einfach nur langsam werden.

Gruß

Claus
 

Fohnbit

Top Contributor
Hallo Claus!

Ok, dann wäre es klug einen Producer/Consumer zu nutzen? Dann könnten alle Threads deren Werte in die Queue legen und der Producer hat dann eigentich eine Stunde Zeit, diese in die DB zu schreiben.
 

Tobse

Top Contributor
Hallo Claus!

Ok, dann wäre es klug einen Producer/Consumer zu nutzen? Dann könnten alle Threads deren Werte in die Queue legen und der Producer hat dann eigentich eine Stunde Zeit, diese in die DB zu schreiben.
Bingo.

Je nachdem, welchen Treiber du für SQLite benutzt kann der das evtl schon. Zumindest große RDS machen das intern: wenn viele Schreibzugriffe passieren, werden die im Ram gespeichert (damit unmittelbar darauf folgende Lesezugriffe keine Inkonsistenzen verursachen) und dann wird das ganze sauber geordnet und effizient auf die Festplatte geschrieben.
 

ARadauer

Top Contributor
Hier über eine statisch Klasse die Verbindung zur Datenbank für die Anwendung zur Verfügung zu stellten halte ich für einen Fehler.

Das kann man schnell mal für einen kleinen Test machen, aber für eine Anwendung mit Klassen 600würde ich echt etwas „professionelleres“ machen.

Ich würde mir Spring ansehen. Du suchst hier Lösungen für Probleme für die sich schon sehr schlaue Leute den Kopf zerbrochen haben. Im Grunde brauchst du eine Resource in deinen Klassen. Die Klassen sollen sich aber nicht um das Verwalten der Resource kümmern… das soll jemand anders machen IOC (inversion of control). Du hast Abhängigkeiten zur Datenbank und das soll von außen über einen Container Mechanismus in deine Objekte rein gepackt werden DI (Dependency Injection). Das ist genau der Anwendungsfall von Spring.

Wenn du hier anfängst mit synchronized zu arbeiten, wirst du noch auf ganz andere Probleme stoßen. Ich würde mir das synchronized auf jeden Fall sparen. Du musst halt aufpassen, dass sich die Threads keine Variablen teilen… was du aber wahrscheinlich willst, da du ja die vermutlich die Connection zur Datenbank cachen willst. Wo wir beim Thema Connection pooling sind… auch ein Problem dass schon jemand gelöst hat. Mit Spring kein Probem…

http://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html
 

Fohnbit

Top Contributor
Ich nutze sqlite-jdbc-3.8.10.1.jar

Der Ablauf wäre dann wie folgt?:
Ich erstelle ein neues Projekt mit dem DatabaseWorker.

In den Projekten die in die DB schreiben erstellen ich:
Java:
  public static final DatabaseBackroundWorker DATABASE_BACKGROUND_WORKER = new DatabaseBackroundWorker();
static weil es diesen nur 1x geben soll, final weil wenn erzeugt, er nicht wieder veränderbar ist.

In der DatabaseWorker Klasse:
  1. Im Constructor die Datenbank Verbindung herstellen und die Tabellen prüfen (da statisch und final wird dieser nur 1x aufgerufen?)
  2. Im Constructor mittels ScheduledExecutorService einen zyklischen Timer für allgemeine Datenbank Operationen definieren und starten

Die Klassen übergeben dann jede Stunde mit:
DATABASE_BACKGROUND_WORKER.putInQueue(msg);
die neuen Messages in den Producer.

Der Consumer startet sobald eine neue Message in der Queue ist, wartet dann noch 10sek (damit andere Klassen noch Infos in die Queue legen können) und gibt dann die Queue an den DatabaseBackgroundWorker zurück, der die Daten abarbeitet.
 

Fohnbit

Top Contributor
Hier über eine statisch Klasse die Verbindung zur Datenbank für die Anwendung zur Verfügung zu stellten halte ich für einen Fehler.

Das kann man schnell mal für einen kleinen Test machen, aber für eine Anwendung mit Klassen 600würde ich echt etwas „professionelleres“ machen.

Ich würde mir Spring ansehen.

Danke für den Link.
Das braucht seine Zeit mich darin einzulesen!
 

Tom299

Bekanntes Mitglied
http://stackoverflow.com/questions/9017762/what-is-the-maximum-connections-for-sqlite3-database
http://stackoverflow.com/questions/3610775/how-many-connections-can-sqlite-3-handle

Wenn deine Klassen unabhängig voneinander sind, also ein insert oder update keine Auswirkung auf eine andere Klasse hat, dann würd ich die SQL-Statements in einer Liste sammeln und dann innerhalb einer Transaktion in die Datenbank übertragen. Nachteil ist aber z.B. wenn was schief geht und du machst ein Rollback, sind natürlich alle Daten aller Klassen für diese Transaktion zurückgesetzt.
 

nvidia

Bekanntes Mitglied
[...]
Ich frage ich aber was passiert, wenn die Methode "writeData" (schreibt die Daten in die DB) alle 500 fast zur selben Zeit aufrufen und Daten zum schreiben übergeben.[...]

Ich nehme an die writeData-Methode ist zustandslos, d.h. benötigt keine irgendwie gearteten Membervariablen ausser das zu schreibende Objekt. Dann passiert da nichts, da die Datenbank selbst Tabellen/Rows sperrt auf denen gerade geschrieben/gelesen wird. Ob das schön ist, ist eine andere Frage da man so nicht koordiniert mit dem "Backpressure" der Datenbank umgehen kann.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
P Klassen statische oder dynamische(?) Klasse Java Basics - Anfänger-Themen 3
M Statische Methoden in Interface/Abstrakte Klasse Java Basics - Anfänger-Themen 6
L Methoden Auf statische Methode einer anderen Klasse zugreifen, die Array zurückgibt Java Basics - Anfänger-Themen 3
A Stilfrage: statische Variable mit Instanz der gleichen Klasse Java Basics - Anfänger-Themen 8
hdi Observer als statische Klasse ? Java Basics - Anfänger-Themen 2
M öffentliche nicht-statische Funktion fremder Klasse ausführn Java Basics - Anfänger-Themen 16
H Was ist nocheinmal eine statische Klasse? Java Basics - Anfänger-Themen 6
J Die statische Main-Methode ändert Instanzvariable? Java Basics - Anfänger-Themen 10
C Größte Zahl aus einem Array ermitteln(als statische Methode) Java Basics - Anfänger-Themen 31
V Variablen statische Variable einer Objektvariable zuordnen Java Basics - Anfänger-Themen 3
S Klassen statische Objekterzeugung vor Konstruktoraufruf??? Java Basics - Anfänger-Themen 6
Queiser Nicht statische Klassen Java Basics - Anfänger-Themen 6
B Statische Methode return funktioniert nicht. Java Basics - Anfänger-Themen 19
C nicht statische Methoden Java Basics - Anfänger-Themen 4
D statische generische Methoden Java Basics - Anfänger-Themen 3
D Statische Variablen/Methoden Java Basics - Anfänger-Themen 3
S Zufallszahl (Statische Attribute und Methoden) Java Basics - Anfänger-Themen 10
N Auf statische Methode zugreufen Java Basics - Anfänger-Themen 9
R Methoden Nicht statische Methode aus Main aufrufen Java Basics - Anfänger-Themen 2
F Privater Konstruktor und statische Methoden Java Basics - Anfänger-Themen 4
S ActionListener und Statische Variablen Java Basics - Anfänger-Themen 4
D Statische Objekte mit variablem Parameter Java Basics - Anfänger-Themen 1
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
T Statische Arrays von Objekten Java Basics - Anfänger-Themen 2
S Java Fragen Konstruktor & Statische Methoden Java Basics - Anfänger-Themen 4
B Java Programm ohne statische Main Methode aufrufen Java Basics - Anfänger-Themen 5
S Datentypen nicht lineare STATISCHE Datenstruktur? Java Basics - Anfänger-Themen 10
E statische Variable ändert sich Java Basics - Anfänger-Themen 7
A Statische Variable in Methoden Java Basics - Anfänger-Themen 7
A Nicht-statische Methode in einer statischen aufrufen Java Basics - Anfänger-Themen 10
M Wann statische Methoden/Attribute? Java Basics - Anfänger-Themen 2
J statische Methoden auf eine LinkedList initialisieren? Java Basics - Anfänger-Themen 5
A statische Arraylist Java Basics - Anfänger-Themen 6
Q Variablen Statische Variablen Java Basics - Anfänger-Themen 8
J Unterschied zwischen statische und nicht statische Methoden? Java Basics - Anfänger-Themen 14
V OOP Statische Klassen-Attribute vererben Java Basics - Anfänger-Themen 4
K Statische Bindung Java Basics - Anfänger-Themen 6
B dynamische/statische Typen Java Basics - Anfänger-Themen 2
S statische Methode nebenläufig Java Basics - Anfänger-Themen 2
R Aufruf statische Methode Java Basics - Anfänger-Themen 7
M Statische Methoden Java Basics - Anfänger-Themen 22
C Relativer Pfad - Statische Methode Java Basics - Anfänger-Themen 6
A Statische Methode "vererben" - Zwang durch annotation processor Java Basics - Anfänger-Themen 10
sqsh statische jlabels dynamisch verwalten Java Basics - Anfänger-Themen 2
S Statische Klassen/ Singleton Java Basics - Anfänger-Themen 13
E Statische Member können nicht vererbt werden? Java Basics - Anfänger-Themen 10
F Generische Typen auch für statische Methoden? Java Basics - Anfänger-Themen 13
B statische Variable Java Basics - Anfänger-Themen 10
M Statische und nicht-statische Funktionen: Desktop.browse(uri); Java Basics - Anfänger-Themen 4
A Stilfrage: statische Methoden und Attribute auf jeden Fall verhindern? Java Basics - Anfänger-Themen 5
H Statische generische Methode Java Basics - Anfänger-Themen 2
A statische Attribute: Vererbung und Zugriff darauf Java Basics - Anfänger-Themen 15
hdi statische synchronisation Java Basics - Anfänger-Themen 6
G statische ArrayList? Java Basics - Anfänger-Themen 8
K Statische Variablen von Objekten im Array Java Basics - Anfänger-Themen 15
K nicht-statische Methode aufrufen Java Basics - Anfänger-Themen 3
S statische variable initialisieren mit exception Java Basics - Anfänger-Themen 2
G statische Variable zugreifen bzw. setzen Java Basics - Anfänger-Themen 6
T in statischem Kontext auf nicht statische Variable beziehen Java Basics - Anfänger-Themen 5
M Statische Funktion Java Basics - Anfänger-Themen 2
C args[] als statische Variablen speicher oder wie? Java Basics - Anfänger-Themen 12
P nicht statische methode instantiieren Java Basics - Anfänger-Themen 7
H statische methoden und sichtbarkeit Java Basics - Anfänger-Themen 13
nadoria statische Methoden (Klassenmethoden) Java Basics - Anfänger-Themen 3
K statische variablen und methode Java Basics - Anfänger-Themen 3
G Statische Methoden? Java Basics - Anfänger-Themen 2
kb statische methoden und throws exception Java Basics - Anfänger-Themen 2
H statische, dynamischer Typ von Variablen Java Basics - Anfänger-Themen 1
M Konstruktor eine statische Methode? Java Basics - Anfänger-Themen 9
H statische,dynamische Bindung Java Basics - Anfänger-Themen 4
N Unterschied statische Attribute u. Methoden <-> objekt Java Basics - Anfänger-Themen 4
O nicht-statische Inhalte auf statische Inhalte verweisen Java Basics - Anfänger-Themen 19
M wann statische klassen? Java Basics - Anfänger-Themen 14
U statische Variablen Java Basics - Anfänger-Themen 12
F Statische Methode - Nicht Statische Methode Java Basics - Anfänger-Themen 10
S Statische Felder - statische Methoden Java Basics - Anfänger-Themen 2
D Statische und Nicht-Statische Methoden Java Basics - Anfänger-Themen 7
K Statische Methoden!? Java Basics - Anfänger-Themen 8
I @Inject in normaler Klasse? Java Basics - Anfänger-Themen 4
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
Simon16 Java ArrayListe von einer Klasse sortieren Java Basics - Anfänger-Themen 2
Amina556 Eigene Klasse definieren Java Basics - Anfänger-Themen 9
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Klasse in Runden Klammern bei Objektimplementierung Java Basics - Anfänger-Themen 4
J Klassen Klasse als Komponententyp bei Feldern Java Basics - Anfänger-Themen 2
J Klassen Instanzen einer Klasse in einer anderen unabhängigen Klasse nutzen Java Basics - Anfänger-Themen 4
Detlef Bosau nichtstatische Innere Klasse, this Pointer. Java Basics - Anfänger-Themen 47
C Unbekannte Methode add bei Klasse die JTree erweitert Java Basics - Anfänger-Themen 14
Soranix Erste Schritte Struktur als Anfänger // Von einer Klasse auf ein Objekt einer anderen Klasse zugreifen. Java Basics - Anfänger-Themen 6
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
B Klasse statisch erstellen da n-mal geladen Java Basics - Anfänger-Themen 3
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
XWing Random Punkte erstellen mit der Random klasse Java Basics - Anfänger-Themen 15
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
frager2345 Optional Klasse Java Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben