2011-11-07 10 views
6

Tengo una configuración básica donde la base de datos es leída por múltiples aplicaciones web, y periódicamente tengo una aplicación por lotes que hace mucha escritura. Durante la redacción, el rendimiento de las aplicaciones web se degrada considerablemente (sus lecturas de base de datos son muy lentas).Actualizaciones de baja prioridad en MySQL usando JDBC - cómo verificar si funcionan

The env. es MySQL db utilizando el motor MYISAM, la aplicación por lotes es una aplicación Java SE, que utiliza Spring-batch y SimpleJDBCTemplate para emitir comandos SQL a través de JDBC. Descubrí que MySQL tiene un parámetro que reduce la prioridad de las operaciones de escritura en el motor MYISAM: low_priority_updates. Para citar los documentos, entre otros, puede "ESTABLECER LOW_PRIORITY_UPDATES = 1 para cambiar la prioridad en un hilo". Opté por esto porque es más fácil desde el punto de vista de la configuración de mi aplicación. Lo que he hecho está configurado mi fuente de datos de tal manera que exectutes que "SET ..." para cada conexión se abre, de este 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> 

Ahora mi pregunta es, ¿cómo puedo comprobar realmente que un SQL emitido a través de este datasource realmente se ejecuta con baja prioridad? Si hago SHOW FULL PROCESSLIST en MySQL, mientras que los insertos están sucediendo que sólo dime lo que SQL que están ejecutando, nada acerca de la prioridad:

enter image description here

Si puedo comprobar los LOW_PRIORITY_UPDATES variables de servidor está en "OFF", pero eso es sólo la variable de servidor, no tiene nada que ver con el valor local del subproceso.

De nuevo, ¿hay alguna manera real de comprobar si por consulta/thread se tienen en cuenta los valores de low_priority_updates?

Respuesta

1

Al emitir SET LOW_PRIORITY_UPDATES = 1 comando, está afectando el valor de la variable para la sesión. Por lo tanto, es posible ver esto al verificar el valor de la variable en la sesión.

Conozco dos maneras de hacerlo:

1- variables muestran SESIÓN COMO '' low_priority_dapdates

esta muestra ON/OFF

2- select @@ session.low_priority_updates

esto da 0/1

Importante: las declaraciones/llamadas anteriores mostrarán y o los valores de las variables en la sesión donde se ejecutan. Por lo tanto, deberá ejecutarlos utilizando las conexiones para ver los valores. No sé de ninguna manera en MySQL donde pueda seleccionar valores para variables que pertenecen a otra sesión.

Si desea verlos como una lista, es posible que tenga que hacer un cambio creando una tabla y registrando esa información usted mismo. por ejemplo:

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

entonces necesita un comunicado que inserta el identificador de conexión y el valor en la tabla:

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()) 

se puede poner esta declaración en un procedimiento y asegúrese de que su llamado, o añadir en un disparador en una tabla que sabes que se actualiza/inserta.

después de eso, consultar la tabla my_low_priority_updates más tarde le mostrará los valores de la variable en cada conexión.

+0

Sí, funcionó muy bien. Puedo usar JDBC para verificar que una conexión tenga el low_priority_value correcto al emitir 'select connection_id(), @@ session.low_priority_updates desde dual'. Y, de hecho, funciona bien, el valor de la sesión de la variable cambia según la inicialización en la conexión init. ¡Gracias! –

Cuestiones relacionadas