2011-11-07 6 views
6

データベースを複数のWebアプリケーションで読み込み、定期的に多くの書き込みを行うバッチアプリケーションがある基本的なセットアップがあります。執筆中、ウェブアプリケーションの性能は大きく低下する(データベースの読み込みは非常に遅い)。JDBCを使用したMySQLの低優先度アップデート - 動作確認方法

env。 MYISAMエンジンを使用するMySQLデータベースであり、バッチアプリケーションはJava SEアプリケーションで、SpringバッチとSimpleJDBCTemplateを使用してJDBC経由でSQLコマンドを発行します。 MySQLには、MYISAMエンジンの書き込み操作の優先順位を下げるパラメータがあることがわかりました:low_priority_updatesドキュメントを引用するには、他にも "SET LOW_PRIORITY_UPDATES = 1を指定して1つのスレッドの優先度を変更する"ことができます。これは私のアプリケーションの設定の観点から最も簡単なので選択しました。

<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を発行したことを確認しないか、である:私がやったことはそのようにそれは、「SET ...」という、それが開いた各接続のためにexectutesというのが私のDataSourceがように構成されていますこのデータソースを介して実際には低優先度で実行されますか?インサートは、それはちょうど彼らが実行しているものSQLを教えて起こっている間、私はMySQLでSHOW FULL PROCESSLISTを行う場合は、優先順位については何も:私は、サーバー変数のLOW_PRIORITY_UPDATESをチェックすると

enter image description here

は「OFF」ではありませんが、それはただのですサーバ変数は、スレッドローカル値については何もありません。

再度、クエリ/スレッドlow_priority_updatesの値が考慮されるかどうかを確認する実際の方法はありますか?

答えて

1

SET LOW_PRIORITY_UPDATES = 1コマンドを発行すると、セッションの変数値に影響します。したがって、セッション内の変数の値をチェックすることでこれを見ることができます。私はそれを行うには、2つの方法を知っている

:これは

2-/OFF ON示し 'low_priority_dapdates'

LIKE

の1- SHOWセッション変数はsession.low_priority_updates

@@を選択します

これは0/1

重要:上記のステートメント/コールにはyそれらが実行されているセッション内の変数の値。 したがって、値を表示するには、接続自体を使用してそれらを実行する必要があります。私はあなたが別のセッションに属する変数の値を選択できるMySQLの方法を知らない。

リストとして表示したい場合は、テーブルを作成してその情報を自分でロギングして回避する必要があります。例えば:あなたが手順でこの文を入れて、そのと呼ばれるのを確認して、または追加することができます

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

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

は、あなたは接続IDと値をテーブルに挿入する文を必要としますあなたが知っているテーブルのトリガーで更新/挿入されます。

その後、my_low_priority_updatesテーブルを照会すると、各接続の変数の値が表示されます。

+0

うん、それはうまくいった。 JDBCを使用して、 'select connection_id()、@@ session.low_priority_updates from dual'を発行して接続に正しいlow_priority_valueがあることを確認できます。そして確かにそれは正常に動作し、変数のセッション値は接続initでどのように初期化するかによって変化します。ありがとう! –

関連する問題