Geschwindigkeitsproblem.

Status
Nicht offen für weitere Antworten.

VipViper2000

Aktives Mitglied
Huhu!

Aaaalo :lol: : Ich schreibe ja derzeit an meinem Videoverwaltungsprog. Nun folgendes "Problem": Über einen Button lasse ich einen JFileChooser aufspringen, in dem man die Datenbank auswählen kann. Wenn ich dann auf OK klicke werden die Filmnamen aus der Datenbank geholt (ca. 900) und in mein Model der JList eingetragen.

Aus irgendeinem Grund, welchen ich nicht nachvollziehen kann, dauert das ganz "gefühlte" 2 Sekunden. Daher hab ich einfach mal mit System.currentTimeMillis() die Zeit des kompletten Ablaufs gemessen, also von klicken auf OK bis dann die Filme in der JList sind - "nur" 239 ms. Könnt ihr mir einen Tip woran das liegt? Ich weiss auch nicht genau, was ich an Code posten könnte, ich poste einfach mal den etwaigen Ablauf:

Die actionPerformed wo ich den JFileChooser aufploppen lasse....

Code:
if(e.getActionCommand().equals("Datenbank öffnen")) {
			fchooser = new JFileChooser();
			fchooser.setFileFilter(new HSQLDBFilter());
			fchooser.setDialogTitle("CinemaX Datenbank auswählen");
			fchooser.setMultiSelectionEnabled(false);
		
			int returnVal = fchooser.showOpenDialog(gui);
			
			if (returnVal == JFileChooser.APPROVE_OPTION) {
				try{
					String pfad = fchooser.getSelectedFile().getCanonicalPath();
					if(sqlCon.connectDb(pfad.substring(0,pfad.lastIndexOf(".")),2)){
						filme = sqlCon.getMovies2();
						gui.setMovies(filme);
					}else {
						JOptionPane.showMessageDialog(
								gui,
								"Konnte Datenbank nicht öffnen, da es sich nicht um\n" +
							    "um eine gültige CinemaX Datenbank handelt.\n" +
								"Benutzen Sie das Konvertierungstool, um aus einer\n" +
								"VideoStore Datenbank eine CinemaX kompatible Datenbank\n" +
								"zu machen!",
					 		    "Fehler",
			                    JOptionPane.ERROR_MESSAGE);
					}
				}catch(IOException e1){
					e1.printStackTrace();
				}
						
			}
		}

Hier ein Ausschnitt SQL Objekt, wo die Funktion getMovies2() zu finden ist:

Code:
public String[] getMovies2(){
		String sqlQuery = "SELECT Titel FROM Cinemax";
		filme = null;
		int rows;
		try {
			rows = getNumberOfMovies();
			filme = new String[rows];
			Statement stmt = connections.getLast().createStatement();
			rSet = stmt.executeQuery(sqlQuery);
			int i = 0;
			while(rSet.next()){
				filme[i] = rSet.getString(1);
				i++;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return filme;
	}

Und dann die Methode setMovies() in meiner Gui Klasse:

Code:
	public void setMovies(String[] obj){

		for(int i=0;i<obj.length;i++){		
			model.add(i,obj[i]);
		}
		
		setListeners(true);
		
		setButtonsEnabled(true);
		
		filmListe.setSelectedIndex(0);
		
	}

So, wenn ihr eine Idee habt, woran das liegt -> Bescheid sagen :).

Gruß,
VipViper2000
 

Illuvatar

Top Contributor
Also äh, woran was liegt? Es dauerst 240 Millisekunden, es kommt dir vor wie 2... dann liegts vielleicht an deinem Zeitgefühl? :)

Edit: Könnte auch daran liegen, wo du die currentTimeMillis hast... Für 900 Einträge in einer JList wird er auch ne Zeitlang brauchen zum Einfügen und danach zum Rendernetc .
 

VipViper2000

Aktives Mitglied
Nein - wenn ich 900 Einträge in mein Modell einfüge dauert das ca. 31 ms... Und ich hab natürlich die Zeit gemessen inkl. Rendern.

Habe aber gerade noch was anderes probiert: Es soll ja später so ein, dass das Prog immer die zuletzt gewählte Datenbank öffnet ( man hat ja in der Regel eh nur eine ). Beim ersten Start ds Programms dauerts auch in etwa meine "gefühlten" :D 2-3 Sekunden. Wenn ich das Prog aber schließe und dann nochmal ausführe gehts sehr schnell, also auch das hinzufügen usw. Da ist im Prinzip alles sofort da.

Vielleicht isses deshalb auch egal. Beim ersten Start brauchen die meisten Progs ja länger und bei Java hängts ja auch sehr an der VM, dass die erstmal angeschmissen werden muss.
 

Illuvatar

Top Contributor
Ach so meinst du das, ja, beim ersten VM-Start kann das 1-2 Sekunden dauern. In Java6 kannst du für diese Zeit dann aber sogar einen Splashscreen einbauen ;)
 
R

Roar

Gast
VipViper2000 hat gesagt.:
Wenn ich das Prog aber schließe und dann nochmal ausführe gehts sehr schnell, also auch das hinzufügen usw. Da ist im Prinzip alles sofort da.
Vielleicht isses deshalb auch egal. Beim ersten Start brauchen die meisten Progs ja länger und bei Java hängts ja auch sehr an der VM, dass die erstmal angeschmissen werden muss.
:bahnhof: ???:L
dolle begründung, beim nächsten programmstart muss die vm auch erstmal wieder "angeschmissen" werden.
klopp den ganzen code halt nicht in den EDT, dann fühlts sich auch nicht so lang an.

läuft die datenbank eigentlich immer oder musst du die auch erstmal starten in deinem programm ?
 

Bleiglanz

Gesperrter Benutzer
schmeiss mal die Zeile mit rows (unbenutze Variable)
Code:
getNumberOfMovies()
einfach weg, was solln das sein?

und spar dir das connect bei jedem Aufruf (i.A. ist ein connect zu einer Datenbank langsam, auf jeden Fall viel langsam als ein SELECT durchzuziehen)

bei einer GUI-Anwendung reicht i.A. eine Verbindung, die man einfach offen lässt (wenn nicht zuviele user vorhanden)
 

VipViper2000

Aktives Mitglied
dolle begründung, beim nächsten programmstart muss die vm auch erstmal wieder "angeschmissen" werden.

Ähh, nee ;). Also wenn ich in Eclipse arbeite dann ist es definitiv so, der erste Programmstart ( egal welches Programm ich ausführe ) immer lang dauert. Dann startet jedes Programm schnell. Diese Zeit meinte ich aber nicht.

Das Szenario: Mein Programm läuft schon, nur die Datenbank ist noch nicht geladen. Ich connecte also, hole die Daten und schreibe sie in das model.

schmeiss mal die Zeile mit rows (unbenutze Variable)
Code:

1
2


getNumberOfMovies()


einfach weg, was solln das sein?

Öhhm, wieso unbenutzte Variable??

Code:
filme = new String[rows];

Und die Funktion macht genau das, was man vermutet ;): Sie gibt die Anzahl der Reihen aus der Datenbank zurück, also praktisch die Anzahl der Filme. Habe dafür eine extra Funktion gemacht, weil ich diese Information an anderer Stelle auch wiederholt brauche.

und spar dir das connect bei jedem Aufruf (i.A. ist ein connect zu einer Datenbank langsam, auf jeden Fall viel langsam als ein SELECT durchzuziehen)

Wo mache ich denn ein Connect bei jedem Aufruf??
 

Bleiglanz

Gesperrter Benutzer
Code:
filme = new String[rows];
sorry, übersehen

sie gibt die Anzahl der Reihen aus der Datenbank zurück, also praktisch die Anzahl der Filme. Habe dafür eine extra Funktion gemacht, weil ich diese Information an anderer Stelle auch wiederholt brauche
dat is doch quatsch, was passiert denn wenn du dir die zahl abholst, dann fügt ein anderer einen Film ein (oder irgendwo anders im Programm wird einer eingefügt)? Arbeitest du an einer Single-User-Lösung?

Frage: wie holst du dir denn diese Zahl? machst du vorher schon ein SELECT COUNT(*)?

leg doch lieber alles in eine java.util.List oder gleich dem Model für die JList, dann kannst du dir das alles sparen...

Wo mache ich denn ein Connect bei jedem Aufruf??
Was macht denn sqlCon.connectDb(...)?


und btw: wenn du eine längere Operation (sagen wir hier 1/3 Sekunde) im Haupt-Thread startest, dann ist in dieser Zeit die GUI eingefroren - kein Mausklick funktioniert - und es dauert etwas bis die "wieder anspringt"

i.A. nicht zu empfehlen, wenns mal mehr Filme sind geht das in die Hose
 

VipViper2000

Aktives Mitglied
dat is doch quatsch, was passiert denn wenn du dir die zahl abholst, dann fügt ein anderer einen Film ein (oder irgendwo anders im Programm wird einer eingefügt)? Arbeitest du an einer Single-User-Lösung?

Ok, also in dem Punkt stimme ich dir zu. Ich habe halt eine Anzeige der Form "FilmNr/FilmeGesamt". Klar, ich kann als FilmeGesamt natürlich auch die size vom Model nehmen. Mache ich auch.

Frage: wie holst du dir denn diese Zahl? machst du vorher schon ein SELECT COUNT(*)?

Also im Moment mache ich es mit einem ResultSet, das vorwärts und Rückwärtszeiger kann. Ich hole mir also die Anzahl der Reihen mit rSet.last(). Deshalb brauch ich halt nen Zeiger, der vorwärts und rückwärts laufen kann. Gut, ich könnte es mit einem Vector machen, dann müsste ich ja vorher nicht wissen wie groß mein String Array sein muss. Wäre auch ne Möglichkeit :? .

Was macht denn sqlCon.connectDb(...)?

connectDb connected sich zwar an die Datenbank aber das doch nur 1x. Also praktisch, wenn man das Programm startet. Fällt also nicht ins Gewicht.

und btw: wenn du eine längere Operation (sagen wir hier 1/3 Sekunde) im Haupt-Thread startest, dann ist in dieser Zeit die GUI eingefroren - kein Mausklick funktioniert - und es dauert etwas bis die "wieder anspringt"

i.A. nicht zu empfehlen, wenns mal mehr Filme sind geht das in die Hose

Klar, weiss ich doch. Andererseits kann man in der Zeit eh nichts machen. Aber ich hatte auch schonmal versucht da noch nen Thread reinzufrimeln mit ner kleinen ProgressBar. Aber letztendlich gehts dann doch so schnell, dass eher blöd ist. Mal sehen.

Ich hab ja auch ein Konvertierungstool geschrieben, welches Daten von einer vorhandenen Access Datenbank importieren kann - da hab ich das ja gemacht mit nem Arbeitsthread.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben