2010-07-29 17 views
5

Cercare di capire come gestire/utilizzare connessioni DB longeve. Ho poca esperienza di questo tipo, dato che ho usato DB solo con piccoli sistemi (fino a circa 150 utenti simultanei, ognuno aveva il proprio DB user/pass, quindi c'erano fino a 150 connessioni DB long-life in qualsiasi momento) o pagine Web (ogni richiesta di pagina ha una propria connessione DB che dura meno di un secondo, quindi il numero di connessioni simultanee di DB non è enorme).connessione DB condivisa vs connessioni DB private

Questa volta ci sarà un server Java e un client Flash. Java si connette a PostgreSQL. Si prevede che le connessioni siano di lunga durata, ovvero dovrebbero avviarsi quando il client Flash si connette al server Java e terminare quando si disconnette il client Flash. Sarebbe meglio condividere una singola connessione tra tutti gli utenti (client) o stabilire una connessione privata per ogni cliente? O qualche altra soluzione sarebbe meglio?

*) Singolo/connessione condivisa:

  • (+) pro
    • solo una connessione DB per tutto il sistema
  • (-) Contro:
    • transazioni non può essere utilizzato (ad esempio, "user1.startTransaction(); user1.updateBooks(); user2.updateBooks(); user1.rollback();" to una singola connessione condivisa sarebbe far ritirare le modifiche che sono state svolte da utente2)
    • lunghe query di un utente potrebbe influenzare altri utenti (non sono sicuro di questo, però)

*) Le connessioni private:

  • (+) pro
    • Nessun problema con le transazioni :)
  • (-) Contro:
      potrebbe essere richiesto
    • enorme numero di connessioni simultanee, ad esempio, se ci sono 10000 gli utenti on-line, sono necessari 10000 connessioni DB, che sembra essere troppo elevato numero :) non lo faccio Tuttavia, sappiamo qualcosa sul numero previsto di utenti, poiché siamo ancora in fase di ricerca e pianificazione.

Una soluzione potrebbe essere quella di introdurre timeout, vale a dire, se la connessione DB non viene utilizzato per 15/60/900 (?) Secondi, esso si disconnette. Quando l'utente ha di nuovo bisogno di un DB, viene ricollegato. Questa sembra essere una buona soluzione per me, ma mi piacerebbe sapere quali potrebbero essere i limiti ragionevoli per questo, ad esempio, quale potrebbe essere il numero massimo di connessioni DB contemporanee, quale timeout dovrebbe essere usato ecc.

Altro la soluzione sarebbe raggruppare le query in due "tipi", un tipo che può tranquillamente utilizzare una singola connessione condivisa di lunga durata (ad esempio, "aggiorna l'utente set last_visit = now() dove id =: user_id"), e un altro tipo che richiede un connessione privata di breve durata (ad esempio, qualcosa che può potenzialmente svolgere un lavoro pesante o utilizzare le transazioni). Questa soluzione non sembra essere interessante per me, ma se fosse così che dovrei fare, potrei provare a farlo ...

Quindi ...Cosa fanno gli altri sviluppatori in questi casi? Ci sono altre soluzioni ragionevoli?

risposta

8

Non uso connessioni a lunga durata. Uso un pool di connessioni per gestire le connessioni e le mantengo solo per il tempo necessario per eseguire un'operazione: ottenere la connessione, eseguire la mia operazione SQL, restituire la connessione al pool. È molto più scalabile e non presenta problemi di transazione.

Lascia che il contenitore gestisca il pool per te, ecco a cosa serve.

+0

Mi picchia. Fondamentalmente questo è il modo migliore per lavorare. – Wes

+0

Sembra buono. Vediamo cosa diranno gli altri. A proposito, quelle connessioni in piscina rimangono collegate, vero? – binaryLV

+0

Il pool di connessioni gestisce tutto. Puoi configurarlo per verificare le connessioni stantie prima che le distribuisca. Il costo dell'apertura delle connessioni è ammortizzato su tutte le richieste. Hai la garanzia che quando uno è estratto è pronto per l'uso. – duffymo

2

Utilizzando una singola connessione, si ottengono anche prestazioni molto basse in quanto il server di database assegna solo una connessione per l'utente.

È assolutamente necessario un pool di connessioni. Se l'app viene eseguita all'interno di un server applicazioni, utilizzare il pool contenitore. Oppure puoi usare una libreria di pool di connessioni come c3p0.

Problemi correlati