JDBC Driver for MySQL (Connector/J) おすすめ設定

使い方

  • MySQL の「JDBC Driver for MySQL (Connector/J)」は、デフォルト設定では残念な挙動および性能を示してしまいます。
  • 以下に示す設定をおこなうことによって、Connector/J の挙動および性能を他の多くの RDBMS の JDBC ドライバー並みに近づける改善をすることができます。

JNDI

カテゴリ キー 説明
文字コード useUnicode true Unicode を利用するかどうか。MySQL では UTF-8 を利用することを推奨します。
文字コード characterEncoding UTF-8 文字コードに何を使うのか。の設定。MySQL では UTF-8 を利用することを推奨します。
文字コード characterSetResults UTF-8 文字コードに何を使うのか。の設定。MySQL では UTF-8 を利用することを推奨します。
結果セット useCursorFetch true データベース上の結果セットからクライアントへの転送について、データベース上のカーソル・フェッチを利用するかどうか。Oracle や PostgreSQL 的な動きを期待するのであれば、true に設定します。
結果セット defaultFetchSize 128 useCursorFetch を利用する際の既定の転送サイズ。小さするぎると通信回数が増えてしまいますが、大きすぎると転送開始までの時間が増える可能性があります。
プリペアード・ステートメントuseServerPrepStmts true サーバーのプリペアード・ステートメントを利用するかどうか。ごく一般的な JDBC ドライバー (Oracle や PostgreSQL、そして Microsoft SQL Server など) と同じ動きを期待するのであれば true に設定します。なお、false 設定では過去において SQL インジェクションのセキュリティ・ホール発生のバグ報告があったという事例があり、そのような可能性を避けたい方は true を選択することを推奨します。
プリペアード・ステートメントemulateUnsupportedPstmtsfalse サーバー上でのプリペアード・ステートメント動作がサポートされない場合に、クライアント上のプリペアード・ステートメントにフォールバックさせるかどうか。クライアントサイドのプリペアード・ステートメントには、過去にセキュリティ・バグが存在した経緯があるので false 設定を推奨します。
ネットワーク tcpNoDelay false TCP/IP 通信において TCP_NO_DELAY を利用するかどうか。過負荷環境下ではむしろ false のほうが性能上有利であると考えています。
ネットワーク autoReconnectForPools true JNDI 接続プールの場合に、データベースタイムアウト切断などの際に自動再接続を実施するかどうか。天然で未使用のものがタイムアウトするので、これは true が必要。
ネットワーク useLocalSessionState true autocommit と transaction isolation をわざわざサーバに問い合わせずにローカルの情報を元に判断するようになります。
ネットワーク elideSetAutoCommits true 余計な 'set autocommit=n' 呼び出しを抑制します。(デフォルト設定の Connector/J は不要なクエリを頻発してしまうためです。
ネットワーク cacheServerConfigurationtrue 'SHOW VARIABLES' と 'SHOW COLLATION' 呼び出しを抑制します。★ただし、これには副作用があります。MySQL 設定を変更後は このキャッシュを破棄するためにアプリケーションサーバーの再起動が必要になります。
ネットワーク alwaysSendSetIsolation false いつもトランザクション分離設定の送信をおこなうかどうか。デフォルトが true なのは仕様バグに近いものすら感じられます...
ネットワーク useUnbufferedInput false recv() システムコール呼び出しの抑制
ネットワーク useReadAheadInput false recv() システムコール呼び出しの抑制
その他 maintainTimeStats false getTimeOfDay() 呼び出しの抑制

ポイント

  • 注意: MySQL の Connector/J において、明示的に conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); が必要なケースがある点注意。
  • GlassFish デフォルトで MySQL の多くのパラメータが表示されます。が必要の無いものについては削除することが妥当と考えます。
  • MySQL の my.cnf 設定でプリペアード・ステートメント・キャッシュの量を増やすべき。

リファレンス

ほのかに関係ありそうなリンク

リンク