J(X)Table und Datenbank

Maik20

Erfahrenes Mitglied
Hallo,

ich habe folgendes Problem. Ich habe einen JXTable (Problem besteht aber auch beim JTable) und eine Tabelle in einer Datenbank. In der Tabelle sind ca. 300.000 Datensätze.

Ich habe mir zum laden der Daten folgende Klasse erstellt:

Code:
public class DatabaseTableModel extends DefaultTableModel {

private Vector col;
private Vector data;

public DatabaseTableModel(Database db, String tableName){
	Hashtable hash = db.getTableData(tableName,protokoll);
	col = (Vector)hash.get("COLUMN");
	data = (Vector)hash.get("DATA");
	setDataVector(data, col);
}

public Vector getCol(){
	return col;
}
	
public Vector getData(){
	return data;
}
}

Das Problem ist, das ich bei dieser Variante die Gesamte Tabelle in einen Vector überführe. Das ganze stößt dann bei 300.000 Datensätze an seine Grenzen (OutOfMemory).

Meine Idee ist nun z.B. immer nur maximal 10.000 Datensätze in einen Vector zu laden und die dem JTable bereitzustellen. Erst wenn der Benutzer darüber hinaus scrollt, werden die Daten von der DB nachgeladen.

Macht man das so?
Woher weiß ich von welcher bis welcher Zeile ich die Daten laden muss?

Der JTable ruft ja von sich aus die Funktion getCol auf. Die hat keinen Paramater?

Stehe hier auf den Schlauch.

Danke für Tips
 
Also ich würde es mal so versuchen(allerdings mit JTable):

Ich würde mal die ersten 5.000 Datensätze hinzufügen, natürlich mit einer JScrollbar. Mit hilfe von getVerticalScrollBar() bekommst du eine ScrollBar zurück. Von dieser bekommst du mit getValue() die aktuelle Position der ScrollBar zurück. Wenn diese auf 100 ist, würde ich die nächsten 5.000(nur eine fiktive Zahl) nachladen. und danach nochmals.. und die ersten löschen!

Aber das ist ws. nicht die optimale Lösung, ich glaube mit JViewport kann man genau über solche Datenbereiche navigieren.. musst du dir genauer anschauen.. mit diesem habe ich leider auch noch nie gearbeitet!

Gruß
Harry
 
evtl. solltest du einfach einen Filter voraussetzen.

300.000 Datensätze in einer Tabelle!
An sich ok, aber wirklich *in der Ui*?
Wer scrollt den durch soviele Datensätze?
Wie winzig ist denn da die Scrollbar?
1mm die Scrollbar mit der Maus verschieben, könnten u.U direkt 2000 rows sein!

Nachladen ist ja prinzipiell OK, aber ich könnte mir vorstellen das du dadurch gewisse Einbrüche in der *Performance* bekommst.
Wenn der User wie wild rumscrollt, bist du ständig am Laden und am Löschen.

(Edit: naja, oder halt Speicher erhöhen...)
 
Ja,

das Problem ist mir auch schon durch den Kopf gegangen. Und einige andere ebenso:

- Sortieren (wenn nur ein Teil der Daten geladen ist)
- Filtern (wenn nur ein Teil der Daten geladen ist)

Bei dem Programm handelt es sich um einen einfachen "CSV-Editor" sprich der Nutzer lädt die CSV Datei in eine DerbyDB, kann diese dann öffnen und kann mittels Suchen und Ersetzen einzelne Spalten bearbeiten. Daneben kann er einen Filter setzen um sich einen Teil der Datensätze anzeigen zu lassen.

Also werd ich in die Tabelle erstmal alle Daten laden müssen.

Was mich generell wundert:
Gibt es keinen J(X)Table dem ich einfach zum Start eine Datenbank-Connection und eine SQL-Abfrage übergebe? Und der Table dann z.B. bei einer Sortierung einfach den Befehl in die SQL Query umsetzt?

So muss ich immer einen Vector zwischen JTable und Datenbank schieben. Das muss doch Probleme machen.
 
Gibt es keinen J(X)Table dem ich einfach zum Start eine Datenbank-Connection und eine SQL-Abfrage übergebe? Und der Table dann z.B. bei einer Sortierung einfach den Befehl in die SQL Query umsetzt?
schau dir mal die Klasse RowSorter an (table.setRowSorter()).
 
Zurück