我正在同时运行超过50个线程的ExecutorService。每个线程都打开与Cassandra的连接并使用springframework.data.cassandra
执行插入。问题是当我一次打开超过50个连接时,我收到以下错误。
Caused by: org.jboss.netty.channel.ChannelException: Failed to create a selector.
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.openSelector(AbstractNioSelector.java:343)
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.<init>(AbstractNioSelector.java:100)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.<init>(AbstractNioWorker.java:52)
at org.jboss.netty.channel.socket.nio.NioWorker.<init>(NioWorker.java:45)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.createWorker(NioWorkerPool.java:45)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.createWorker(NioWorkerPool.java:28)
at org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool.newWorker(AbstractNioWorkerPool.java:143)
at org.jboss.netty.channel.socket.nio.AbstractNioWorkerPool.init(AbstractNioWorkerPool.java:81)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.<init>(NioWorkerPool.java:39)
at org.jboss.netty.channel.socket.nio.NioWorkerPool.<init>(NioWorkerPool.java:33)
at org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory.<init>(NioClientSocketChannelFactory.java:151)
at org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory.<init>(NioClientSocketChannelFactory.java:116)
at com.datastax.driver.core.Connection$Factory.<init>(Connection.java:532)
at com.datastax.driver.core.Cluster$Manager.<init>(Cluster.java:1201)
at com.datastax.driver.core.Cluster$Manager.<init>(Cluster.java:1144)
at com.datastax.driver.core.Cluster.<init>(Cluster.java:121)
at com.datastax.driver.core.Cluster.<init>(Cluster.java:108)
at com.datastax.driver.core.Cluster.buildFrom(Cluster.java:177)
at com.datastax.driver.core.Cluster$Builder.build(Cluster.java:1109)
如果我打开50个(或更少)线程,它可以正常工作。有没有办法配置这个,所以我可以允许更多?在我的cassandra.yaml文件中,rpc_max_threads
根据默认情况下的评论“默认为无限制”
答案 0 :(得分:1)
我的猜测是你通过创建太多连接来压倒你的操作系统。您应该只为每个Cassandra集群创建1个集群实例。集群创建会话,管理自己的连接池。 Cluster和Session都是线程安全的,因此您可以在线程之间共享它们。
Four simple rules for coding with the driver很好地提炼了这些概念:
编写使用驱动程序的代码时,您应遵循四条简单的规则,这些规则也会使您的代码更有效:
- 每个(物理)群集使用一个群集实例(每个应用程序生命周期)
- 每个键空间最多使用一个会话实例,或使用单个会话并在查询中明确指定键空间 ...
醇>群集实例允许配置连接和查询处理方式的不同重要方面。在此级别,您可以配置从联系点(在驱动程序执行节点发现之前最初要联系的节点的地址),请求路由策略,重试和重新连接策略等所有内容。通常,此类设置在应用程序级别设置一次。
当会话实例以查询执行为中心时,Session也管理每个节点的连接池。会话实例是一个长期存在的对象,它不应该以请求 - 响应,短期方式使用。代码应该在您的应用程序中共享相同的集群和会话实例。