ResultSet in JTable

0plan

Bekanntes Mitglied
In meiner Anwendung möchte ich Daten aus einer Datenbank (Tabelle ca 300 000 Datensätze) in einen JTable darstellen. Mit Datensätzen <=100 000 klappt dies auch. Bei mehreren Datensätzen im ResultSet bekomm ich die Out of Heap space Exception.

Wie kann ich es so programmieren, das er quasi in Intervallen die Daten einliest und nicht gleich alle aufeinmal ins RS speichert? Den Heap möchte ich nicht vergrößern, da das ja keine optimale Lösung ist. Es sollten auch ein paar Millionen an Datensätzen eingelesen werden können.

Hier mein Source

Java:
ResultSetMetaData rsmd = null;
        int clmCnt = -1;
        try {
            rsmd = rs.getMetaData();
            clmCnt = rsmd.getColumnCount();
 
        } catch (SQLException e) {
        	 JOptionPane.showMessageDialog(this,e.getMessage(),"Fehler",JOptionPane.ERROR_MESSAGE);
        }
 
        if (rsmd == null || clmCnt == -1) {
            throw new RuntimeException("rsmd is null");
        }
        
        try {
            
        	rs.beforeFirst();
            rs.last();
            int rowCnt = rs.getRow();
            rs.beforeFirst();
        	Object[][] odata = new Object[rowCnt][clmCnt];
            Object[] clmHeaders = new Object[clmCnt];
            
           for (int i = 1; i <= clmCnt; i++) {
               clmHeaders[i - 1] = rsmd.getColumnName(i);
            }
 
            int row = 0;
            while (rs.next()) {
 
                for (int i = 1; i <= clmCnt; i++) {
                    //System.out.print(rs.getString(i) + " ");
                    odata[row][i - 1] = rs.getString(i);
                }
                
                row++;
                System.out.println();
            }
 
            dtm.setDataVector(odata, clmHeaders);
         
        } catch (SQLException e1) {
        	 JOptionPane.showMessageDialog(this,e1.getMessage(),"Fehler",JOptionPane.ERROR_MESSAGE);
        	
        }
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
das kann man in verschiedenen Stufen ziemlich kompliziert machen,
eine beherrschbare Variante ist wohl, neben der Tabelle noch Buttons Hoch/ Runter zu setzen, die dann zu den nächsten x000 Einträge wechseln,
evtl. Anzeige, Eingabe einer bestimmten Seite (Ergebnisse 650/700, vergleichbar mit Forum) statt unendlich oft zu klicken,
im Hintergrund eine Verwaltung der Indexe und Nachladen neuer Daten, alte werden ersetzt, Benutzer muss evtl. immmer bisschen warten,
DB-Anfragen also mit eingeschränkten Bereichen, was je nach Verteilung für sich auch schon ein Problem sein kann

oder die JTable von Anfang an mit komplett mit Dummy-Zeilen befüllen, was allerdings für sich schon den Speicher belasten kann,
und dann die ScrollBar beobachten, je nach Bereich teils im Voraus Daten laden, falls langsam gescrollt wird,
bei großen Sprüngen sicherlich kaum möglich, dann Warten wie in Variante 1, aber zumindest alles ohne separate Buttons

möglich ist auch dass die Tabelle anfangs nicht zu groß ist, wenn sich aber die ScrollBar dem Ende nähert Schritt um Schritt erweitert wird,

besonders schön wäre bestimmt eine scheinbar riesige ScrollBar, aber dennoch nur kleine Tabelle, deren Einträge intelligent hin und her geschoben/ ersetzt werden,
also Aussehen wie Variante 2, nur ohne extrem riesiges Model, sondern effizientere interne Umsetzung

hab eben kurz gesucht, kann dir keinen Link nennen, an Umsetzung dürfte wohl auch nur die erste Variante in Frage kommen,
Rest wäre zumindest für mich auch was neues
 
Zuletzt bearbeitet von einem Moderator:

0plan

Bekanntes Mitglied
Dann hab ich mich ja zumindest nicht all zu dumm bei der Suche im Netz angestellt :) Hatte mir auch schon sowas wie einen Scrollbarlistener überlegt aber da das ganze ziemlich weit geht dachte ich es gibt eventuell schon vorgefertigte Funktionen welche ich nur nicht gefunden hatte. Danke dir
 
S

SlaterB

Gast
was bringt das wenn doch das gesamte ResultSet durchlaufen, alle Ergebnisse übertragen werden?
 

0plan

Bekanntes Mitglied
Durch die Fetchsize wird das Problem leider auch nicht gelöst, dies hatte ich bereits zu Anfang probiert. Die Lösungsvorschläge von dem Link den du gepostet hattest sind wohl eine Möglichkeit, jedoch viel zu Umfangreich für mein Vorhaben. Dort werden vorab eigene Libs erstellt und das geht mir dann vom Aufwand her doch zu weit.

Bisher habe ich noch immer keinen richtigen Ansatz. Wie könnte eine Methode aussehen um in Intervallen ein ResultSet zu füllen, auszulesen und anschließend zu leeren?
 
S

SlaterB

Gast
das ganze besteht als mehr als einer Zeile Code, aus z.B. Buttons, Listener, gestellen DB-Anfragen, Lösch-Aufrufe am Model,
Einfügen neuer Befehle usw.,
tausend Dinge, die je für sich aber einfach sind und sich damit überhaupt keine richtige Frage ergibt

ich werde dir kaum seitenweise Code bauen, auch gar nicht möglich im Detail, aber nichtmal ein Grundgerüst,
du musst nicht unbedingt vorher den perfekten Plan habe und dann alles nur einmal abtippen -> fertig,
arbeite Schritt für Schritt, zunächst in Teilbereichen, Datenbank kann etwa komplett wegfallen, nimm zunächst Dummy-Daten,
nur eine Spalte, in den Zeilen einfache Werte wie 1, 2, 3 oder "a", "b", "c"

fange mit einer Tabelle an, und baue dazu einen ersten Button und überlege was dieser leisten könnte/ sollte

so, jetzt habe ich doch wieder ne Menge geschrieben, aber so allgemein, dass du nicht um eigenes Denken herumkommst ;)
 

0plan

Bekanntes Mitglied
Danke dir, ich werd mich dann mal dran machen. Finds nur ziemlich beknackt das man für eine einzige Select Anweisung so ein haufen Code in Java schreiben muss. In Delphi ist sowas kein Problem, da es mit der Datenbankverknüpfte Tablecomponents gibt. Schade und danke dir für deine Hilfe :)
 
S

SlaterB

Gast

0plan

Bekanntes Mitglied
Super danke dir, das sieht doch um einiges besser aus! Ich poste mal meinen Code wenn es funktioniert für die jenigen die das selbe Problem haben.
 

bERt0r

Top Contributor
Also da dein Error beim Result Set geworfen wird, werden dir spezielle TableModels auch nicht helfen. Ich würde mir mal überlegen, ob die Art wie du dein Datenarray baust nicht suboptimal ist.
rs.beforeFirst();
rs.last();
int rowCnt = rs.getRow();
rs.beforeFirst();
Du läufst ganz am Anfang schon mal das ganze Result set durch, da hilft dir dann die Fetch size natürlich auch nix mehr. Spar dir das und schmeiss die Daten in einen Vector.

Zum Beweis, dass ein Table mit 300000 Datensätzen ohne Probleme klarkommt:
Java:
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.util.Random;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.EmptyBorder;


public class TableTest extends JFrame {

	private JPanel contentPane;
	private JTable table;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TableTest frame = new TableTest();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public TableTest() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		JScrollPane scrollPane = new JScrollPane();
		contentPane.add(scrollPane, BorderLayout.CENTER);
		
		
		System.out.println("creating data");
		
		Vector<String> cols=new Vector<String>();
		cols.add("RowNr");
		char c=65;
		for(int k=0;k<10;k++)
		{
			cols.add(Character.toString(c));
			c++;
		}
		
		
		Random rand=new Random();
		Vector<Vector<String>> data=new Vector<Vector<String>>();
		for(int i=0;i<300000;i++)
		{
			Vector<String> row=new Vector<String>();
			row.add(Integer.toString(i));
			for(int j=0;j<10;j++)
			{
				String s=Long.toString(rand.nextLong(),26);
				row.add(s);
			}
			data.add(row);
		}
		System.out.println("done");
		
		table = new JTable(data,cols);
		
		scrollPane.setViewportView(table);
	}

}
 
S

SlaterB

Gast
ohne nerven zu wollen habe ich auch dazu dann doch nervend anzumerken:
was sollte denn durch das vorherige Durchlaufen passieren, werden deswegen alle Daten doppelt vorgehalten?
selbst wenn, ein konstanter Faktor im niedrigen Bereich wie 2 bedeutet wenig,

und wenn es für 300.000 reichen sollte, was bei anderer Datenmenge pro Eintrag schon wieder anders aussehen kann, dann ist vielleicht bei 600.000 oder 6 Mio. Schluss,
eine sinnvolle Grenze gibts da kaum
mit Paging auf 10.000 Einträge runterzugehen oder auch nur 1000 oder bei tatsächlich noch Speicherproblemen eine individuell gewählte noch niedrigere Zahl X funktioniert dann für beliebig große Tabellen
 
Zuletzt bearbeitet von einem Moderator:

bERt0r

Top Contributor
Vielleicht hab ich mich unklar ausgedrückt: Du wirst auch beim PagingModel die FetchSize für das Result set runtersetzten müssen, sonst sind die Daten ja trotzdem in deinem Heap. Das Model macht ja nix anderes, als dass es, wenn der User weiterscrollt, die nächsten 10000 Datensätze anfordert und dann anzeigt.
 
S

SlaterB

Gast
das ist eine Variante, die vielleicht auch in meinen Links so stehen wenn man genauer nachschaut,

ich schrieb ja ursprünglich eher, dass bei Page-Wechsel das Model geleert, eine neue Datenbankabfrage mit einem bestimmten Index-Bereich ausgeführt und dieses neue ResultSet komplett ins Model geschrieben wird
 
Ä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
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
B ResultSet ohne Datenbank erstellen Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben