2017-12-20 21 views
1

、それは次の例外をスロー:com.datastax.driver.core.exceptions.BusyPoolExceptionは

com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: localhost/127.0.0.1:9042 (com.datastax.driver.core.exceptions.BusyPoolException: [localhost/127.0.0.1] Pool is busy (no available connection and the queue has reached its max size 256))) 
    at com.datastax.driver.core.RequestHandler.reportNoMoreHosts(RequestHandler.java:213) 
    at com.datastax.driver.core.RequestHandler.access$1000(RequestHandler.java:49) 
    at com.datastax.driver.core.RequestHandler$SpeculativeExecution.findNextHostAndQuery(RequestHandler.java:277) 
    at com.datastax.driver.core.RequestHandler$SpeculativeExecution$1.onFailure(RequestHandler.java:340) 
    at com.google.common.util.concurrent.Futures$6.run(Futures.java:1764) 
    at com.google.common.util.concurrent.MoreExecutors$DirectExecutor.execute(MoreExecutors.java:456) 
    at com.google.common.util.concurrent.Futures$ImmediateFuture.addListener(Futures.java:153) 
    at com.google.common.util.concurrent.Futures.addCallback(Futures.java:1776) 
    at com.google.common.util.concurrent.Futures.addCallback(Futures.java:1713) 
    at com.datastax.driver.core.RequestHandler$SpeculativeExecution.query(RequestHandler.java:299) 
    at com.datastax.driver.core.RequestHandler$SpeculativeExecution.findNextHostAndQuery(RequestHandler.java:274) 
    at com.datastax.driver.core.RequestHandler.startNewExecution(RequestHandler.java:117) 
    at com.datastax.driver.core.RequestHandler.sendRequest(RequestHandler.java:97) 
    at com.datastax.driver.core.SessionManager.executeAsync(SessionManager.java:132) 
    at com.outworkers.phantom.builder.query.CassandraOperations$class.scalaQueryStringToPromise(CassandraOperations.scala:67) 
    at com.outworkers.phantom.builder.query.InsertQuery.scalaQueryStringToPromise(InsertQuery.scala:31) 
    at com.outworkers.phantom.builder.query.CassandraOperations$class.scalaQueryStringExecuteToFuture(CassandraOperations.scala:31) 
    at com.outworkers.phantom.builder.query.InsertQuery.scalaQueryStringExecuteToFuture(InsertQuery.scala:31) 
    at com.outworkers.phantom.builder.query.ExecutableStatement$class.future(ExecutableQuery.scala:80) 
    at com.outworkers.phantom.builder.query.InsertQuery.future(InsertQuery.scala:31) 
    at nd.cluster.data.store.Points.upsert(Models.scala:114) 

Iは、上記解決しましたPoolingOptionsを使用して問題を解決しました。

val poolingOptions = new PoolingOptions() 
    .setConnectionsPerHost(HostDistance.LOCAL, 1, 200) 
    .setMaxRequestsPerConnection(HostDistance.LOCAL, 256) 
    .setNewConnectionThreshold(HostDistance.LOCAL, 100).setCoreConnectionsPerHost(HostDistance.LOCAL, 200) 

    val builder1 = ContactPoint.local 
    .noHeartbeat() 
    .withClusterBuilder(_.withoutJMXReporting() 
     .withoutMetrics().withPoolingOptions(poolingOptions)).keySpace("nd") 

これで1lのデータでも動作しています。しかし、私はその効率性についてよく分かりません。 誰も助けてくれませんか?

答えて

2

これは、あまりにも多くのリクエストを提出していることを示しています。

接続ごとのデフォルトの最大要求数は1024です。すべての接続でこの数を超えた場合、接続プールはいくつかの要求を最大256までエンキューします。キューがいっぱいになると、BusyPoolExceptionがスローされます。もちろん、1接続あたりの最大リクエスト数と1ホストあたりの最大接続数を増やすことができます。しかし、本当の解決策はもちろんあなたのスレッドを絞ることです。たとえば、 1,000件のバッチでリクエストを提出し、さらに先に完了してより多くのリクエストを提出するか、セマフォを使用して保留中のリクエストの総数を規制し、特定の数を超えないようにします(理論上は、 num_hosts * max_connections_per_host * max_requests_per_connection - 実際には、おそらくより多くのスループットをもたらすわけではないため、1,000を超えることはお勧めしません。

このリンクが役立つ場合があります。

https://github.com/redisson/redisson/issues/438
https://groups.google.com/a/lists.datastax.com/forum/#!topic/java-driver-user/p3CwOL0kNrshttp://docs.datastax.com/en/developer/java-driver/3.1/manual/pooling

+0

私はすでに、これらのフォーラムを読んだことがあります。しかし、私はそれをどのように絞り込むのか分からなかった。だから私はpoolingoptionを使用して問題を解決しました。 –

+0

@MaheshChandKandpalセマフォを使用したスロットルの例https://stackoverflow.com/a/30526719/5940335 –

関連する問題