Newsgroup: it.comp.java
Titolo: gestione di una web-application

Salve a tutti
ho una web-application che gestisce gli ordini dei clienti per una
azienda
Prima, avevo creato, una tabella per ogni cliente con nome
[idcliente]ordini
(lo so che non e' una cosa molto bella da farsi)
e tutto mi andava bene. Il problema e' che con il passare degli anni, i
clienti stanno crescendo in maniera esponenziale 20 nel 2004 100 nel
2005 600 all fine del 2006 e chissa' a quanti poi in seguito.
Ho deciso cosi' di creare una unica tabella per gli ordini di tutti i
clienti.
Ora il problema:
ho l'impressione che si accavallino i dati inviati dai vari agenti
anche se le sessioni sono separate
per tutti gli oggetti, in pratica l'applicazione fa dei calcoli ma ne
memorizza in tabella altri.
Premesso che non e' un problema dei dati in sessione, potrebbe essere
un problema
nell'inserimento in tabella? C'e' con MySQL la possibilita' di bloccare
la tabella dove aggiono i dati
fino a quando non e' finita l'operazione stessa?
Lo so e' un po' contorto ma spero abbiate capito il mio problema e mi
possiate aiutare
a risolverlo
Grazie a tutti
avana01


Ciao.
Premettendo che ci sono (ma io non le so applicare) diverse soluzioni
al problema ti chiedo se hai mai usato le transazioni in java? Io le ho
usate con successo ma si trattava di inserimenti correlati su più
tabelle anche se credo che funzionino anche per la singola tabella.
A livello di codice:
Connection con;
con =DriverManager.getConnection(ARS_URL,"whitney", "secret");
'Probabilmente userai un altro metodo...
con.setAutoCommit(false); ' qui dici di impostare una transazione
Statement selImp = ARS.createStatement ();
String stmt1 = "UPDATE Impiegati SET Stipendio = 1000 WHERE Cognome =
'Rossi'";  ' query 1
String stmt2 = "DELETE FROM Impiegati WHERE Cognome = 'Verdi'"; '
query 2
String stmtn = "INSERT INTO Impiegati VALUES(xxx, yyy, zzz,); ' query n
selImp.executeUpdate (stmt1);
selImp.executeUpdate (stmt2);
selImp.executeUpdate (stmt3);
con.commit(); ' viene eseguita l'intera transazione ovvero tutti e tre
gli statement. Se un altro utente deve agire sulla tabella è compito
del DBMS assicurare il perfetto isolamento delle operazioni. La
transazione è eseguita in toto oppure per nulla e quindi basta
catturare una qualsiasi SQLException eventualmente sollevata ed
eseguire il rollback della transazione. L'importante è che avendo
informato il DBMS che sta iniziando una transazione vengono eseguiti
dei lock sui record ed a nessuno è permesso scriverci fino al
completamento della transazione.
La documentazione dell'API java.sql aiuta molto. Anche ricerche su
"concorrenza database" forniscono molti spunti.
Visto che hai escluso errori nei dati di sessione non faccio ipotesi
tra lo scollamento nell'esecuzione dei calcoli e l'inserimento nel DB.
Ciao

Si, sono le operazioni che effettuo.
Quindi per essere sicuro che un inserimento su una tabella venga fatto
per una sessione alla volta, devo controllare che il DBMS
faccia questa operazioni una alla volta.
Grazie del consiglio


attenzione la tabella myisam (tabella di tipo standard con mysql) non 
funziona co i lock scegli un'altro indicizzazione peer la tabella
ciao gabry
guarda
avana ha scritto:


Ho convertito tutte le tabelle in InnoDB e sembra vada tutto bene
Approfitto della gentilezza.
Sapresti per caso come si gestiscono gli errori sql
direttamente su procedure e trigger MySQL?
Grazie
avana01
gabryfan ha scritto:
