executeUpdate Problem

Status
Nicht offen für weitere Antworten.

babuschka

Top Contributor
Hallo,

in einer HashSet befinden sich meine Objekte. Ein Objekt besteht aus mehreren Strings.
Nun möchte ich die einzelnen Elemente der HashSet in die DB eintragen.

Dazu durchlaufe ich die HashSet mittels einem Iterator, suche in der MySQL-DB erstmal ob das Objekt darin schon existiert und nur wenn dieses nicht vorhanden ist, wird ein executeUpdate ausgeführt.

Die DB ist komplett leer.
Mittels zweiCounter überprüf ich, wie oft das executeUpdate ausgeführt wird und ob alle Elemente der HashSet durchlaufen werden.
Sobald das executeUpdate auskommentiert ist, durchläuft der Iterator alle Elemente der HashSet und würde alle in der DB eintragen (count = count2=4000). Aber sobald das executeUpdate drinsteht, werden ca. nur 300 Elemente in die DB eingetragen und auch nur so viele in der HashSet durchlaufen (coutn=count2=300)

Hab keine Ahnung woran das liegen könnt.

Code:
public void anfrage2(HashSet<DBInformation> pqSet)
	{
		HashSet<DBInformation> allInfos = pqSet;
		System.out.println("Einträge in der HahsSet-allInfos: "+allInfos.size());
		try
		{ 	
			con = DriverManager.getConnection(url, username, password);
			
			
			for ( Iterator<DBInformation> j = allInfos.iterator(); j.hasNext(); ) 
			 { 
			    	DBInformation s = j.next(); 
			    	count++;
			    	
			    	rs= con.createStatement().executeQuery("Select * From dtc Where DTC = "+s.getDtcDez());
					//Springt ans Ende der ResultSet um überprüfen zu können, wie viele Zeilen die ResultSet hat
					rs.last(); 
					if(rs.getRow()==0)
					{	
						stmt = con.createStatement();
						stmt.executeUpdate("Für den Forumspost gelöscht");
						stmt.close();
						count2++;
					}
					rs.close();
			 }
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		if(con!=null)
		{	
			try
			{
				con.close();
			}
			catch(SQLException e)
			{
				e.printStackTrace();
			}
		}
	}

Ein Insert mittels addBatch geht ned, da ich zuvor prüfen muss, ob das Objekt schon in der DB eingetragen ist.
 
allgemeiner Tipp:
es ist wahrscheinlich performanter, am Anfang EINMAL alle Elemente von dtc auszulesen,
oder wenn es zu viele sind, dann eine Query mit eingeschränkten Werteberech (Min/ Max)
oder letzlich sogar mit allen 4000 einzelnen DTC aufgeführt
(wobei noch zu testen wäre ob diese unhandliche Anfrage nicht doch Probleme macht)

-----

zu deinem Problem:
allgemein:
wie wärs, erstmal mit 2 oder 3 Elementen anzufangen statt 4000?!?
zumindest auf 301 oder 302 wirds du ja wohl runtergehen können wenn 300 die Grenze ist

und wie siehst mit Logging aus?
System.out.println("prüfe DTC "+x", vorhanden? true/ false");

System.out.println("schreibe nun DTC "+x" in die DB");
usw.

-------

könnte es sein, dass die 4000 Elemente nur 300 verschiedene DTC haben?
Ausgabe?
sind hashcode() & equals() passend definiert?
 
vielen dank für deine tipps....werds umsetzen und geb wieder bescheid

SlaterB hat gesagt.:
könnte es sein, dass die 4000 Elemente nur 300 verschiedene DTC haben?
Ausgabe?
sind hashcode() & equals() passend definiert?

hashCoode und equals sind angepasst, daran dürfts ned liegen.
es ist sicher, dass die 4000 elemente alle verschiedene dtc's haben
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben