我正在使用dse驱动程序3.6.8,java 8, spring 3.2.18我试图为每个表设置不同的一致性级别所需的一致性级别存储在属性文件
中。<entry key="consistency.level.strongWriteLevel">EACH_QUORUM</entry>
<entry key="consistency.level.strongReadLevel">LOCAL_QUORUM</entry>
<entry key="consistency.level.lightWriteLevel">TWO</entry>
<entry key="consistency.level.lightReadLevel">ONE</entry>
I tried this
@Component
@Table(name = "someName",
readConsistency = "${consistency.level.strongReadLevel}",
writeConsistency = "${consistency.level.strongWriteLevel}")
public class MMBaseLoginHistory {
,但它没有工作。我知道我可以在覆盖@Table CL的映射器上设置CL,但我想知道至少是否可能。
我尝试了这段代码的多个变体,有或没有@Component通过添加字段@Value("${consistency.level.strongReadLevel}")
private String strongReadLevel;
,然后尝试引用它
@Component
@Table(name = "someName",
readConsistency = strongReadLevel)
public class MMBaseLoginHistory {
前面的都不起作用
编辑:我找到了这个解决方案,但它根本不适合我。
import static com.cardlinkin.mm.model.beans.MMBaseLoginHistory.writeConsistencyLevel;
import static com.cardlinkin.mm.model.beans.MMBaseLoginHistory.readConsistencyLevel;
@Component
@Table(name = "someName",
writeConsistency = writeConsistencyLevel,
readConsistency = readConsistencyLevel)
public class MMBaseLoginHistory {
@Value("${consistency.level.strongWriteLevel}")
public static final String writeConsistencyLevel = "";
@Value("${consistency.level.strongReadLevel}")
public static final String readConsistencyLevel = "";
这不是对您问题的直接回答,但我想指出的是,我们的一般建议是同时使用LOCAL_QUORUM
进行读取和写入。在非常有限的边缘情况下,其他一致性级别(如ONE
)是合适的选择。
例如,EACH_QUORUM
是非常昂贵的,你需要充分意识到在Cassandra dc位于不同地理位置的情况下你将招致的惩罚。如果网络上的延迟越长,要求远程dc的仲裁确认的代价可能会非常昂贵。
如果C* dc位于相同的物理位置,或者如果dc之间的距离/延迟非常可忽略,那么EACH_QUORUM
的成本很低,您应该期望成功复制突变,因此使用昂贵的CL没有真正的好处。
同样,ONE
的一致性只被推荐用于一致性真的不重要的用例。例如,在社交动态中,如果一个帖子没有出现在某人的时间轴上,这不会产生太大的影响,因为用户下次刷新动态时会看到该帖子。干杯!