我正在使用 Astyanax client
从中读取数据 Cassandra database
. 我有一个 single cluster
与 four nodes
. 我正在吃 replication factor of 2
. 我在努力理解
setMaxConns and setMaxConnsPerHost
astyanax客户端中的方法?我找不到这方面的适当文件。
我有一个多线程代码,它生成多个线程,然后只创建一次到cassandra数据库的连接(因为它是一个单线程),然后继续为其他请求重用。
现在我想了解一下以上两种方法在阅读中的作用?这些值应该如何设置?
如果我把以上两种方法设置为-
setMaxConns(-1) and setMaxConnsPerHost(20)
那是什么意思?任何解释都会大有帮助。
更新code:-
下面是代码,我用它来建立连接-
private CassandraAstyanaxConnection() {
context = new AstyanaxContext.Builder()
.forCluster(ModelConstants.CLUSTER)
.forKeyspace(ModelConstants.KEYSPACE)
.withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
.setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
)
.withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("MyConnectionPool")
.setPort(9160)
.setMaxConnsPerHost(20)
.setMaxConns(-1)
.setSeeds("host1:9160,host2:9160,host3:9160,host4:9160")
)
.withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
.setCqlVersion("3.0.0")
.setTargetCassandraVersion("1.2"))
.withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
.buildKeyspace(ThriftFamilyFactory.getInstance());
context.start();
keyspace = context.getEntity();
emp_cf = ColumnFamily.newColumnFamily(
ModelConstants.COLUMN_FAMILY,
StringSerializer.get(),
StringSerializer.get());
}
如果我调试这段代码,它甚至没有点击 BagOfConnectionsConnectionPoolImpl
班级。我在同一个类中放置了很多断点,以查看它是如何使用conenctions和其他默认参数的。但我不知道为什么它没有击中那个类。
1条答案
按热度按时间q43xntqr1#
有关这些配置属性的行为可能取决于实现。
bagofconnectionsconnectionpoolimpl
BagOfConnectionsConnectionPoolImpl
是目前唯一一个同时满足这两个属性的实现。其行为如下:每次cassandra操作(查询或变异)时,连接都从池中借用,并在操作完成时返回到池中。
maxConnsPerHost
-每个cassandra主机的最大连接数。maxConns
-池中的最大连接数。这两个数字都必须是正数,所以
setMaxConns(-1)
只是行不通。在尝试从池借用连接时,池将根据
maxConns
. 如果超出限制,它将等待某个连接被释放。如果在指定的超时时间内没有可用的连接,则池将抛出PoolTimeoutException
.如果
maxConns
如果未超出限制,则池将尝试查找它所知道的具有以下活动连接数的cassandra主机(指定为种子或在发现期间找到)maxConnsPerHost
并连接到它。如果所有主机都达到连接限制,池将抛出NoAvailableHostsException
.例如,让我们以一个连接到由4个节点组成的集群的客户机为例:
setMaxConns(100); setMaxConnsPerHost(10)
:有效最大连接数为40(每个节点10个连接,将不再尝试连接)。NoAvailableHostsException
将被抛出。setMaxConns(20); setMaxConnsPerHost(10)
:有效最大连接数为20。到不同主机的连接将均匀分布,但不一定要均匀分布。PoolTimeoutException
将被抛出。如果节点加入或离开集群,事情会变得更复杂,但总体思路是一样的。
tokenawareconnectionpoolimpl和roundrobinconnectionpoolimpl
两者
TokenAwareConnectionPoolImpl
&RoundRobinConnectionPoolImpl
忽略maxConns
配置属性。他们只是选择一个主机(取决于行标记或随机)并尝试连接到它。如果到该主机的活动连接数超过
maxConnsPerHost
,池将等待某个连接被释放。如果在指定的超时期间没有可用的连接,则会在故障转移过程中执行另一个到(可能)另一个主机的连接尝试。