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つのクエリが削減できる。