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:
EingebenAction.java
hibernate.cfg.xml:
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
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:
package Nutzer;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import sun.jdbc.odbc.ee.DataSource;
import com.opensymphony.xwork2.ActionSupport;
import db.HibernateSessionFactory;
import db.Vor_anwender_t;
import db.Vor_tbspiel_t;
public class EingebenAction extends ActionSupport {
public static String userName,query, text,datum_a, datum_c, neutext,webserverid,sessionid;
public static Integer id,zahl,f_id_a_sb,f_id_c_sb,neuzahl,auswahlid,UserID;
public static Connection myConnection;
// public static ResultSet rs;
public static List<tbspiel_t> tabelle = new ArrayList<tbspiel_t>();
public static Map<String,User> user = new HashMap<String,User>();
public static Integer i=0,j=0,k=0,l=0,u=0;
static Vector aenderungen=new Vector();
public String DBVerbindung() throws SQLException{
System.out.println("\nDBVerbindung()");
Session session = null;
Transaction tr = null;
try {
session = HibernateSessionFactory.getSession();
//Userabfrage aus anwender_t
String statement = "select user.id from Vor_anwender_t user where user.username=?";
List list = session.createQuery(statement).setString(0, userName).list();
UserID=(Integer) list.get(0);
user.put(webserverid, new User(UserID,userName));
System.out.println("User verglichen");
System.out.println("userName: "+userName);
System.out.println("UserID :"+UserID);
System.out.println("webserverid :"+webserverid);
} catch (Exception ex) {
ex.printStackTrace();
if(tr!=null)tr.rollback();
else{System.out.println("transaction=null");}
throw new SQLException("Fehler in DBVerbindung()", ex);
} finally {
//Session freigeben
if (session != null) {
HibernateSessionFactory.closeSession();
}
}
//setwebserverid und setuserName zurücksetzen und DBVerbindung() fertig
i--;j--;
if(userName.equals("Ben")){
System.out.println("Sachbearbeiter: "+userName);
return "Sachbearbeiter";
}
else{
return "anlegen";
}
}
public static void auslesen() throws SQLException, InterruptedException {
System.out.println("\nauslesen()");
Session session = null;
Transaction tr = null;
try {
// Tabelle auslesen und anzeigen
tabelle.clear();
session = HibernateSessionFactory.getSession();
session.beginTransaction();
String statement = "FROM Vor_tbspiel_t test order by test.id";
List list = session.createQuery(statement).list();
for (Iterator iterator = list.iterator(); iterator.hasNext();){
Vor_tbspiel_t tbspiel = (Vor_tbspiel_t) iterator.next();
id=tbspiel.getId();
text=tbspiel.getText255();
zahl=tbspiel.getZahl6();
f_id_a_sb=tbspiel.getF_id_a_sb();
datum_a=tbspiel.getDatum_a();
f_id_c_sb=tbspiel.getF_id_c_sb();
datum_c=tbspiel.getDatum_c();
sessionid=tbspiel.getSessionid();
if (zahl == null) zahl = 0;
if (f_id_a_sb == null) f_id_a_sb = 0;
if (datum_a == null) datum_a = "-";
if (f_id_c_sb == null) f_id_c_sb = 0;
if (datum_c == null) datum_c = "-";
if (sessionid == null) sessionid = "-";
tabelle.add(new tbspiel_t(id, text, zahl, f_id_a_sb, datum_a, f_id_c_sb,datum_c, sessionid));
}
} catch (Exception ex) {
ex.printStackTrace();
if(tr!=null)tr.rollback();
else{System.out.println("transaction=null");}
throw new SQLException("Fehler in auslesen()", ex);
} finally {
//Session freigeben
if (session != null) {
HibernateSessionFactory.closeSession();
}
}
//setAuswahlid zurücksetzen
u--;
}
public String aktualisieren() throws SQLException, InterruptedException{
j--;
if(user.get(webserverid).getUsername().equals("Ben")){
return "Sachbearbeiter";
}
else{
return "anlegen";
}
}
public static String changeanzeige() {
return "change_angezeigt";
}
public static Vector changeanzeige2() throws SQLException {
try {
System.out.println("warte changeanzeige2()");
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("\nchangeanezeige2()");
Session session = null;
Transaction tr = null;
try {
aenderungen.clear();
session = HibernateSessionFactory.getSession();
session.beginTransaction();
System.out.println("auswahlid: "+auswahlid+"\n\n");
String statement = "FROM Vor_tbspiel_t test where test.id=?";
Query query = session.createQuery(statement);
query.setInteger(0, auswahlid);
List list=query.list();
for (Iterator iterator = list.iterator(); iterator.hasNext();){
Vor_tbspiel_t tbspiel = (Vor_tbspiel_t) iterator.next();
text=tbspiel.getText255();
zahl=tbspiel.getZahl6();
f_id_a_sb=tbspiel.getF_id_a_sb();
datum_a=tbspiel.getDatum_a();
f_id_c_sb=tbspiel.getF_id_c_sb();
datum_c=tbspiel.getDatum_c();
sessionid=tbspiel.getSessionid();
aenderungen.add(0, text);
aenderungen.add(1, zahl);
}
} catch (Exception ex) {
ex.printStackTrace();
if(tr!=null)tr.rollback();
else{System.out.println("transaction=null");}
throw new SQLException("Fehler in changeanzeige()", ex);
} finally {
//Session freigeben
if (session != null) {
HibernateSessionFactory.closeSession();
}
}
//setwebserverid und setAuswahlid zurücksetzen
j--;u--;
System.out.println("changeanz2() zurücksetzt");
System.out.println("aenderungen: "+aenderungen.elementAt(0)+" "+aenderungen.elementAt(1));
return aenderungen;
}
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
j--;k--;l--;
System.out.println("change() zurücksetzt");
if(user.get(webserverid).getUsername().equals("Ben")){
return "Sachbearbeiter";
}
else{
return "anlegen";
}
}
public String delete() throws SQLException {
System.out.println("\ndelete()");
Session session = null;
Transaction tr = null;
try {
session = HibernateSessionFactory.getSession();
tr = session.beginTransaction();
Vor_tbspiel_t tbspiel = (Vor_tbspiel_t) session.get(Vor_tbspiel_t.class, auswahlid);
session.delete(tbspiel);
tr.commit();
} catch (Exception ex) {
ex.printStackTrace();
if(tr!=null)tr.rollback();
else{System.out.println("transaction=null");}
throw new SQLException("Fehler in delete()", ex);
} finally {
//Session freigeben
if (session != null) {
HibernateSessionFactory.closeSession();
}
}
//setWevserverid zurücksetzen
j--;
System.out.println("delete() zurücksetzt");
if(user.get(webserverid).getUsername().equals("Ben")){
return "Sachbearbeiter";
}
else{
return "anlegen";
}
}
public String hinzuanzeige() {
//setwebserverid und setAuswahlid zurücksetzen
j--;u--;
return "hinzuanzeige";
}
public static String hinzu() throws SQLException {
System.out.println("\nhinzu()");
Session session = null;
Transaction tr = null;
try {
Calendar cal = Calendar.getInstance();
SimpleDateFormat formater = new SimpleDateFormat();
String zeit=formater.format(cal.getTime());
session = HibernateSessionFactory.getSession();
tr = session.beginTransaction();
//audsid-abfrage
// String statement="select v.audsid from v$session v where v.username=? and v.status=?";
// Query query=session.createQuery(statement)
// .setString(0,"SYSTEM" )
// .setString(1, "ACTIVE");
// List list=query.list();
String audsid= webserverid;
System.out.println("audsid"+audsid);
//hinzufügen
String uname=user.get(webserverid).getUsername();
System.out.println("Username aus map fügt hinzu: "+uname);
Integer usid=user.get(webserverid).getUserID();
System.out.println("usid aus map fügt hinzu: "+usid);
Vor_tbspiel_t tbspiel = new Vor_tbspiel_t();
tbspiel.setText255(neutext);
tbspiel.setZahl6(neuzahl);
tbspiel.setF_id_c_sb(usid);
tbspiel.setDatum_c(zeit);
tbspiel.setSessionid(audsid);
session.save(tbspiel);
tr.commit();
//setwebserverid zurücksetzen
j--;
System.out.println("hinzu() zurücksetzt");
} catch (Exception ex) {
ex.printStackTrace();
if(tr!=null)tr.rollback();
else{System.out.println("transaction=null");}
throw new SQLException("Fehler in hinzu()", ex);
} finally {
//Session freigeben
if (session != null) {
HibernateSessionFactory.closeSession();
}
}
if(user.get(webserverid).getUsername().equals("Ben")){
return "Sachbearbeiter";
}
else{
return "anlegen";
}
}
// getter und setter
public void setWebserverid(String webserverid) {
j++;
while(j>1){
try {
System.out.println("warte in setWebserverid");
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("setwebserverid: "+webserverid);
this.webserverid = webserverid;
}
public void setUserName(String userName) {
i++;
while(i>1){
try {
System.out.println("warte in setuserName");
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.userName = userName;
}
// von anlegen.jsp
public void setAuswahlid(Integer auswahlid) {
u++;
System.out.println(u);
while(u>1){
try {
System.out.println("warte in setAuswahlid");
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.auswahlid = auswahlid;
}
public Integer getAuswahlid() {
return auswahlid;
}
// von change.jsp
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;
}
// von hinzuanzeige.jsp
public void setNeutext(String neutext) {
this.neutext = neutext;
}
public void setNeuzahl(Integer neuzahl) {
if(neuzahl==null){
neuzahl=0;
}
this.neuzahl = neuzahl;
}
public void setUserID(Integer UserID) {
System.out.println("setUserID :"+UserID);
System.out.println("\n");
this.UserID = UserID;
}
public List<tbspiel_t> getTabelle() {
System.out.println("getTabelle\n");
return tabelle;
}
}
hibernate.cfg.xml:
Java:
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.username">system</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:XE</property>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="connection.password">adminadmin</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.useUnicode">true</property>
<property name="connection.characterEncoding">UTF-8</property>
<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="c3p0.acquire_increment">1</property>
<property name="c3p0.idle_test_period">27000</property>
<property name="c3p0.max_size">10</property>
<property name="c3p0.max_statements">0</property>
<property name="c3p0.min_size">1</property>
<property name="c3p0.timeout">100</property>
<property name="show_sql">true</property>
<mapping class="db.Vor_anwender_t" />
<mapping class="db.Vor_tbspiel_t" />
</session-factory>
</hibernate-configuration>
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
Zuletzt bearbeitet: