Struts2 in webbasierter Anwendung

7bkahnt

Mitglied
Hallo Leute,

ich habe folgendes Problem:

Ich habe eine Testanwendung geschrieben, in der dem Nutzer eine Tabelle angezeigt wird und er diese Datensätze ändern,löschen und neue hinzufügen kann.
Soweit so gut. Nun liegt mein Problem in der parallelen Abarbeitung, wenn beispielsweise 2 Nutzer gleichzeitig 2 unterschiedl. Datensätze ändern wollen.
Der Nutzer kann ein Text und eine Zahl eines Datensatzes ändern.

Das Problem ist , dass die Variable text und zahl bei mir global und statisch sein müssen. Global, weil sie ja in den setter und getter Methoden verwendet werden und static weil meine Funktionen public static sein müssen um sie in der jsp verwenden zu können.
Wenn Nutzer A jetzt also auf ändern klickt werden setText und setZahl aufgerufen und die Variablen entsprechend gesetzt.
Wenn aber Nutzer A und B gleichzeit auf ändern klicken, will er ja jeweils 2 unterschiedliche Werte auf eine statische Variable speichern, was natürlich nicht funktioniert und nur der letzte Wert genommen wird.

Hier mal die java und die jsp-Datei für das Ändern:

change.jsp:
HTML:
 <body> 
   <s:form action="Eingeben">
   <s:textfield label="TEXT255" name="text" size="60"/><br/>
   <s:textfield label="ZAHL6" name="zahl" size="60"/><br/>

   <s:textfield id="webserverid" name="webserverid" size="50" label="Session-ID"/>
  		 
    <s:hidden id="auswahlid" name="auswahlid"/>        
	<s:submit action="changeEingeben"value="Ändern"/>
	</s:form>



EingebenAction.java
Java:
public String change() throws SQLException {
		System.out.println("\nchange()");
		Session session = null;
		Transaction tr = null;

			try {
				Integer usid=user.get(webserverid).getUserID();
				System.out.println("UserID bearbeitet: "+usid);
				System.out.println("auswahlid: "+auswahlid);
				String uname=user.get(webserverid).getUsername();
				System.out.println("Username bearbeitet: "+uname);
				
				session = HibernateSessionFactory.getSession();
				tr = session.beginTransaction();
				
				Calendar cal = Calendar.getInstance();
			    SimpleDateFormat formater = new SimpleDateFormat();
			    String zeit=formater.format(cal.getTime());
				
				Vor_tbspiel_t tbspiel = (Vor_tbspiel_t) session.get(Vor_tbspiel_t.class,auswahlid);
				tbspiel.setText255(text);
				tbspiel.setZahl6(zahl);
				tbspiel.setF_id_a_sb(usid);
				tbspiel.setDatum_a(zeit);
				session.update(tbspiel);
				tr.commit();
				
			} catch (Exception ex) {
				ex.printStackTrace();
				if(tr!=null)tr.rollback();
					else{System.out.println("transaction=null");}
				throw new SQLException("Fehler in change()", ex);
			} finally {
				//Session freigeben
				if (session != null) {
					HibernateSessionFactory.closeSession();
				}
			}
			
			System.out.println("\n\n");
			//setWebserverid setText und setZahl zurücksetzen
			k--;l--;
			System.out.println("change() zurücksetzt");
			
				return "anlegen";
	}

....
....
public void setText(String text) {
		k++;
		while(k>1){
			try {
				System.out.println("warte in setText");
				Thread.sleep(400);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("setText: "+text);
		this.text = text;
	}

	public void setZahl(Integer zahl) {
		l++;
		while(l>1){
			try {
				System.out.println("warte in setZahl");
				Thread.sleep(400);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		if(zahl==null){
			zahl=0;
		}
		System.out.println("setZahl: "+zahl);
		this.zahl = zahl;
	}

Bisher habe ich es so gelöst, dass die Variablen max. von einem Nutzer geändert werden können, bis er fertig ist.
D.h. Nutzer A klickt auf ändern, geht in die setter Methode und dann in die change(). Nutzer B klickt gleichzeitig ändern und muss aber warten bis Nutzer A die change() verlassen hat.

Nur das würde ja heißen, das später mehrere hundert Personen eine Datenbankconnection nur verwenden, weil der Eine auf den Anderen wartet.
Habt ihr vielleicht noch eine Lösung?

grüsse
 
Zurück