2014-07-04 26 views
6

Ho un progetto Spring MVC + Mysql (JDBC 4) + c3p0 0.9.2.c3p0 maxIdleTime è uguale a wait_timeout di mysql?

In c3p0 maxIdleTime il valore è 240 (cioè 4 minuti) e wait_timeout in my.ini di Mysql a 30 secondi.

Secondo c3p0

MaxIdleTime: (Default: 0) secondi una connessione può rimanere in pool, ma non utilizzata prima di essere scartato. Zero significa che le connessioni inattive non scadono mai.

Secondo Mysql

wait_timeout: Il numero di secondi il server attende per l'attività su una connessione non interattiva prima di chiuderlo.

Ora sto avendo alcuni douts su questo: (alcune risposte sono noti per me, solo wated per essere sicuro ho ragione o no)

  1. collegamento inutilizzato significa che la connessione che sono in sleep Stato secondo mysql (?)
  2. Che cosa sono le connessioni interattive e non interattive?
  3. Le connessioni inutilizzate e le coortie non interattive sono uguali? perché il mio DBA imposta wait_timeout a 30 secondi (raggiunge questo valore osservando il server DB in modo che una quantità molto inferiore di connessioni sia in modalità sleep), ciò significa che una connessione può essere in modalità sleep per 30 secondi dopo che sarà chiusa ma a l'altra mano di c3p0 maxIdleTime è impostata su 240 secondi, quindi quale è l'impostazione di questo maxIdleTime ruolo di riproduzione in questo caso.
  4. Che cos'è interactive_timeout?
+0

Le connessioni in modalità sonno sono molto probabilmente il connessioni inattive che si trovano nella vostra piscina. Non dovrebbero essere chiusi troppo velocemente perché avere la piscina per ricrearli alla prossima richiesta è costoso. Perché il tuo DBA suggerisce che il wait_timeout sia impostato su 30 secondi? – flup

+0

@flup, perché durante il test del carico ho osservato che 'mostra la lista completa dei processi 'mostrandomi il' numero di connessioni in DB = maxPoolSize' e sto ottenendo continuamente l'eccezione 'Connessioni non potendo essere acquisita dal database sottostante!'. Ho postato questa domanda Per saperne di più e uno http://stackoverflow.com/questions/24451317/why-sleep-mode-coonections-are-not-reused-by-c3p0 – Amogh

risposta

21

Prima capiamo le proprietà di mysql.

  • interactive_timeout: tempo interattivo per sessioni di shell mysql in secondi come mysqldump o mysql strumenti di comando. le connessioni sono in stato di sospensione. Il più delle volte questo è impostato su un valore più alto perché non vuoi che venga disconnessa mentre stai facendo qualcosa su mysql cli.
  • wait_timeout : la quantità di secondi durante l'inattività che MySQL attenderà prima di chiuderà una connessione su una connessione non interattiva in secondi. esempio: connesso da java. le connessioni sono in stato di sospensione.

Ora cerchiamo di capire le proprietà C3PO ed è relazione con i puntelli DB (Sono copia solo andando dalla tua domanda)

  • maxIdleTime:. (Default: 0) secondi una connessione può rimanere in pool, ma inutilizzato prima di essere scartato. Zero significa che le connessioni inattive non scadono mai .

Questo si riferisce a quanto tempo un oggetto di connessione può essere utilizzabile e sarà disponibile in piscina. Una volta scaduto il timeout, c3po lo distruggerà o lo riciclerà.

Ora il problema si presenta quando si dispone di maxIdleTime superiore a wait_timeout. diciamo se il mxIdleTime : 50 sec e wait_timeout : 40 s quindi c'è un chanse che si otterrà Connection time out exception: Broken Pipe se si tenta di fare qualsiasi operazione negli ultimi 10 secondi. Quindi maxIdelTime dovrebbe sempre essere inferiore a wait_timeout.

Invece di maxIdleTime è possibile le seguenti proprietà.

  • idleConnectionTestPeriod imposta un limite a quanto tempo una connessione sarà rimanere inattivo prima testarlo. Senza preferredTestQuery, il valore predefinito è DatabaseMetaData.getTables() - che è indipendente dal database e sebbene una chiamata relativamente costosa, è probabilmente valida per un database relativamente piccolo . Se siete paranoici su prestazioni utilizzare una query specifica al database (i.e. preferredTestQuery="SELECT 1")
  • maxIdleTimeExcessConnections riporterà il connectionCount di nuovo verso il basso per minPoolSize dopo un picco di attività.

Si prega di notare che qualsiasi della proprietà piscina (ad es. maxIdleTime) colpisce solo per collegamento che sono in piscina cioè se Hibernate ha acquisito una connessione e la mantiene al minimo per oltre MaxIdleTime e poi cerca di fare qualsiasi operazione Otterrai "Broken Pipe"

È buona cosa avere wait_timeout inferiore su mysql ma non è sempre giusto quando hai un'applicazione già compilata. Prima di ridurlo devi assicurarti che nella tua applicazione non stai mantenendo la connessione aperta per più di wait_time uscita.

Inoltre, è necessario considerare che l'acquisizione di una connessione è un'attività costosa e se il tempo di attesa è troppo basso, supera l'intero scopo di disporre di un pool di connessioni, poiché tenterà spesso di acquisire connessioni.

Ciò è particolarmente importante quando non si esegue la gestione della connessione manualmente, ad esempio quando si utilizza l'API transnazionale Spring. Spring avvia la transazione quando si immette un metodo annotato @Transaction in modo che acquisisca una connessione dal pool. Se stai facendo una chiamata al servizio web o stai leggendo un file che richiederà più tempo di wait_time, otterrai un'eccezione.

Ho affrontato questo problema una volta.

In uno dei miei progetti ho avuto un cron che avrebbe effettuato l'elaborazione degli ordini per i clienti. Per renderlo più veloce ho usato l'elaborazione in batch. Ora, una volta recuperato un gruppo di clienti, eseguo alcune elaborazioni (senza chiamate DB). Quando provo a salvare tutti gli ordini che ho usato per ottenere l'eccezione del tubo rotto. Il problema era che il mio wait_timeout era di 1 minuto e che l'elaborazione degli ordini richiedeva più tempo. Quindi abbiamo dovuto aumentarlo a 2 minuti. Avrei potuto ridurre le dimensioni del batch, ma questo rallentava l'elaborazione complessiva.

+0

Grazie per la tua spiegazione dettagliata, hai cancellato i miei punti relativi a interactive_timeout, wait_timeout e maxIdleTime, ma non ho ottenuto i tuoi ultimi due punti puntati, ma non mi preoccupo di averlo capito alla fine. – Amogh

+0

Va bene per diminuire 'wait_timeout' fino a 30/15 secondi in modo che nessuna connessione sia in modalità sleep? – Amogh

+0

Ho aggiornato la mia risposta. In breve, puoi ridurre il tempo di attesa se sei sicuro che la tua applicazione non mantiene la connessione per più di 30 secondi. – bitkot

0
unused connection means the connection which are in sleep state according to mysql(?) 

Secondo mysql, questo significa semplicemente che una connessione è stata stabilita con mysql/db, ma non v'è stata alcuna attività qui per la quantità passato di tempo a causa della configurazione/impostazioni di mysql (che può essere modificato), la connessione è stata distrutta.

What is interactive and noninteractive connections? 

Le connessioni interattive sono quando l'hardware di input (tastiera) interagisce utilizzando la riga di comando con mysql. In breve, dove scrivi le domande

Le query non interattive o piuttosto wait_timeout sono quelle per le quali il tuo codice stabilisce la connessione con mysql.

Is unused connections and noninteractive coonections are same? because my DBA set wait_timeout to 30 seconds (he come to this value by observing DB server so that very less amount of connections be in sleep mode) this means an connection can be in sleep mode for 30 seconds after that it will be closed but at the otherhand c3p0's maxIdleTime is set to 240 seconds so whats this maxIdleTime setting playing role in this case. 

MaxIdleTime viene fatto il tuo codice in Configurazione hibernateJpa in cui si chiede il codice stesso per chiudere una connessione di sospensione (per esempio) dopo la connessione è inutilizzato. Hai la proprietà di questo come programmatore.

Wait_timeout d'altra parte proviene dal lato mysql. Quindi è compito dell'amministratore del DB impostarlo e modificarlo.

What is interactive_timeout? 

Anche in questo caso, timeout interattivo è quando si sta scrivendo le query dopo la connessione a MySQL da tastiera su riga di comando e che il tempo conf in MySQL si alza.

Se vuoi sapere di più su come modificare questi valori, passare attraverso questo link:. http://www.serveridol.com/2012/04/13/mysql-interactive_timeout-vs-wait_timeout/

La speranza ora è chiaro a voi :)

+0

Grazie:) ... – Amogh