2011-11-07 16 views
6

Mam podstawową konfigurację, w której baza danych jest odczytywana przez wiele aplikacji internetowych i okresowo mam aplikację wsadową, która ma dużo pisania. W trakcie pisania wydajność aplikacji internetowych ulega znacznemu pogorszeniu (ich odczyty w bazie danych są bardzo powolne).Aktualizacje o niskim priorytecie na MySQL przy użyciu JDBC - jak sprawdzić, czy działają

The env. jest bazą danych MySQL db z wykorzystaniem silnika MYISAM, aplikacja wsadowa to aplikacja Java SE, wykorzystująca wiosenne zadania wsadowe i SimpleJDBCTemplate do wydawania poleceń SQL za pośrednictwem JDBC. Zauważyłem, że MySQL ma parametr, który obniża priorytet operacji zapisu na silniku MYISAM: low_priority_updates. Aby zacytować dokumenty, można między innymi ustawić "SET LOW_PRIORITY_UPDATES = 1, aby zmienić priorytet w jednym wątku". Zdecydowałem się na to, ponieważ jest to najłatwiejsze z punktu widzenia konfiguracji mojej aplikacji. Co robiłem jest skonfigurowany tak, że mój DataSource to exectutes że „SET ...” dla każdego połączenia otwiera, tak jak poniżej:

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

Teraz moje pytanie brzmi, jak mogę sprawdzić, że faktycznie wydane SQL za pośrednictwem tego źródła danych rzeczywiście działa z niskim priorytetem? Jeśli robię SHOW FULL PROCESSLIST w MySQL podczas gdy wkładki są dzieje się to po prostu powiedz mi, co SQL oni wykonywać, nic o priorytecie:

enter image description here

Gdybym sprawdzić zmienne serwerowe low_priority_updates jest „OFF”, ale to tylko zmienna serwerowa, nie ma nic o wartości lokalnej wątku.

Czy istnieje również aktualny sposób sprawdzenia, czy wartości zapytania/wątku uwzględniają wartości low_priority_updates?

Odpowiedz

1

Wystawiając polecenie SET LOW_PRIORITY_UPDATES = 1, wpływasz na wartość zmiennej dla sesji. Dlatego można to zobaczyć, sprawdzając wartość zmiennej w sesji.

Znam dwa sposoby, aby to zrobić:

1- SHOW SESJA zmienne jak

to pokazuje ON 'low_priority_dapdates'/OFF

2- select @@ session.low_priority_updates

to daje 0/1

Ważne: powyższe wyciągi/połączenia pokażą y ou wartości zmiennych w sesji, w której działają. W związku z tym konieczne będzie uruchomienie ich za pomocą samych połączeń w celu wyświetlenia wartości. Nie znam sposobu w MySQL, w którym można wybrać wartości zmiennych należących do innej sesji.

Jeśli chcesz zobaczyć je jako listę, możesz potrzebować obejść, tworząc tabelę i samodzielnie rejestrując te informacje. na przykład:

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

musisz oświadczenie, że wstawia identyfikator połączenia i wartość do tabeli:

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

można umieścić to oświadczenie w procedurze i upewnić się, jego nazwie, lub dodać w wyzwalaczu na stole, o którym wiesz, że zostanie zaktualizowany/wstawiony.

po tym, zapytanie do tabeli my_low_priority_updates później wyświetli wartości zmiennej w każdym połączeniu.

+0

Tak, udało się. Mogę użyć JDBC, aby sprawdzić, czy połączenie ma poprawną wartość low_priority, wydając "select connection_id(), @@ session.low_priority_updates from dual". I rzeczywiście działa dobrze, wartość sesji zmiennej zmienia się w zależności od tego, jak ją zainicjuję przy połączeniu init. Dzięki! –

Powiązane problemy