Scala新手求助:DCAwareRoundRobinPolicy构造器访问报错及方案验证
你的解决方案完全正确!
首先恭喜你找对了方向——这个问题的核心是Datastax Java Driver对DCAwareRoundRobinPolicy的实例化方式做了调整,直接调用构造函数的方式已经被官方废弃并私有化了。
为什么原来的代码会报错?
在较新版本的Datastax Cassandra Driver(3.x及以后)中,DCAwareRoundRobinPolicy的带参构造函数DCAwareRoundRobinPolicy(String localDc)已经被设置为私有,外部代码无法直接调用,这就是你在IntelliJ中遇到constructor cannot be accessed错误的原因。官方这么做是为了推广使用Builder模式,让配置策略的方式更灵活、可读性更强。
你的修改为什么正确?
你改用DCAwareRoundRobinPolicy.Builder的方式完全符合Driver的设计规范:
- 通过
new DCAwareRoundRobinPolicy.Builder()创建构建器实例 - 调用
withLocalDc(preferred_dc)指定你优先要访问的数据中心 - 最后用
build()生成最终的DCAwareRoundRobinPolicy对象 - 再把它包裹进
TokenAwarePolicy也是最佳实践——TokenAwarePolicy会智能路由请求到持有对应数据token的节点,配合DCAwareRoundRobinPolicy可以实现「优先本地DC负载均衡,必要时跨DC容错」的效果,非常适合多DC的Cassandra集群场景。
额外的优化建议(可选)
如果你的业务需要调整跨DC访问的参数,比如限制每个远程DC最多使用多少个节点(默认是2),可以在Builder链上补充配置:
val dcAwareRoundRobinPolicy = dcAwareRoundRobinPolicyBuilder .withLocalDc(preferred_dc) .withUsedHostsPerRemoteDc(3) // 调整为每个远程DC使用3个节点 .build()
附你的代码对比
报错的原始代码片段:
// 错误:构造函数不可访问 .withLoadBalancingPolicy(new TokenAwarePolicy(new DCAwareRoundRobinPolicy(preferred_dc)))
修改后的正确代码片段:
val dcAwareRoundRobinPolicyBuilder = new DCAwareRoundRobinPolicy.Builder val dcAwareRoundRobinPolicy = dcAwareRoundRobinPolicyBuilder.withLocalDc(preferred_dc) Cluster.builder() .addContactPoints(contactPointIpList) .withClusterName("multi_dc_user_data") .withLoadBalancingPolicy(new TokenAwarePolicy(dcAwareRoundRobinPolicy.build())) .withQueryOptions(new QueryOptions().setConsistencyLevel(ConsistencyLevel.LOCAL_ONE)) .build()
内容的提问来源于stack exchange,提问作者ahajib
相关产品推荐
相关产品推荐

