Низкоприоритетные обновления на MySQL с использованием JDBC - как проверить, работают ли они - PullRequest
6 голосов
/ 07 ноября 2011

У меня есть базовая настройка, при которой база данных читается несколькими веб-приложениями, и периодически у меня появляется пакетное приложение, которое много пишет.Во время написания, производительность веб-приложений сильно ухудшается (их чтение из базы данных происходит очень медленно).

Окр.это MySQL db с использованием механизма MYISAM, пакетное приложение является приложением Java SE, использующим spring-batch и SimpleJDBCTemplate для выдачи команд SQL через JDBC.Я обнаружил, что MySQL имеет параметр, который понижает приоритет операций записи на движке MYISAM: low_priority_updates .Чтобы процитировать документы, помимо прочего, вы можете "SET LOW_PRIORITY_UPDATES = 1, чтобы изменить приоритет в одном потоке".Я выбрал это, потому что это проще всего с точки зрения конфигурации моего приложения.То, что я сделал, настроил мой DataSource таким образом, чтобы он выдавал «SET ...» для каждого открываемого соединения, например, так:

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

Теперь мой вопрос: как мне на самом деле проверить, чтоSQL, выданный через этот источник данных, действительно работает с низким приоритетом?Если я выполняю SHOW FULL PROCESSLIST в MySQL во время вставок, просто скажите мне, какой SQL они выполняют, ничего о приоритете:

enter image description here

Если я проверю переменные сервераlow_priority_updates имеет значение «OFF», но это просто переменная сервера, в ней ничего не говорится о локальном значении потока.

Итак, существует ли какой-либо реальный способ проверить, учитываются ли значения для каждого запроса / потока low_priority_updates?

1 Ответ

1 голос
/ 07 ноября 2011

С помощью команды SET LOW_PRIORITY_UPDATES = 1 вы влияете на значение переменной для сеанса.Поэтому это можно увидеть, проверив значение переменной в сеансе.

Я знаю два способа сделать это:

1 - ПОКАЗАТЬ ПЕРЕМЕННЫЕ СЕССИИ, КАК «low_priority_dapdates»

это показывает ON / OFF

2- выберите @@ session.low_priority_updates

это дает 0/1

Важно: вышеЗаявления / вызовы покажут вам значения переменных в сеансе, где они выполняются.Поэтому вам нужно будет запустить их, используя сами соединения, чтобы увидеть значения.Я не знаю способа в MySQL, где вы можете выбрать значения для переменных, которые принадлежат другой сессии.

Если вы хотите видеть их в виде списка, вам, возможно, придется обойтись путем создания таблицы и записи этой информации самостоятельно.например:

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

тогда вам нужен оператор, который вставляет идентификатор соединения и значение в таблицу:

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

вы можете поместить этот оператор в процедуру и убедиться, что еговызывается или добавляется в триггер для таблицы, в которую вы знаете, что она обновляется / вставляется.

после этого, запрос к таблице my_low_priority_updates позже покажет вам значения переменной в каждом соединении.

...