Resultset will in While nur EINMAL liefern!

Status
Nicht offen für weitere Antworten.

qeldroma

Mitglied
Erstmal die Code-Snipplets:

Aufruf:
Code:
	public static void main(String[] args) throws Exception {
		Connection oConnection;
		Class.forName("org.gjt.mm.mysql.Driver");
		oConnection = DriverManager.getConnection("jdbc:mysql://....");
		String Mandant="Blafusel";
		int uid=1003;
		DatabaseManager dbBackend = new DatabaseManager(oConnection, uid,false);
		User actUser = new User(uid,dbBackend);
		System.out.println(actUser);
	}

Der "User":
Code:
public class User {
	DatabaseManager dbBackend;
	public User(int uid,DatabaseManager dbBackend) throws Exception{
				this.uid = uid;
				this.dbBackend= dbBackend;
				this.load();
	}

	public void load() throws Exception{
		ResultSet dummy = dbBackend.getDomains(this.uid);
		while (dummy.next()) domains.add(new Domain(dummy.getString("name"),dbBackend));
		dummy.close();
	}
}

..und dbBackend.getDomains(uid):
Code:
	public ResultSet getDomains(int uid) throws SQLException {
		String dummy="SELECT domains.name,isActive FROM domains WHERE domains.users_uid="+uid+";";
		if(debug)write("----------------------------------------------------------------\nMethod: getDomains()\n"+dummy);
		return oStatement.executeQuery(dummy);
	}

Nun, was passiert ist folgendes:

Anhand der UserID sollen alle dazugehörigen Domains ausgelesen werden. Das sind in diesem Falle drei.

Tatsächlich kommt bei Zeile 9 (2. Teil) auch ein Resultset an, welches laut Debugger ein "elementCount" von 3 hat und auch in "elementData" in den ersten drei Einträgen gefüllt ist, will heißen, beim ersten Eintauchen in die Schleife ist das Resultset so, wie erwartet.

Nun "steppe" ich im Debugger weiter, der Debugger springt zurück auf "while" und plötzlich, genau jetzt, ist "elementCount" aus heiterem Himmel auf null gesetzt, weswegen die Schleife somit nicht mehr weiterrennt....

Was denkt ihr?
 

foobar

Top Contributor
Nun "steppe" ich im Debugger weiter, der Debugger springt zurück auf "while" und plötzlich, genau jetzt, ist "elementCount" aus heiterem Himmel auf null gesetzt, weswegen die Schleife somit nicht mehr weiterrennt....
Wird eine Exception geworfen oder bekommst du nicht das erwartete Ergebnis?
 

akira

Bekanntes Mitglied
Du solltest irgendwie besser zwischen reinen Datenobjekten und Zugriffsobjekten trennen.

Du übergibst dem User-Objekt die Datenbank-Connection und erzeugst dann weitere Unterobjekte (Domain) und übergibst denen auch die Instanz. Das ist vom Design her erstmal nicht so toll.

Was machst Du denn im Domain-Konstruktor noch so alles mit dem einen Statement ?

Laut API kann es pro Statement immer nur ein gültiges ResultSet geben:

By default, only one ResultSet object per Statement object can be open at the same time.
 

qeldroma

Mitglied
akira hat gesagt.:
Du solltest irgendwie besser zwischen reinen Datenobjekten und Zugriffsobjekten trennen.
Du übergibst dem User-Objekt die Datenbank-Connection und erzeugst dann weitere Unterobjekte (Domain) und übergibst denen auch die Instanz. Das ist vom Design her erstmal nicht so toll.

Tja, das ist mein wunder Punkt, ich musste alleine designen, nur mit Büchern ausgestattet, obwohl ich bisher nur kleine Applikationen geschrieben habe. Konnte mich auch nicht dagegen wehren ;-)
Aber dafür bin ich umso lernbereiter, wenn du mir hwlfwn möchtest :autsch:

Grundsätzlich habe ich ein drei-Schicht-Modell entwickelt:
1. Ausführende Schicht. Diese ist im direkten Zugriff durch den Tomcat-Webserver
2. Modell-Schicht. Diese repräsentiert das Datenmodell und enthält die Logik.
3. Backend-Schicht. Diese enthält drei Klassen: Eine pro Datenhaltung, in dem Fall also eine für eine MySQL-Datenbank, eine für eine XML-Schnittstelle, etc...

Also, ich sollte also nur im dbBackend die komplette Connection behandeln. Ok. Brauche ich ja nur verlagern. Dachte in der 1. Schicht sei das besser aufgehoben.

Da mein Modell auch auf dieses Backend zugreifen muß, dachte ich, es wäre am einfachsten in der ausführenden Schicht ein zentrales "Datenbank-Backend-Objekt" zu erzeugen und dieses einfach durchzureichen, so daß alle Unterobjekte das gleiche Datenbankobjekt benutzen?

Ich habe wohl dann auch nicht so recht verstanden, was denn tatsächlich ein "Statement" ist. Ich dachte ich könnte tatsächlich für alle Abfragen ein und dasselbe Statement nehmen...?

Grüße, qd
 

akira

Bekanntes Mitglied
Dein 3-Schicht-Modell ist soweit schon in Ordnung, die Datenobjekte sollten jedoch entkoppelt von ihrer Erzeugung sein.

Benutze besser z.B. spezielle Factory-Klassen, die Objekte eines bestimmten Typs erzeugen, d.h eine DB-Connection zu erzeugen, die Abfrage durchzuführen, ein Daten-Objekt zu erzeugen und die setter-Methoden mit den Werten des ResultSets zu befüllen.

Ein Datenbank-Zugriff sieht in der Regel so aus:

1. Connection anfordern
2. ggf. Transaktion starten
3. ein Statement erzeugen
4. entweder Query oder Update ausführen
5. bei Query ResultSet schließen
6. Statement schließen
.. Punkt 3-6 beliebig oft wiederholbar
7. ggf. Transaktion beenden
8. Connection schließen

Für die genannte Factory-Klasse(n) bietet sich das Singleton-Pattern an. Du hast somit von jeder Klasse aus Zugriff auf die Datenhaltung. In der einen Singleton-Instanz erzeugst Du am besten einen ConnectionPool und forderst für jede Methode, z.B. getDomains(..) eine Connection an und gibst diese am Ende der Methode an den Pool zurück.
 

Bleiglanz

Gesperrter Benutzer
anders gesagt:

dein Modell-Objekt "User" sollte keine Methoden haben wie load(), store() usw., weil du dann alles mit Datenbank-Code verunreinigst und immer die connection herumreichen musst. Solche Objekte sollen keine Ahnung davon haben, wie und wo sie persistent gemacht werden.

schreib dir lieber eine Klasse [sagen wir DataStore? als Singleton? Connection im Konstruktor übergeben? ...], die den ganzen Zeug "abstrahiert", so nach dem Motto

User u = dataStore.loadUser(int id)
// mach was
boolean success = dataStore.updateUser(u);
User v = new User();
dataStore.insertUser(v);

usw.
 

qeldroma

Mitglied
Ok, ich muß jetzt erstmal eine Weile kauen, damit ich die Stücke auch schlucken kann :###

Aber ich danke euch schon mal so weit, auch wenn ich mir ziemlich sicher bin hier gleich wieder was hinterherzuschieben ???:L
 

qeldroma

Mitglied
Bleiglanz hat gesagt.:
...dein Modell-Objekt "User" sollte keine Methoden haben wie load(), store() usw., weil du dann alles mit Datenbank-Code verunreinigst und immer die connection herumreichen musst...

Wie kann ich die Logik im Modell haben, wenn ich dort keine Methoden habe?
Ich glaube ich verstehe die "factory"-Klasse nicht.

Vom Ablauf her, wie soll das professionell denn dann aussehen?

  1. . Oberfläche initialisiert Bean um z.B. einen User zu laden. Diese Bean entstammt der 1. Schicht (Ausführungsschicht)
  2. . Bean instanziiert ein User-Objekt, welches sich mittels Konstruktor und userID automatisch mit weiteren Unterobjekten "behängt" und die Eigenschaften füllt.

    .....................
    und irgendwie wandern hier die Daten vom Datenbank-Connector-Objekt, in meinem Fall dbBackend, in die Modell-Objekte (Der User-Christbaum)
    ......................

  3. . dbBackend bietet für jedes Modell-Objekt einen setter, getter, add und delete. Meist nur über die UserID die bei meinem Modell die grundlegenste Eigenschaft darstellt.

Wenn ich "Factory" richtig verstanden habe, schaffe ich damit eine Applikationsweit erreichbare Instanziierung von dbBackend, so daß ich es nicht herumreiche, oder?
 

Bleiglanz

Gesperrter Benutzer
im Prinzip hast du es schon erfasst

nicht user.savetoDb() implementieren, sonder dbBackend.save(user) schreiben

"irgendwie" heisst, dass in der Anwendungslogik ("Business Logic") mit den Modellobjekten gearbeitet wird (d.h. unter andrem, dass auf dias Backend zum Laden/Ändern/Speichern zugegriffen wird )

dazu musst du deine 2. Schicht aufteilen

2.A: Modell-Objekte (=Entitäten) unabhängig von allen anderen "Schichten"

2.B. Applikationslogik: Methoden, Verfahren, Algorithmen usw.; mit Zugriff auf das Backend und die Modelle
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S ResultSet als Parameter an andere Klasse übergeben Datenbankprogrammierung 3
Z ResultSet ist null warum? Datenbankprogrammierung 12
R HSQLDB ResultSet update aktualisiert DB, aber nicht das ResultSet Datenbankprogrammierung 2
Dimax Erstellen ResultSet und Statement Datenbankprogrammierung 30
C PostgreSQL ResultSet.TYPE_SCROLL_SENSITIVE setzen Datenbankprogrammierung 2
L MySQL Bekomme einen Fehler beim ResultSet Datenbankprogrammierung 12
L Zugriff auf ein Resultset Datenbankprogrammierung 7
L MySQL ResultSet vollständig auslesen Datenbankprogrammierung 20
D Resultset schließen ?? Datenbankprogrammierung 5
T Oracle Resultset to Array sehr langsam. Datenbankprogrammierung 8
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
J SQLite ResultSet closed -- Wiederholende DB-Abfragen Datenbankprogrammierung 6
Z MySQL Probleme mit resultSet executQuery Datenbankprogrammierung 3
L ResultSet Datenbankprogrammierung 1
J wie mit resultset.next() über Datensätze iterieren? Datenbankprogrammierung 15
R MySQL Umgang mit ResultSet/Fremdschlüssel ausgeben Datenbankprogrammierung 2
D MySQL ResultSet als Stream weiter geben Datenbankprogrammierung 9
M ResultSet Cachen Datenbankprogrammierung 3
R ResultSet mit "Untertabellen" Datenbankprogrammierung 4
N SQL-Statement Auslesen des Resultset wird immer langsamer Datenbankprogrammierung 6
R Resultset.last() Problem Datenbankprogrammierung 12
PaulG Leeres ResultSet initialisieren Datenbankprogrammierung 6
J Frage zu ResultSet Datenbankprogrammierung 3
J SQL ResultSet Previous Datenbankprogrammierung 10
S MySQL ResultSet in ein Array übertragen Datenbankprogrammierung 7
H PostgreSQL Objekte aus ResultSet Datenbankprogrammierung 5
H ResultSet is closed tritt bei JSF aber nicht bei einer Java-Applikation auf Datenbankprogrammierung 10
O Oracle Resultset greift auf Spaltenüberschriften zu Datenbankprogrammierung 2
Kenan89 Wieso klappt das ResultSet nicht? Datenbankprogrammierung 3
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
F Derby/JavaDB Resultset in JTablemodel Datenbankprogrammierung 2
F Oracle ResultSet zu einer HashMap<Integer, String[]> Datenbankprogrammierung 6
B SQLite ResultSet is TYPE_FORWARD_ONLY Datenbankprogrammierung 5
T Exception ResultSet Datenbankprogrammierung 7
0 ResultSet in JTable Datenbankprogrammierung 14
S [SQL] ResultSet Datenbankprogrammierung 4
R ResultSet Datenbankprogrammierung 4
I Sonderbehandlung wenn ResultSet leer ist Datenbankprogrammierung 9
I Problem mit ResultSet Datenbankprogrammierung 2
I SQL_Abfrage-Ergebnis (ResultSet) in String[] speichern Datenbankprogrammierung 29
B ResultSet wirft komische NullPointerException. Datenbankprogrammierung 3
R Detached ResultSet Datenbankprogrammierung 3
F generelle Vorgehensweise ResultSet Datenbankprogrammierung 5
S ResultSet Datenbankprogrammierung 2
A MySQL ResultSet.updateBytes schlägt fehl Datenbankprogrammierung 2
F ResultSet kann Datenbank nicht update, warum? Datenbankprogrammierung 3
T ResultSet befehl für leere Spalte nicht lesen Datenbankprogrammierung 4
S ResultSet einer Datenbankabfrage - Nullpointer Exception Datenbankprogrammierung 13
A PostgreSQL anfängerfrage: resultset zeilenweise auslesen Datenbankprogrammierung 2
T MySQL ResultSet zurückgeben nachdem Connection geschlossen wurde? Datenbankprogrammierung 3
K Keine ResultSet bei if in StoredProcedure Datenbankprogrammierung 16
D ResultSet gibt nichts aus. Datenbankprogrammierung 3
trash ResultSet Syntax Fehler Datenbankprogrammierung 11
ARadauer JDBC ResultSet schließen? Datenbankprogrammierung 4
M Oracle Problem mit Resultset Datenbankprogrammierung 11
J jdbc ResultSet types Datenbankprogrammierung 5
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
F ResultSet to String[] Datenbankprogrammierung 3
E ResultSet in HashMap Datenbankprogrammierung 8
K Tabelle mit resultset refreshen? Datenbankprogrammierung 4
M Problem mit ResultSet bei SQL Server 2005 Datenbankprogrammierung 6
S ResultSet in ArrayList ablegen Datenbankprogrammierung 17
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
T ResultSet initialisieren Datenbankprogrammierung 2
C kein Resultset Datenbankprogrammierung 2
G ResultSet: String mit Anführungszeichen einlesen Datenbankprogrammierung 8
T ResultSet-Inhalt in Arrays schreiben Datenbankprogrammierung 3
S ResultSet variabel auslesen Datenbankprogrammierung 4
D Anzahl der Elemente im ResultSet ermitteln Datenbankprogrammierung 8
A Leeres ResultSet mit H2 unter Vista Datenbankprogrammierung 3
A Warum ist mein ResultSet leer? Datenbankprogrammierung 5
S ResultSet closed Datenbankprogrammierung 2
Z ResultSet mit einer anderen Datenquelle Datenbankprogrammierung 7
O Spaltenname aus Resultset Datenbankprogrammierung 2
thE_29 ResultSet und doppelte Spalten Datenbankprogrammierung 4
E Neues select auf ein vorhandenes Resultset Datenbankprogrammierung 11
E ResultSet vergisst Reihe? Datenbankprogrammierung 2
N resultset aus andere klasse übergeben Datenbankprogrammierung 3
F ResultSet refresh moeglich? Datenbankprogrammierung 3
S ResultSet enthält keine Daten Datenbankprogrammierung 2
B Geschlossenes ResultSet Datenbankprogrammierung 6
T ResultSet#next Ungültige Reihenfolge (DB2) Datenbankprogrammierung 5
T ResultSet schließen? Datenbankprogrammierung 6
S Tabelle updaten wenn ResultSet aus JDBC-Quelle Datenbankprogrammierung 2
S ResultSet Datenbankprogrammierung 6
F Filtern innerhalb eines Resultset Datenbankprogrammierung 12
S Connection/Statement/ResultSet auf einmal geschlossen Datenbankprogrammierung 8
@ Like-Klausel; NPE bzw. leeres ResultSet Datenbankprogrammierung 4
C Resultset nach connection close weiterreichen Datenbankprogrammierung 5
B No ResultSet was produced Datenbankprogrammierung 2
S ResultSet erweitern ? Datenbankprogrammierung 4
E JDBC, ForwardOnly bei ResultSet nach Uebergabe Datenbankprogrammierung 4
R ResultSet liefert oracle.sql.TIMESTAMP, aber unbrauchbar Datenbankprogrammierung 9
A Probleme mit ResultSet und getString(i) Datenbankprogrammierung 13
RaoulDuke ResultSet - Wie arbeitet sowas intern Datenbankprogrammierung 2
N Probleme mit "nur vorwärts gerichtete ResultSet" Datenbankprogrammierung 7
G Für jede SQL-Abfrage eigenes Statement und ResultSet? Datenbankprogrammierung 3
T MAX und ResultSet#next Datenbankprogrammierung 10
R ResultSet zu bestimmtem DS navigieren Datenbankprogrammierung 4
S .leeres Resultset abfangen Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben