Blog

MySQL Connector/J を利用するときは cacheServerConfiguration=true を設定する

MySQL は一般に接続コストが低いことで知られており、コネクションプーリング等しなくても使えるので便利。

だが、Java 用の MySQL Driver であるところの MySQL Connector/J はデフォルトでは数個のクエリを接続時に発行しており、デフォルトのままでは無駄に負荷がかかる。

デフォルトでは以下のように4つの準備クエリが発行される! どう考えてもおかしいですよね!やばいっす!

150108  9:18:11         5 Connect     root@localhost on test
            5 Query     /* mysql-connector-java-5.1.34 ( Revision: [email protected] ) */SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR Variable_name = 'license' OR Variable_name = 'init_connect'
            5 Query     /* mysql-connector-java-5.1.34 ( Revision: [email protected] ) */SELECT @@session.auto_increment_increment
            5 Query     SET character_set_results = NULL
            5 Query     SET autocommit=1
            5 Query     SELECT 4649
            5 Quit

とりあえず cacheServerConfiguration=true は必ず設定しておいたほうが良い。なぜならば MySQL のサーバー側の設定は基本的に変更しないし、Failover した場合に設定が変わることもないからだ(変わっていたらそれは設定ミスでしょう)。 設定するだけで2つのクエリが削減できる。

↓このへんが詳しいので見ておくとよいでしょう。