まず、mysqlのプロパティを理解しましょう。
-
Interactive_timeout
:mysqldumpやmysqlコマンドラインツールのようなmysqlシェルセッションのインタラクティブなタイムアウト(秒単位)。接続はスリープ状態です。ほとんどの場合、mysql cliで何かを実行しているときに切断されたくないため、これはより高い値に設定されます。 -
wait_timeout
:MySQLが非対話型接続で接続を閉じる前に待機する非アクティブ時の秒数(秒単位)。例:Javaから接続。接続はスリープ状態です。
それでは、c3poのプロパティとそれがDBの小道具との関係を理解しましょう(私はあなたの質問からコピーするつもりです)
これは、接続オブジェクトが使用可能であり、プールで使用可能になる期間を指します。タイムアウトが過ぎると、c3poはそれを破壊するかリサイクルします。
ここで問題が発生するのは、 maxIdleTime
がある場合です。 wait_timeout
より高い 。mxIdleTime:50
の場合を考えてみましょう 秒とwait_timeout:40秒
次に、接続タイムアウト例外:壊れたパイプcode>が発生する可能性があります 過去10秒間に何らかの操作を行おうとした場合。したがって、
maxIdelTime
常にwait_timeout
より小さくする必要があります 。
maxIdleTimeの代わりに、次のプロパティを使用できます。
-
idleConnectionTestPeriod
接続をテストする前にアイドル状態を維持する時間に制限を設定します。PreferredTestQuery
なし 、デフォルトはDatabaseMetaData.getTables()
-これはデータベースに依存せず、比較的高価な呼び出しですが、比較的小さなデータベースにはおそらく問題ありません。パフォーマンスに不安がある場合は、データベースに固有のクエリを使用してください(つまり、preferredTestQuery ="SELECT 1")
-
maxIdleTimeExcessConnections
アクティビティが急増した後、connectionCountをminPoolSizeに戻します。
プールプロパティのいずれか(例: maxIdleTime
)に注意してください )プール内の接続にのみ影響します つまり、hibernateが接続を取得し、maxIdleTimeよりも長い間アイドル状態を維持してから何らかの操作を行おうとすると、「パイプの破損」が発生します
wait_timeout
を低くするのは良いことです mysqlでは、ただし、アプリケーションがすでにビルドされている場合は常に正しいとは限りません。アプリケーションで wait_time
を超えて接続を開いたままにしないことを、減らす前に確認する必要があります。
また、接続の取得はコストのかかる作業であり、待機時間が短すぎると、接続を取得しようとすることが多いため、接続プールを持つという目的全体に反することも考慮する必要があります。
これは、Spring transnational APIを使用する場合など、接続管理を手動で行っていない場合に特に重要です。 @Transaction
を入力すると、Springはトランザクションを開始します プールから接続を取得するための注釈付きメソッド。 Webサービスを呼び出したり、wait_time outよりも時間がかかるファイルを読み取ったりすると、例外が発生します。
私は一度この問題に直面しました。
私のプロジェクトの1つに、顧客の注文処理を行うcronがありました。それを速くするために、私はバッチ処理を使用しました。ここで、顧客のバッチを取得して処理を実行したら(db呼び出しなし)。壊れたパイプの例外を取得するために使用したすべての注文を保存しようとすると。問題は、wait_timeoutが1分で、注文処理にそれ以上の時間がかかっていたことです。そのため、2分に増やす必要がありました。バッチサイズを小さくすることもできましたが、それによって全体的な処理が遅くなりました。