DB Update via batch

Br4ve

Bekanntes Mitglied
Hallo,
ich habe einen "relativ" großen update meiner Oracle-DB vor ( 40-50 Zeilen ), daher habe ich mich dazu entschieden batches zu nutzen. Nur iwie wird bei jeder Durchführung nur eine Zeile, bzw status geupdated.
Hier mein Code:
Java:
public static void set_ps_dark_red(String db, String pgid, String pinid){
	ArrayList<ArrayList<String>> liste = new ArrayList<ArrayList<String>>();
	liste = get_psid_from_pinid(db, pgid, pinid);
	
	PreparedStatement pstmt = null;
	Connection con = datenbankZugriff.dbverbindung.getConnection(db);
	try {
		con.setAutoCommit(false);
		for(ArrayList<String> arlst: liste){
			if(arlst.get(2).equals("2") || arlst.get(2).equals("7") || arlst.get(2).equals("5") || arlst.get(2).equals("1")){
				System.out.println(arlst.get(0));
				int tmp = Integer.parseInt(arlst.get(0));
				pstmt = con.prepareStatement("UPDATE processstep SET status = 9 where psid = ?");
				pstmt.setInt(1, tmp);
				pstmt.addBatch();
				pstmt.clearParameters();
			}
		}
		pstmt.executeBatch();
		System.out.println("executed");
		pstmt.clearBatch();
		pstmt.close();
		con.setAutoCommit(true);
		con.close();
	} catch (SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	
	
	
	
	
	
	
	}

Ich hole mir da die Stati als String aus einer Liste und parse sie dann, das ist wohl längst alles nicht ideal aber es müsste funktionieren. Die Stelle an der es hakt ist glaube ich viel mehr bei den batches. Kann mir jemand etwas dazu sagen? Ich benutze ojdbc14...
 
sind die Zeilen 8 und 23 nur kopiert oder bewußt gesetzt?
geht es wenn du sie wegläßt?
falls sie drin bleiben vielleicht commit() an der Connection nahe Zeile 20 aufrufen

dass ein Status klappt spricht aber nicht unbedingt dafür,
ist arlst.get(2) im if und danach arlst.get(0) als Parameter richtig?
 
Absolut ricchtig, commit() muss gerufen werden. Die Aufrufe von AutoCommit sind sehr bewusst gewählt und sind meines Wissens sogar zwingend erforderlich für diese Batch Befehle. Mir ist es allerdings gelungen das problem zu beseitigen, es lag glaube ich daran dass
Code:
pstmt = con.prepareStatement("UPDATE processstep SET status = 9 where psid = ?");
in der For-Schleife war und dadurch jedesmal neu instanziiert wurde, daher wurde die batch quasi irgendwie jedesmal überschrieben und immer nur ein Statement commited...
 

Neue Themen


Zurück
Oben