Zugriff auf MS-Access-DB ist grottenlangsam. Normal?

Status
Nicht offen für weitere Antworten.

thomwer

Mitglied
Hallo,

ich fange grad mit Java an und komme von VB. Jetzt muss ich aus einer MS-Access-Tabelle mit ca. 500.000 einen Recordset mit ca. 20.000 Datensätzen erstellen und diese Datensätze in ein Array einlesen.

Mit VB und ADO dauert das unter 1 Sekunde, mit Java eine halbe Minute. Warum dauert das mit JDBC so lange? Ich vermute das es daran liegt, dass ich über ODBC die Access-Datei öffne. Meint ihr das ist richtig? Gibt es eine Möglichkeit die Daten schneller zu bekommen?

Wäre sehr dankbar für Eure Hilfe.
 
wenn
> ich fange grad mit Java an
ist vielleicht auch einfach dein code nur mist ???:L
den müsstest du aber zeigen
 
Habe bisher noch keine wirklichen Geschwindigkeitsprobleme bei der Verarbeitung von Acces-DBs gehabt. Wie Roar schon sagte, einfach mal Code posten!
 
Schon mal vielen Dank für Eure Antwort.

Hier ist der Code:

Code:
		Connection con=null;
		Statement stmt=null;

		try
		{
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
			con = DriverManager.getConnection("jdbc:odbc:DBAktie");

			stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
			rsData=stmt.executeQuery("SELECT datum,open,high,low,close,volume,openinterest FROM kurs WHERE internid='"+pInternId+"' ORDER BY datum");
			
			System.out.println("Start DB-Abfrage");
			String name;
			
			rsData.last();
			float hlpClose[] = new float[rsData.getRow()];
			rsData.first();
			int t=0;
			while (rsData.next())
			{
				hlpClose[t]=rsData.getFloat(5);
				t++;
			}
			System.out.println("Ende DB-Abfrage");
		}
		catch(Exception ex)
		{
			System.out.println("Exception:"+ex.getMessage());
		}

Wie gesagt, es kommen ca. 20.000 Datensätze zurück, und die ganze Aktion dauert ca. 30 Sekunden. Und das gleiche in VB mit Ado dauert nicht mal 1 Sekunde.

Hat vieleicht jemand einen Tipp zur optimierung?
 
Optimierungsvorschlag hab ich so auf Anhieb nicht, aber wenn ich mich nicht irre, hast du einen kleinen Fehler in deinem Code:

Code:
rsData.first(); 
         int t=0; 
         while (rsData.next()) 
         { 
            hlpClose[t]=rsData.getFloat(5); 
            t++; 
         }

So wird dir vermutlich der erste Datensatz fehlen. Versuch's mal mit
Code:
rsData.beforeFirst();

...und wozu du
Code:
String name;
brauchst, ist mir nicht so ganz klar, aber das hat ja nicht wirklich was mit deinem Problem zu tun.

Ich hab mal ein Programm entwickelt, in dem ich relativ ähnlich eine Access-DB auslese. Da waren es allerdings nur so um die 6000 Datensätze. Dauerte aber unter eine Sekunde.
Hab's damals über
Code:
while (resultSet.isLast() == false) {
resultSet.next();
...
...
}
implementiert; aber ich kann mir nicht vorstellen, daß da der Geschwindigkeitsunterschied herrührt...?!?
 
Danke für Deine Antwort. Immerhin hat's mich motiviert noch mal das eine oder andere auszuprobieren. und siehe da, ich bin etwas weiter gekommen.

Habe

stmt=con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);

durch

stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

ersetzt, und jetzt ist das ganze so schnell wie in VB 🙂
 
sorry, ich meinte andersherum:

Habe

stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

durch

stmt=con.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);

ersetzt !
 
*kopfkratz*
Also, guck ich nicht richtig, oder war die Zeile
Code:
stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
nicht auch schon in deinem obigen Code vorhanden? ;-)
Der Gast-Post eben war übrigens ich (muß mich hier auf Arbeit immer wieder neu anmelden *grummel*).

EDIT: oh, da warste schneller 🙂
 
Macht es eigentlich Sinn 7 Spalten zu selektieren und nur einen Wert daraus zu verwenden?

Kleiner Tipp:
Die Frage ist rhetorisch! 😉
 
Macht es eigentlich Sinn 7 Spalten zu selektieren und nur einen Wert daraus zu verwenden?

Nee, natürlich nicht. Die anderen Spalten werden auch benötigt, aber ich hab den Code hier im Posting etwas abgekürzt und auf das eigentliche Problem begrenzt. Muss sich ja nicht jeder durch den ganzen kram wursteln 🙂

Jedenfalls scheint es am Cursor-Typ zu liegen, jetzt funktioniert es in menschenwürdiger Performance.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben