Newsgroup: it.comp.software.database
Titolo: JAVA-JDBC: procedure database, statemant update...

con java sto cercando di creare un'applicazione che tramite i driver jdbc
si colleghi a un database su client e/o su server ma che possa non solo
fare una semplice query, bensi rimanere collegato al database per ricevere
automaticamente i dati ogni volta che lo stesso viene aggiornato da altri
programmi....
è possibile fare una cosa simile? ....creare un ActionListener settato a
1ms che mi faccia continuamente query per vedere se il database è stato
aggiornato non mi sembra moolto geniale come idea!
spero di essere stato il + chiaro possibile ....purtroppo girando per siti
ho trovato moltissima roba su statement, connection, ecc ma niente di
specifico di quello che interessa a me....
i DB che sarei intenzionato a utilizzare sono Oracle e/o Informix ...con
Access credo che non si possa fare una cosa simile.
Qualcuno mi ha consigliato di programmare delle "procedure" nel DBMS
stesso in modo tale che quando si aggiornava la tabella interessata questa
poi mandava il dato a un programma in ascolto.... io invece ero +
interessato a a sapere se i driver jdbc, magari quelli specifici della
Oracle e/o Informix, permettevano di creare un statement che rimanesse "in
ascolto" su una o + tabella per beccare eventuali update delle table
interessate e che poi salvasse i dati in un vector....
spero in qualche suggerimento :)
ciao e grazie!
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 è possibile fare una cosa simile?
Come fa' il database a sapere che deve "informarti"?
L'unica che mi viene in mente e' scrivere un server che si collega al
database ed il client si collega a questo server e non direttamente al
database (three-tier). Cosi' il server intercetta le modifiche e puo'
notificare gli altri client.
Davide
-- 
| Every time I think that perhaps we are an advanced race, I turn around
| and read ramblings on Slashdot, and realize I was wrong.      -- From 
| a Slashdot.org post 
| 
| 
| 

 Davide
..si ma anche facendo cosě come fa il programmino "server" a sapere che
il database č stato aggiornato ? ....devo fare un ActionListener che mi
faccia continuamente query ?


 il database č stato aggiornato ?
Dato che e' lui che riceve le richieste di modifica e le esegue...
Davide
-- 
| Windows has detected that a gnat has farted near your computer. Press 
| any key to reboot. --Simon Oke 
| 

 Davide
...e per "intercettare" le modifche nel db come fare?


 ...e per "intercettare" le modifche nel db come fare?
Esistono i trigger per questo ... ma se non vuoi usarli........

 programmi....
devi usare un'architettura a tre livelli; il livello intermedio esegue
fisicamente le query, mentre le applicazioni si collegano a questo per
aggiornare i dati; quando il livello intermedio riceve una richiesta
di modifica, la esegue e provvede a notificare i clients collegati. ci
sono anche meccanismi di lock molto pesanti a livello di tier
intermedio da implementare, in maniera intelligente per evitare di
bloccare sempre tutti gli utenti
trovi un magnifico su esempio su "jdbc and java", non mi ricordo il
titolo preciso perche' non l'ho sottomano, che e' un tutorial su una
applicazione i questo tipo, credo che i sorgenti del libro siano
liberamente scaricabili dal sito (che naturalmente non mi ricordo :) )

 programmi....
Si puo' fare usando un trigger che becca le variazioni, e le inserisce
in una tabella di delta. Da qui, puoi pollare sulla tabella dei delta
per vedere le variazioni se non ti serve essere avvertito in real time
(quasi sempre basta e avanza).
Se non basta, puoi scrivere dal trigger le variazioni in una coda AQ
(Advanced Queueing) su cui ti puoi mettere in ascolto; rimani bloccato
finche' il trigger non scrive nella coda, e quando la transazione
committa, automaticamente la coda ti risveglia e ti serve quello che
il trigger ha scritto su un piatto d'argento. Soluzione robustissima e
transazionale.
Per il caso piu' semplice:
SQL> create table t (x int);
Table created.
SQL> create table t_delta as select * from t where 1=0;
Table created.
SQL> create trigger t_trig
  2  after insert or update or delete on t
  3  for each row
  4  begin
  5  insert into t_delta (x) values (:new.x);
  6  end;
  7  /
Trigger created.
SQL> insert into t values (1);
1 row created.
SQL> update t set x = 2;
1 row updated.
SQL> delete from t ;
1 row deleted.
SQL> set null *null*
SQL> select * from t_delta;
         X
----------
         1
         2
*null*
Ovviamente sarebbe meglio numerare la sequenza dei delta (con una
sequence), ricordarsi sempre la PK delle righe cancellate ... etc.
Per la soluzione AQ, ti rimando a 
otn.oracle.com
 (richiede
registrazione ma a costo nullo) per un sacco di esempi di accesso da
Java.
Ciao
Al