0

接続ホストのコピー中のばかげたバグにより、間違ったエンドポイントを指すようになりました...これにより、初期化プロセスが30分間ブロックされました...

そして最後に例外:

  • 取得に失敗しました!!! 保留中の取得をクリアしています。必要な新しいリソースを取得しようとしているときに、許可されている最大取得試行回数 (30 回) を超えて成功しませんでした。

エラーを再現しようとして、次の接続文字列で google.es を指すだけです

jdbc:mysql://google.es/myDB

c3p0 プールを初期化しています... com.mchange.v2.c3p0.ComboPooledDataSource [acquireIncrement -> 1、acquireRetryAttempts -> 30、acquireRetryDelay -> 1000、autoCommitOnClose -> false、automaticTestTable -> null、breakAfterAcquireFailure -> false、checkoutTimeout -> 0 、connectionCustomizerClassName -> null、connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester、dataSourceName -> 1hgeksr8t1vk3sn21ui8jk0|53689fd0、debugUnreturnedConnectionStackTraces -> false、説明 -> null、driverClass -> com.mysql.jdbc.Driver、factoryClassLocation -> null、forceIgnoreUnresolvedTransactions -> false、identityToken -> 1hgeksr8t1vk3sn21ui8jk0|53689fd0、idleConnectionTestPeriod -> 0、initialPoolSize -> 3、jdbcUrl -> jdbc:mysql://google.es/myDB、maxAdministrativeTaskTime -> 0、maxConnectionAge -> 0、maxIdleTime -> 3600、maxIdleTimeExcessConnections -> 300、maxPoolSize -> 5、maxStatements -> 0、maxStatementsPerConnection -> 0、minPoolSize -> 1、numHelperThreads -> 3、preferredTestQuery -> null、プロパティ -> {user =*、パスワード=* }、propertyCycle -> 0、statementCacheNumDeferredCloseThreads -> 0、testConnectionOnCheckin -> false、testConnectionOnCheckout -> false、unreturnedConnectionTimeout -> 0、userOverrides -> {}、usesTraditionalReflectiveProxies -> false ]

そして、初期化はそれらの30分間スタックします...

例外をより速くスローしたいのですが、どの設定値に触れればよいかわかりません: c3p0 acquireRetryAttempts? またはjdbc socketTimeout?そして最も重要なことは、これを変更すると壊れる可能性があることです...

4

2 に答える 2

0

デフォルトのセットアップでは、不良データベースを検出するのに約 30 秒 (30 分ではありません!) かかります。つまり、acquireRetryDelay=1000ms の遅延で acquireRetryAttempts=30 を作成してから、接続を取得できないと結論付けます。不正なエンドポイントをより迅速に検出したい場合は、これらの変数のいずれかまたは両方を削除してください。必要に応じて、 acquireRetryAttempts を 1 に設定できます。この場合、接続の取得に関する例外は、エンドポイントの問題として解釈されます。

http://www.mchange.com/projects/c3p0/#configuring_recoveryを参照してください。

于 2013-04-10T11:55:19.653 に答える
0

問題は、JDBC タイムアウト構成にあります。

このブログで指定されているとおり: JDBC 内部とタイムアウト構成の理解

JDBC では、接続とソケットのタイムアウトのデフォルトは 0 ミリ秒です。つまり、タイムアウトはありません。

ターゲットエンドポイントが存在するが応答しない場合 (パケットはおそらくファイアウォールによって飲み込まれます)、接続はトラップされたままになり、1 分後にのみ (なぜ 1 分? それでもミステリー)、c3p0 は接続の再試行を試みます...したがって、途中で例外が発生しました長すぎる...

解決策は、connectTimeout=XXXms を JDBC に追加し (パラメーターとして渡すことができます: mysql://google.es/myDB?connectTimeout=1000)、1 分後に (タイムアウトの場合は 1 秒で 30 回の試行、再試行の遅​​延の場合は 1 秒) ) 例外が発生します...

それでも、すべてのパラメーターはニーズに合わせて調整する必要があります。これらのパラメーターには他の影響があり、機能を妨げる可能性があるためです。また、 breakAfterAcquireFailureの有効化など、考えられる構成についてc3p0 フォーラム スレッドを確認することをお勧めします。

于 2013-04-10T18:04:03.770 に答える