[Linuxtrent] Implementazione di un recordset persistente lato server per applicazioni AJAX

  • From: Guido <gdo@xxxxxxxxx>
  • To: linuxtrent <linuxtrent@xxxxxxxxxxxxx>
  • Date: Sat, 12 Aug 2006 12:05:03 +0200

Sono impegnato in questi mesi allo sviluppo di un framework, usato anche in un paio di progetti G.P.L.(*), per gestire con tecnologia AJAX la visualizzazione, modifica e cancellazione di record da database, per ora PostgreSQL.

Nel caso di debba eseguire browsing di recordset con molti record (le prove le conduco con un numero di record da 100.000 a 1.000.000) non è materialmente possibile tenere persistente il recordset, sia perchè occuperebbe troppa memoria, sia perchè il tutto gira in Apache1.3 o Apache2.0 con evidente difficoltà nel mantenere l'oggetto in chiamate successive del browser con più processi o thread che possono raccogliere le richieste.

Ho quindi implementato un meccanismo misto, che dalle prove fatte mi sembra il giusto compromesso tra velocità, occupazione di memoria ed impatto sull'utente utilizzatore (... viviamo in un mondo di compromessi).

Vediamo ora il metodo in dettaglio:

1) Il calcolo del numero di record disponibili viene calcolato con "select count(*) from
..... where ....." solo quando dal browser proviene una richiesta di selezionare un nuovo recordset


2) Recupero delle chiavi dalla cache (vedi avanti) oppure Individuazione delle chiavi dei record da recuperare, indicando il range da cui prelevare dall'intero insieme: "select <KEY> from ..... where ...... offset ..... limit ......"

3) Salvataggio delle chiavi e rispettive posizioni nel recordset in una tabella di cache.
Il numero di chiavi da recuperare è più grande del numero di record che l'utente visualizza, in modo che successive richieste dal browser vengano soddisfatte senza dover ricalcolare le query ai punti 1) e 2)


4) Recupero dei dati completi con la query "select <KEY>, ....... from ...... where id= <key1> or id = <key2> or ........ "


PRO:
L'acceso a recordset molto grandi rimane veloce; in quanto il conteggio non viene ripetuto e per i record già recuperati non è necessario lanciare la query di recupero delle chiavi.
I record modificati o inseriti rimangono nella stessa posizione fino a quando non si esegue una diversa query.
Se il servizio Apache subisce un reset il browser non perde il recordset.


CONTRO:
Il recupero di range di chiavi non ancora presenti in cache varia se si fanno modifiche successive.
Ad esempio nel caso che un record modificato cambi di posizione e venga ripescato in una posizione diversa che ancora non era stata letta prima, si avrebbe in cache lo stesso record, oltre ad influenzare l'ordine di tutti gli altri che lo seguono.



Per gestire il problema del conflitto, quando viene rilevato, la cache viene azzerata e l'utente viene avvisato che la query è stata ricalcolata a causa delle modifiche fatte e che quindi la posizione dei record modificati ed inseriti potrebbe essere diverso...


Il metodo ovviamente non è perfetto in quanto i record pescati in successive query potrebbero essere incompleti anche senza pescare record gia pescati (e quindi con disallineamento rilevabile).

Ma nell'uso normale che un utente fà, dalle prove che abbiamo fatto, sembra essere un effetto tracurabile, che capita raramente e comunque non pregiudica la consistenza dei dati.

Con un banale server Athlon 64 e dischi SATA, con 150.000 record e dimensione del blocco di precaricamento di 100 record abbiamo 50msec di tempo in più quando il record richiesto non è in cache (una volta su cento).

Qualche idea migliore?

cordiali saluti
Guido brugnara


(*) OpenClassroom 2.0 e MasonSQL 1.0; il cui rilascio in Internet è previsto in autunno




--
Per iscriversi  (o disiscriversi), basta spedire un  messaggio con OGGETTO
"subscribe" (o "unsubscribe") a mailto:linuxtrent-request@xxxxxxxxxxxxx


Other related posts: