# Datenbankeintrag bleibt nach Löschen in JSP vorhanden



## Megatim (29. Jun 2011)

Hallo liebe Leute!

Erstmal ein großes Danek an alle die immer fleißig den Usern helfen! Ich konnte dadurch shcon viele Probleme lösen, ohne eine einzige frage formulieren zu müssen! Nun ist es aber doch mal soweit dass ich nichts gefunden habe und selber ran muss. Also los:

Ich habe eine JSP Seite, welche per SELECT diverse Daten aus der Datenbank liest und als Liste darstellt. Jeder Eintrag der Liste kann einzeln gelöscht werden. Das Löschen funktioniert folgendermaßen:

1. JavaScript Funktion fragt den Nutzer ob er den eintrag wirkjlich löschen möchte
2. Falls nein passiert nichts, falls ja wird ein redirect auf die gleiche Seite ausgeführt, allerdings mit einem Parameter "delete" hinten dran sowie der ID des zu löschenden Eintrages:


```
location='meineSeite.jsp&delete='+deleteID;
```

3. Der Parameter löst eine Java-Methode aus, welche den Eintrag aus der DB löscht (was einwandfrei funktioniert).
4. Die JSP Seite wird nach dem Löschen des Eintrags ganz regulär weitergeladen, also mit SELECT Anfrage, welche die Liste der Einträge erställt usw.

Das Problem ist nun, dass nach dem Löschen der Eintrag zwar Zweifelsfrei aus der Datenbanktabelle gelöscht ist, der SELECT den gelöschten Eintrag jedoch weiterhin anzeigt. Führe ich einen Reload der Seite durch, ist der gelöschte Eintrag dann verschwunden. 

Ich hatte das Problem schon mit einem Workaround gelöst, indem ich ein 2 Sekunden Delay vor den SELECT geschoben habe, allerdings ist das die Holzhammermethode und funktioniert auch nur in 90% der Fälle. 

Ist jemandem schonmal sowas begegnet? Greift da die JSP Seite auf die Tabelle zu bevor der Löschvorgang beendet ist?

Danke für eure Hilfe!


----------



## bERt0r (29. Jun 2011)

Soweit ich mich erinnere ist ein HTTP Server ist so aufgebaut, dass sämtliche Html Objekte quasi gleichzeitig in eigenen Threads erzeugt und an den Client übertragen werden. Wenn du jetzt zwei Funktionen in seperaten jsp Tags hast, werden die quasi gleichzeitig bearbeitet, und es kann sein, dass das select aufgerufen wird, während das drop noch läuft.
Lösung: die zwei Funktionen nacheinander aber in einem jsp skript tag ausführen.

Ich hab das ganze jetzt mal geraten, weil du ja keinen Code gepostet hast, das war das erste das mir bei deinen Symptomen in den Sinn kam.


----------



## maki (29. Jun 2011)

Zeig doch mal den Code... vor allem ist die Reihenfolge und das Transaktionshandling interessant.


----------



## ARadauer (29. Jun 2011)

> jetzt zwei Funktionen in seperaten jsp Tags hast, werden die quasi gleichzeitig bearbeitet,


Ganz falsch! JSP wird am Server ausgeführt, das hat gar nix damit zu tun, das der Browser verschiedene Resourcen parallel lädt..

Was ist es für eine Datenbank? Kollege hat mir vor kurzem von sowas erzählt, dass eine H2 kurz nach dem Commit die Daten noch nicht hatte... 200 ms später waren sie da...


----------



## Megatim (29. Jun 2011)

Hallo und Danke für die schnelle Antworten, is ja echt super hier 

Also die Datenbank ist der SQL Server 2005, der AS ist ein Glassfishv1. 

Code posten stellt sich als etwas schwer heraus, da das kein Privates Projekt ist sondern was von der Arbeit. Ich weiß dass es das sehr schwer macht mir zu helfen, aber da kann cih leider nix machen


----------



## bERt0r (29. Jun 2011)

Es geht hier nicht um die Übertragung zum Client, sondern in der parallelen Abarbeitung der JSP tags. Der Webserver erstellt soweit ich weis für jedes JSP tag ein eigenes Servlet und die laufen dann parallel ab. Wenn 2 solche Servlets jetzt auf eine Datanbank zugreifen, ist das erstellen der Servlets wesentlich schneller als der Zugriff auf die Datenbank.


----------



## maki (29. Jun 2011)

Es wird sicherlich nicht pro Tag ein Servlet erzeugt, sondern pro JSP.
Ansonsten dürfen Optimierungen auch nicht plötzlich Multithreadingprobleme erzeugen.


----------



## bERt0r (2. Jul 2011)

Weil ichs grad in einem andern Thread gesehen habe, deine Datenbank-Funktionen sind nicht zufällig so aufgebaut:

```
public void doStuff(String stuff)
{
//Erzeuge Connection
//Erzeuge Statement
//Execute stuff
//Close Connection & Statement
}
```
Wenn du nämlich fürs drop und fürs select unterschiedliche Connections & Statements verwendest, ist die DB mit dem Drop noch nicht fertig, wenn du mit deinem Select schon daherkommst.
Daher mein Rat vorher das ganze in ein Skript zu stecken, kommt aber auf deine Datenbank handler Architektur an ob du eine Connection & Statments im jsp halten willst, oder ob der Dbhandler sich zentral eine Connection merken soll.
z.B:

```
<% Connection c=DBHandler.connect();
Statement stmt=c.createStatement();
DBHandler.drop(stmt,"5 from emp");
DBHandler.select(stmt,"* from emp");
stmt.close();
c.close();%>
```


----------



## Megatim (8. Jul 2011)

Danke bERt0r, das ist ein super Tipp!

Es sind tatsächlich verschiedene Connections und Statements in Verwendung. Ich habe ausserdem meine JPS gerade auf Threadsafe=false gesetzt, und nun "scheint" es zu gehen. Ich muss aber noch weiter testen bevor etwas spruchreif ist.


----------

