Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Operazione onerosa su DB

    Ciao a tutti.

    Ho una tabella (tab1) che viene costantemente aggiornata e interrogata.
    Ogni volta che un utente "salva" le impostazioni succede questo:
    INSERT in tab1 di un nuovo record
    SELECT COUNT su tutta la tabella tab1 per contare quanti record ci sono in base ad un determinato valore di un campo.
    eventuale INSERT in una seconda tabella se la COUNT ha restituito un determinato valore.

    Sicuramente, considerando la mole di dati presenti nella tabella tab1 e la mole di utenti che vi accedono, il tutto è molto oneroso...
    Come si fa a far eseguire queste operazioni in "background"?
    Nel senso.. vorrei ad esempio la stessa cosa che succede in alcuni siti dove fai una Upload di una foto e questa viene caricata in background e non rallenta il sito.. (ovviamente non so farlo neanche per questo esempio fatto).

    Sapete aiutarmi o consigliarmi un'altra metodologia a me (pippa) ignota?
    grazie
    Giudica i tuoi successi dagli sforzi che hai dovuto compiere per superarli

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    703
    ciao, ci sono molti scenari a disposizione che puoi adottare..prima di tutto:

    .lato server che linguaggio usi(c# vb.net)?
    .la persistenza dei dati come la effettui(orm, SqlClient) ?
    .si tratta di una applicazione form o web?
    .Le operazioni che vuoi effettuare in background sono direttamente dipendenti dalle azioni effettuate sul salvataggio delle impostazioni?
    .Dici che l'operazione è "onerosa".. da cosa lo capisci? l'interfaccia si freeza?
    .Le tabelle in gioco hanno chiavi primarie ed indici?

    per un aiuto più concreto occorrono maggiori info sulla struttura della tabella e il tipo di dati inseriti.

  3. #3
    Ciao,

    ti rispondo in ordine alle tue domande:
    - vb.net
    - MySqlClient
    - web
    - no, o meglio: faccio una insert su tab1 e a seguito una count sulla stessa. per poi passare ad aggiornare un'altra tabella.
    - penso che lo sarà. adesso lavoro con pochi record, ma considerando che lo utilizzeranno (faccio un caso limite) utenti di una città intera, o più utenti di città diverse, potrebbe essere oneroso, no?
    - le tabelle hanno tutte una chiave primaria e alcune hanno chiavi esterne.


    grazie
    Giudica i tuoi successi dagli sforzi che hai dovuto compiere per superarli

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    703
    potresti separare le due operazioni:

    la prima insert è secca; se hai chiavi ed indici a posto è per forza veloce(usi qualche tipo di dato particolare in mysql - esempio campi filestream o text o image)?

    per la seconda operazione(insert su tabella2) devi chiederti ogni quanto deve essere aggiornata.. potresti spostare l'operazione in un manager a parte che gira ogni 5,10 min ad esempio e lo richiami tramite le operazioni schedulate di windows.

    Se invece è strettamente necessario che all'aggiornarnamento della tabella 1 corrisponda l'aggiornamento della tabella 2 in tempo reale possiamo capire quanto sia utilie fare un count.. per questo però dovresti chiarirmi la logiche con cui decidi se inserire un record in tabella 2 o meno.

  5. #5
    A me interesserebbe aggiornare le tabelle nello stesso momento.
    Cosa intendi con chiarirti le logiche di inserimento?
    Giudica i tuoi successi dagli sforzi che hai dovuto compiere per superarli

  6. #6
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    ci sono due approcci con cui affrontare questo tipo di scenario.
    - Se queste sono operazioni "di sistema" e non centrano nulla con la risposta da restituire al client ovvero non vuoi restituire al client un feedback sull'andamento dell'operazione, puoi lanciare l'operazione in un thread separato. In questo caso la richiesta http fluisce normalmente e senza rallentamenti fino al response all'utente mentre sul server in background continua a svolgersi l'operazione lunga.

    - Se invece questa operazione deve fornire un feedback all'utente sul suo andamento e terminazione (ad esempio laggiornamento di una table) allora il modo piu comune di operare è l'utilizzo di ajax lato client. In questo caso o utilizzi il toolkit di asp.net oppure puoi fare le cose a mano: il pulsante di salvataggio invece di sollevare il postback lo colleghi ad una chiamata ajax che mostra sulla pagina un messaggio di caricamento tipico delle operazioni asincrone (generalmente un loader animato), e carica i risultati in tabella al termine delle operazioni attraverso javascript.

    se vuoi qualche chiarimento specifico scrivi quale dei due è il tuo caso

  7. #7
    Grazie mille per le delucidazioni.

    In pratica, come precedentemente spiegato, al click di questo Button aggiorno le 2 tabelle.
    Quando l'utente esce da questa pagina e si sposta in una determinata pagina, vengono caricati i valori dell tabelle aggiornate precedentemente.

    Quindi a questo punto mi viene da dire che è la prima soluzione proposta. No?
    Potete consigliarmi altro o magari link da consultare?
    Giudica i tuoi successi dagli sforzi che hai dovuto compiere per superarli

  8. #8
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Sposta la logica delle operazioni lunge in una classe o funzione e dalla pagina la richiami in questo modo:
    codice:
    ThreadPool.QueueUserWorkItem(callback => OperazioniCostose(parametro1, parametro2...));
    la cosa come vedi è molto semplice ma vale la pena approfondirla perche non è il massimo in termini di scalabilità, qui ti riporto due link che ho trovato googlando un po':

    http://msdn.microsoft.com/en-us/magazine/cc163463.aspx

    http://blogs.msdn.com/b/tmarq/archiv...lications.aspx

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.