Datenbankverbindung zu langsam beim Insert?

MrTobi

Mitglied
Hallo liebes Forum,
ich habe mal eine Frage ich importiere von 20 - 60 verschiedenen Exceldatein Daten (im Durchschnitt ca. 4500
Zeilen pro Datei)

Mir fällt auf, dass mein Programm alle Daten richtig ließt aber beim schreiben in die DB Daten verloren gehen.
Nun wollte ich euch fragen ob ihr eine Idee habt wie man dies umgehen kann da ich immer das Gefühl habe wenn ich debugge (und somit alles künstlich verlangsamt wird) werden alle Daten pro Datei korrekt importiert.

Nun wollte ich wissen wie ich mein Programm so ändern muss das es eben alle Daten richtig inserted.

Dazu folgende Idee: eine künstliche Pause nach x inserts. (Ich habs mit Thread.Sleep(2000) versucht, aber irgendwie liegt das ganze Programm dann still und zwar länger wie 2 Millisekunden. Und will einfach nix mehr machen.

Generell bin ich immer dankbar für Verbesserungsvorschläge falls euch irgendwas nicht gefällt in den Klassen.

Abfolge meines Programmes:
1.alle daten aus aktuellem Sheet lesen und in Liste schreiben (alle Daten sind vorhanden)
2.alle Objekte in der Liste in die DB schreiben (hier gehen die Daten verlohren)
3. Nächste Datei vornehmen


Hier meine Datenbankklasse:

Java:
package IOHandler;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import Logic.DataHolder;
/**
 *
 * Handles the connection to the database access 
 *
 * Important: Singelton Pattern is used to make sure only one connection 
 * 
 * to the database is established. 
 */
public class DataBaseConnector {

	/**
	 * local Variable
	 */
	private static DataBaseConnector instance;
	private Connection myConn;
	
	
	public Connection getConnection() {
		return myConn;
	}

	/**
	 * Constructor for the class
	 * 
	 * @throws ClassNotFoundException 
	 * 
	 * @throws SQLException 
	 */
	private DataBaseConnector() {
		
		PathReader myPathReader = new PathReader();
		String idDatabasepath = myPathReader.getXmlElements("path.xml", "Database").get(0);
		
		try {
			Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		} catch (ClassNotFoundException e) {
			
			e.printStackTrace();
		}
		String sUsr = "";
		String sPw = "";
		String sDbUrl = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="
				+ idDatabasepath +";READONLY=false;}";

			try {
				myConn = DriverManager.getConnection(sDbUrl, sUsr, sPw);
			} catch (SQLException e) {
				
				e.printStackTrace();
			}
	}

	/**
	 * Make sure singleton is realized
	 * 
	 * @return the connection
	 * 
	 */
	public synchronized static DataBaseConnector getInstance(){
		if (instance == null) {
			instance = new DataBaseConnector();
		}
		return instance;
	}
	
	/**
	 * 
	 * @param currentHolder
	 * 
	 * @throws SQLException
	 */
	public void insertDataHolder(DataHolder currentHolder) throws SQLException{
		
		String query = "INSERT INTO tbl_Excelalle("+"MLFB,"+"Geraet,"+"GeraetAS,"+"ArtikelNr,"+"ASZahl,"+"EinfuegeDatum)"+"VALUES(?,?,?,?,?,?)";
		
				PreparedStatement prstmt = myConn.prepareStatement(query);

				if(currentHolder.getsMLFB()!=null){
					prstmt.setString(1,currentHolder.getsMLFB());
				}else{
					prstmt.setString(1,null);
				}
				
				if(currentHolder.getsGeraet()!=null){
					prstmt.setString(2,currentHolder.getsGeraet());
				}else{
					prstmt.setString(2, null);
				}
				
				if(currentHolder.getiGeraetAS()!=null){
					prstmt.setString(3, currentHolder.getiGeraetAS());
				}else{
					prstmt.setString(3, null);
				}
				
				if(currentHolder.getsArtikelNr()!=null){
					prstmt.setString(4, currentHolder.getsArtikelNr());
				}else{
					prstmt.setString(4, null);
				}
				
				if(currentHolder.getiAS()!=null){
					prstmt.setString(5, currentHolder.getiAS());
				}else{
					prstmt.setString(5, null);
				}
				
				prstmt.setDate(6, new java.sql.Date(System.currentTimeMillis()));
				
				prstmt.executeUpdate();
				
	}
	
	/**
	 * 
	 * @throws SQLException
	 */
	public void closeConn() throws SQLException{
		myConn.close();
	}
}

Aufgerufen wird die insertDataHolder() in einer for each Schleife:

Java:
for (DataHolder inHolder : insertList) {
								try {
									/**
									 * Insert the DataHolder in the database
									 */
									myConnection.insertDataHolder(inHolder);
									isfullimported = true;
								} catch (Exception e) {
									System.out.println("Fehler bei insert von: " +inHolder.toString());
									failImports.add(inHolder);
									isfullimported = false;
								}
							}

Vielen Dank schonmal an euch, ich hoffe jemand hat eine zündene Idee :)

Grüße
MrTobi
 

turtle

Top Contributor
Ich vermute, dass keine Fehlermeldungen kommen, weil Du die sonst erwähnt hättest, oder?

Sonst sehe ich keine grösseren Probleme im Code. Deine Connection läuft natürlich im Auto-Commit-Mode und bedeutet, dass jedes SQL-Statement einzeln committed oder rollbacked wird.

Dieses kann eigentlich nicht das Problem verursachen, um es aber definitiv auszuschliessen, würde ich das mal ändern und alle Insert-Befehle in EINER Transaktion laufen lassen, die Du dann zum Abschluss committest. Dieses sollte auch die Performance etwas erhöhen, obwohl ich da bei Access meine Zweifel habe ;-)

Auf alle Fälle ist es keine Option, das eigene Programm künstlich zu verlangsamen. Dein Hinweis, dass das Programm bei einem Sleep länger braucht als angegeben, ist ein Hinweis, dass die DB anscheinend mehr Locks hält als vermutet, daher mein Vorschlag mit den Transaktionen.

Sonst habe ich auch keinen richtigen Vorschlag, ausser mehr Informationen in der Schleife auszugeben.
 
M

maki

Gast
Ein paar grundsätzliche Anmerkungen:
- die JDBC/ODBC Brücke war nie für den produktiven Einsatz gedacht sondern nur als Demo
- Access ist keine "richtige" Datenbank
- executeUpdate sollte die Anzahl der eingefügten Datensätze zurückgeben, damit könnte der Code feststellen ob auch alles inserted wurde
 

MrTobi

Mitglied
Ersteinmal danke für die schnellen Antworten.

Das Access keine richtige DB ist, ist mir bewusst leider ist dies eine Anforderung und ich kann daran nichts rütteln :(

Das die JDBC/ODBC Brücke nie für den produktiven Einsatz gedacht war, sondern nur als Demo wusste ich erlich gesagt nicht. Gibt es denn eine "richtige" Alternative für die Anbindung an eine Access DB?

Ich würd das gern testen was turtle vorgeschlagen hat und alle Inserts in einer Transaktion durchführen, erlich gesagt weiß ich nur nicht so richtig wie ich das implementieren soll.
Ich meine klar die komplette Liste anstatt jedes Objekt einzeln übergeben aber wie bastelt man dann das Update zusammen?

Also in diesem Fall:

Java:
public void insertDataHolder(List<DataHolder> insertList) throws SQLException{

...

}

Ich hab auch nochmal getestet also es sieht wirklich danach aus als kommt er eben ab dem x-ten Datensatz nicht mehr hinterher und lässt sie praktisch fallen bis er wieder "Luft" hat und insertet fleißig weiter , es sind im Schnitt 700-800 Datensätze die ich verliere.

Grüße
MrTobi
 

turtle

Top Contributor
Nach dem Verbindungsaufbau schaltest Du autoCommit aus:
Java:
con.setAutoCommit(false);
Dadurch wird auch die erste Transaktion (oder nach jedem weiteren commit eine weitere Transaktion,gestartet.

Und nach einer geeigneten Anzahl von Inserts committest Du die Transaktion via
Java:
 con.commit();

Wenn ein Fehler auftritt kannst Du natürlich auch
Java:
con.rollback();
ausführen.
 

MrTobi

Mitglied
Super! Vielen Dank
ich habe nun den Code geändert und es funktioniert. Witzigerweise sogar ohne "Zwischencommit" er fügt nun alle Zeilen ein selbst wenn es 4000 auf einmal sind. Frag mich echt wieso der das mit dem einzelcommit nicht gepackt hat.

Danke an alle!

Grüße
MrTobi
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Datenbankverbindung zu MS Access Datenbankprogrammierung 4
Zrebna Wie mittels PL/SQL eine Datenbankverbindung blockieren? Datenbankprogrammierung 6
B Probleme mit Datenbankverbindung Datenbankprogrammierung 2
J Jar-Datei stellt keine Datenbankverbindung her Datenbankprogrammierung 3
B SQLite Frage zu SQLite Datenbankverbindung Datenbankprogrammierung 7
Danloc Informationen für Datenbankverbindung wo/wie speichern? Datenbankprogrammierung 11
T Problem mit Datenbankverbindung Datenbankprogrammierung 22
I Datenbankverbindung Oracle DB klappt nicht - getConnection returned null Datenbankprogrammierung 8
M Datenbankverbindung mit JSP herstellen Datenbankprogrammierung 19
D Keine Datenbankverbindung Datenbankprogrammierung 4
dat_vin JavaFX Datenbankverbindung über JPA und MySQL Error Datenbankprogrammierung 0
B Datenbankverbindung herstellen Datenbankprogrammierung 6
R Datenbankverbindung kann nicht hergestellt werden Datenbankprogrammierung 8
I SELECT bei Datenbankverbindung Datenbankprogrammierung 6
E Zuverlässige Datenbankverbindung Datenbankprogrammierung 4
B SQLite Java Login + Datenbankverbindung Datenbankprogrammierung 4
M Datenbankverbindung Access Datenbankprogrammierung 3
eskimo328 Datenbankverbindung ohne Passwort im Quelltext bei einer offline Anwendung Datenbankprogrammierung 14
Kenan89 Keine Datenbankverbindung möglich Datenbankprogrammierung 52
T Datenbankverbindung access funtioniert nicht Datenbankprogrammierung 21
K Problem mit Datenbankverbindung via Eclipse Datenbankprogrammierung 2
E Datenbankverbindung mit Oracle JDBC und Eclipse Plugin Quantum db Datenbankprogrammierung 2
N Allg. Frage zur Datenbankverbindung Datenbankprogrammierung 2
C [MSSQL] Datenbankverbindung will nicht klappen... Datenbankprogrammierung 2
Hartigan Datenbankverbindung automatisch aktualisieren Datenbankprogrammierung 3
C MySQL Keine Datenbankverbindung Datenbankprogrammierung 6
D MySQL Datenbankverbindung scheitert Datenbankprogrammierung 9
A Datenbankverbindung mit einer Datenbank auf einem Webspace Datenbankprogrammierung 10
G Wie sieht eine Datenbankverbindung mit jndi aus? Datenbankprogrammierung 3
D Sicherheit für Datenbankverbindung Datenbankprogrammierung 19
MQue MySQL DatenbankVerbindung Datenbankprogrammierung 3
B Datenbankverbindung kann nicht aufgebaut werden. Datenbankprogrammierung 2
M Aus einem Applet eine Datenbankverbindung starten? Datenbankprogrammierung 26
G Datenbankverbindung mit Proxool aufrecht erhalten Datenbankprogrammierung 4
G iBatis Datenbankverbindung - DB-User übergeben Datenbankprogrammierung 4
J Warum ist es aufwendig eine Datenbankverbindung herzustellen Datenbankprogrammierung 3
E Datenbankverbindung verwalten Datenbankprogrammierung 6
J Fehler bei Oracle-Datenbankverbindung Datenbankprogrammierung 2
E Datenbankverbindung Java MySQL Exception Datenbankprogrammierung 10
K Datenbankverbindung zu MySQL in XAMPP Datenbankprogrammierung 11
M Dauerhafte Datenbankverbindung - Timeouts? Datenbankprogrammierung 4
timomeinen [Hibernate] Datenbankverbindung testen Datenbankprogrammierung 11
M Datenbankverbindung bricht nach ca. 12 Stunden Verbindung ab Datenbankprogrammierung 3
K Wann schließt ihr die Datenbankverbindung? Datenbankprogrammierung 7
E Datenbankverbindung von BIRT Datenbankprogrammierung 3
S Datenbankverbindung auslagen Datenbankprogrammierung 3
8 MySQL Datenbankverbindung herstellen FAQ Datenbankprogrammierung 2
A Was passiert wenn eine Datenbankverbindung unterbricht Datenbankprogrammierung 7
T Oracle Resultset to Array sehr langsam. Datenbankprogrammierung 8
K MySQL PreparedStatedment ist zu langsam? Datenbankprogrammierung 9
S CSV Datein in DB übernehmen:PreparedStatement bzw executeBatch() zu langsam Datenbankprogrammierung 11
P MySQL Datenbank an manchen PCs langsam Datenbankprogrammierung 11
S MySQL Auslesung Datenbank sehr langsam Datenbankprogrammierung 16
P MySQL Verbindung nach außen sehr langsam Datenbankprogrammierung 4
B H2 H2 executeQuery ist sehr langsam Datenbankprogrammierung 8
R ODBC-Treiber sehr langsam Datenbankprogrammierung 5
T MySQL PreparedStatement mit INSERTs langsam, Batch-Statement auch Datenbankprogrammierung 4
F JDBC:Mysql extrem Langsam Datenbankprogrammierung 3
E MSSQL-Server connection aufbau sehr langsam Datenbankprogrammierung 2
B Mysql über jdbc sehr langsam Datenbankprogrammierung 4
V PostgreSQL langsam (Blob) Datenbankprogrammierung 10
Z jdbc-Verbundung unter Windows zur Postgresql DB sehr langsam Datenbankprogrammierung 3
L insert in Access-DB sehr langsam!? Datenbankprogrammierung 6
G Select-Abfragen sind sehr langsam Datenbankprogrammierung 7
Kirby.exe Verwirrung beim Query Datenbankprogrammierung 4
Z Beim schließen des Programms die verbindung zur DB beenden. Datenbankprogrammierung 4
C Oracle Fehler beim list.add() Datenbankprogrammierung 5
L MySQL Bekomme einen Fehler beim ResultSet Datenbankprogrammierung 12
H Brauche Hilfe beim Mappen von 3 Tabellen a 1:n mit hbm.xml. Datenbankprogrammierung 34
J Java Eclipse Hilfe beim Programmieren Datenbankprogrammierung 7
B JPA->fehler beim Insert in die Datenbank Datenbankprogrammierung 3
V Fehler beim Generierung Fehler beim Generierung java.lang.ArrayIndexOutOfBoundsException: 0 Datenbankprogrammierung 12
H HSQLDB Beim öffnen folgender Fehler: ... java.lang.NullPointerException Datenbankprogrammierung 1
S Hibernate-Konfiguration : Unverständliche Ausgabe beim Ausführen Datenbankprogrammierung 0
ruutaiokwu sql server werte swappen beim update-vorgang mit unique-constraints..? Datenbankprogrammierung 2
C H2 Syntax fehler beim erstellen einer Tabelle Datenbankprogrammierung 4
M MySQL probleme beim "Generate Tables from Entities" Datenbankprogrammierung 9
T MySQL Multithreading beim Datenbankzugriff Datenbankprogrammierung 3
T Fehler beim ausgeben von Tabellen Inhalt Datenbankprogrammierung 9
J Datentyp der Spalte beim Datenbankdesign unbekannt Datenbankprogrammierung 12
S Derby/JavaDB Probleme beim anlegen einer embedded DB Datenbankprogrammierung 13
W No data found: SQL-Abfrage funktioniert nur beim Debuggen Datenbankprogrammierung 3
N HSQLDB Problem beim Treiberladen im Jar Datenbankprogrammierung 6
M Problem beim Erstellen einer Query Datenbankprogrammierung 7
Paristick MSSQL - JDBC Exception beim Registrieren Datenbankprogrammierung 5
D JDBC Fehler beim laden der nativen Bibliothek db2jcct2 Datenbankprogrammierung 9
S Problem beim Anlegen einer Tabelle Datenbankprogrammierung 5
L Derby/JavaDB Fehler beim Erstellen einer Tabelle Datenbankprogrammierung 2
T Problem beim schreiben von daten Datenbankprogrammierung 4
S MySQL generelles vorgehen beim connect zu entfernter datenbank Datenbankprogrammierung 3
A Derby/JavaDB Probleme beim Einbinden Datenbankprogrammierung 2
L CLOB-Daten werden beim Einfügen in die Datenbank geändert? Datenbankprogrammierung 5
J MySQL Hibernate: Probleme beim Speichern von OneToMany - Datensätzen Datenbankprogrammierung 2
X Vector Verhalten beim DataModel seltsam Datenbankprogrammierung 6
D MySQL Problem beim einfügen von Double-Zahlen Datenbankprogrammierung 4
U MSSQL Verbindung steht, aber meckert beim Statement Datenbankprogrammierung 2
N Probleme beim Aufruf aus der DB Datenbankprogrammierung 7
cosmic Problem beim Update einer Oracle DB Datenbankprogrammierung 7
T Problem beim Update in die Access DB Datenbankprogrammierung 9
F SQLException fangen beim verbinden mit Hibernate Datenbankprogrammierung 17

Ähnliche Java Themen

Neue Themen


Oben