# DB Update via batch



## Br4ve (10. Sep 2012)

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:

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


----------



## SlaterB (10. Sep 2012)

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?


----------



## Br4ve (10. Sep 2012)

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 
	
	
	
	





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


----------



## SlaterB (10. Sep 2012)

oh ja Mist, sowas will ich eigentlich erkennen können, hier übersehen 

Rückgabe von executeBatch() würde wohl verraten, dass nur ein Batch enthalten ist, 
ruhig anschauen, gerade im Problemfall
Demo Prepared Statement Add Batch MySQL : Batch UpdateDatabase SQL JDBCJava


----------

