2011-11-07 9 views
6

Ho una configurazione di base in cui il database viene letto da più applicazioni Web e periodicamente ho un'applicazione batch che esegue molte operazioni di scrittura. Durante la scrittura, la performa- zione delle web-app degrada pesantemente (le letture del loro database sono molto lente).Aggiornamenti a bassa priorità su MySQL utilizzando JDBC - come verificare se funzionano

The env. MySQL db utilizza il motore MYISAM, l'applicazione batch è un'app Java SE, utilizzando spring-batch e SimpleJDBCTemplate per l'emissione di comandi SQL tramite JDBC. Ho scoperto che MySQL ha un parametro che riduce la priorità delle operazioni di scrittura sul motore MYISAM: low_priority_updates. Per citare i documenti, tra gli altri, puoi "SET LOW_PRIORITY_UPDATES = 1 per cambiare la priorità in un thread". Ho optato per questo perché è più semplice dal punto di vista della mia applicazione. Quello che ho fatto è stato configurato il mio DataSource in modo tale che exectutes che "SET ..." per ogni connessione si apre, in questo modo:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <!-- other props omitted --> 
     <property name="connectionInitSqls"> 
      <list> 
       <value>SET low_priority_updates="ON"</value> 
      </list> 
     </property> 
    </bean> 

Ora la mia domanda è: come posso effettivamente controllare che uno SQL emesso tramite questa origine dati viene effettivamente eseguita con bassa priorità? Se faccio SHOW FULL PROCESSLIST in MySQL mentre gli inserti sono accadendo solo dirmi cosa SQL che stanno eseguendo, nulla circa la priorità:

enter image description here

Se controllo le variabili del server low_priority_updates è "off", ma che è solo la variabile server, non sa nulla del valore locale del thread.

Quindi, c'è ancora un modo effettivo per verificare se i valori di query/thread low_priority_updates sono presi in considerazione?

risposta

1

Con l'emissione del comando SET LOW_PRIORITY_UPDATES = 1, si influisce sul valore della variabile per la sessione. Pertanto è possibile vederlo controllando il valore della variabile nella sessione.

So di due modi per farlo:

1- VARIABILI MOSTRA SESSIONE LIKE 'low_priority_dapdates'

questa mostra ON/OFF

2- selezionare @@ session.low_priority_updates

dà 0/1

Importante: le dichiarazioni/chiamate sopra indicate mostreranno i valori delle variabili nella sessione in cui vengono eseguiti. Pertanto, sarà necessario eseguirli utilizzando le connessioni stesse per vedere i valori. Non conosco un modo in MySQL in cui è possibile selezionare i valori per le variabili che appartengono a un'altra sessione.

Se desideri vederli come un elenco, potresti dover risolvere il problema creando una tabella e registrando le informazioni personalmente. per esempio:

CREATE TABLE `mydb`.`my_low_priority_updates` (
    `connection_id` INT , 
    `low_priority_updates_value` INT NOT NULL 
) 
ENGINE = MyISAM; 

allora avete bisogno di una dichiarazione che inserisce l'id di collegamento e il valore nella tabella:

insert into my_low_priority_updates(connection_id,low_priority_updates_value) 
select connection_id(),@@session.low_priority_updates 
from dual 
where not exists (select 1 from my_low_priority_updates where connection_id=connection_id()) 

si può mettere questa dichiarazione in una procedura e assicurarsi che la sua chiamata, o aggiungere in un trigger su un tavolo che sai viene aggiornato/inserito in.

in seguito, l'interrogazione successiva della tabella my_low_priority_updates mostrerà i valori della variabile in ciascuna connessione.

+0

Sì, ha funzionato alla grande. Posso usare JDBC per verificare che una connessione abbia il corretto valore low_priority_value emettendo 'select connection_id(), @@ session.low_priority_updates da dual'. E infatti funziona bene, il valore di sessione della variabile cambia in base a come lo inizializzo alla connessione init. Grazie! –

Problemi correlati