データベースを複数の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をチェックすると
は「OFF」ではありませんが、それはただのですサーバ変数は、スレッドローカル値については何もありません。
再度、クエリ/スレッドlow_priority_updatesの値が考慮されるかどうかを確認する実際の方法はありますか?
うん、それはうまくいった。 JDBCを使用して、 'select connection_id()、@@ session.low_priority_updates from dual'を発行して接続に正しいlow_priority_valueがあることを確認できます。そして確かにそれは正常に動作し、変数のセッション値は接続initでどのように初期化するかによって変化します。ありがとう! –