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



## thomwer (18. Mrz 2007)

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.


----------



## Roar (18. Mrz 2007)

wenn
> ich fange grad mit Java an
ist vielleicht auch einfach dein code nur mist ???:L
den müsstest du aber zeigen


----------



## trazzag (19. Mrz 2007)

Habe bisher noch keine wirklichen Geschwindigkeitsprobleme bei der Verarbeitung von Acces-DBs gehabt. Wie Roar schon sagte, einfach mal Code posten!


----------



## thomwer (19. Mrz 2007)

Schon mal vielen Dank für Eure Antwort.

Hier ist der 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?


----------



## Guest (19. Mrz 2007)

Optimierungsvorschlag hab ich so auf Anhieb nicht, aber wenn ich mich nicht irre, hast du einen kleinen Fehler in deinem 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 

```
rsData.beforeFirst();
```

...und wozu du 
	
	
	
	





```
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 

```
while (resultSet.isLast() == false) {
resultSet.next();
...
...
}
```
implementiert; aber ich kann mir nicht vorstellen, daß da der Geschwindigkeitsunterschied herrührt...?!?


----------



## thomwer (19. Mrz 2007)

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


----------



## thomwer (19. Mrz 2007)

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 !


----------



## trazzag (19. Mrz 2007)

*kopfkratz*
Also, guck ich nicht richtig, oder war die Zeile

```
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


----------



## AlArenal (19. Mrz 2007)

Macht es eigentlich Sinn 7 Spalten zu selektieren und nur einen Wert daraus zu verwenden?

Kleiner Tipp:
Die Frage ist rhetorisch!


----------



## thomwer (20. Mrz 2007)

> 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.


----------

