# Wiederverwendung von Prepared Statements



## LivingHell (25. Mai 2009)

Hallo zusammen!

wir haben die von der Uni aus die Aufgabe unsere Datenbankklasse (JDBC, Prostgresql) in einem Projekt zu optimieren.
unter anderem wird auch verlangt, dass wir die SQL-Anfragen im Prepared Statement Cache halten. Die Frage is nur, wie das gemacht wird....????

Bisher hatten wir für jede Anfrage ein PS erzeugt und danach wieder geschlossen.


Vielen dank schonmal!


----------



## maki (25. Mai 2009)

Vielleciht hilft dir das hier: Server Prepared Statements


----------



## LivingHell (25. Mai 2009)

maki hat gesagt.:


> Vielleciht hilft dir das hier: Server Prepared Statements



nich wirklich, soweit sind wir auch schon.

mal nen ausschnitt, wie wir es bisher haben:

```
public List<Ward> getWards() {
		String query = "SELECT * FROM Station";
		try {

			PreparedStatement ps = con.prepareStatement(query);
			ResultSet rs = ps.executeQuery();
			List<Ward> list = new Vector<Ward>();
			while (rs.next()) {
				WardImpl ward = new WardImpl(this, rs.getLong(1));
				ward.setName(rs.getString(2));
				ward.setNumberOfBeds(rs.getInt(3));
				list.add(ward);
			}
			ps.close();
			rs.close();
			return list;

		} catch (SQLException e) {
			throw new FetchException(e);
		}
	}
```

will mein prof evtl, dass wir das PS als Datenfeld in der Klasse anlegen?
das wäre aber zu einfach...


----------



## robertpic71 (25. Mai 2009)

Ich kenne eure Vorgaben nicht. Im "Real Life" löst das bei mir immer der Connectionpool. Die meisten Connectionpools lassen die PreparedStatements per Default offen. D.h. ich hole meine Connections vom Pool und das Close legt sie wieder zurück. Für das Programm ist es jedesmal ein neues preparedStatement, aber der Connectionpool verwendet das "alte" wieder.

Also, außer 

1. Connectionpool
2. selber verwalten (in allen Abstufungen bis zum eigenen Pool oder Programmstart öffnen, ende schließen)
3. Serverseitig aktivieren (siehe maki's post)  [!]

fällt mir auch nichts ein. 

/Robert

Nachtrag:
[!] Ich sehe gerade, dass die im Link gepostete Optionen das Cachen verhindert und nicht fördert....


----------



## LivingHell (29. Mai 2009)

ok, habs dann durch ausprobieren selbst hinbekommen.

man legt erzeugt die PreparedStatements in dem Konstruktor der Datenbankklasse und lässt sie einfach die ganze Zeit offen.
bei vielen anfragen macht sich das dann schon sehr bemerkbar.


Thema erledigt, closed


----------

