【问题标题】:Cassandra java driver warningCassandra java驱动程序警告
【发布时间】:2020-03-30 20:57:20
【问题描述】:

我一直在日志中看到此消息,主要是每次进行查询时。

查询 SELECT username AS col6,gender AS col1,last_name AS col2,email AS col3,first_name AS col4,something_uuid AS col5,group_email AS col7,deleted AS col8,puars AS col9 FROM something_data WHERE 用户名=?;没有在/XX.YY.91.205:9042上准备,在准备之前 重试执行。看到这个消息几次很好,但是 经常看到它可能是性能问题的根源。

使用 mapper.get("username") ---> com.datastax.driver.mapping.Mapper 进行查询

这就是我在构造函数中初始化映射器的方式。之后我不再使用 mappingManager。

this.mapper = mappingManager.mapper(MyPojo.class);

有什么线索吗?

【问题讨论】:

  • 你能放一段代码来创建MappingManager & Mapper 实例吗?我怀疑您在创建 MappingManager 后没有保留它
  • @AlexOtt 我已经添加了。你的假设是正确的。在构造函数中初始化后,不再使用 MappingManager。
  • 在什么构造函数中?请求还是别的什么?我的问题是 - 您是否经常重新创建映射管理器?喜欢每个 get 操作?
  • 我们在 spring 中使用 @Bean 创建了 MappingManager,但它有一个自定义名称,该名称未在存储库中使用。在 Repository 中,它是由 spring 使用 IoC 初始化的。

标签: java cassandra datastax-java-driver


【解决方案1】:

您似乎没有长时间保留MappingManager 的实例,而是在每次获取数据时重新创建它。这是一个大错误 - MappingManager 应该与 ClusterSession 对象具有相同的生命周期。

映射管理器负责从您的类中提取字段注释、生成查询、准备它们然后执行。准备好的查询被缓存在映射管理器中,所以当它被销毁时,缓存会丢失,当您尝试再次执行get 时,该过程会重复,导致大量开销 - 需要再次准备查询,这是显着的网络开销,因此实际上您的查询比使用未准备的查询要慢。

只需将MappingManager 实例移动到某个静态块,这样它就可以用于所有映射器操作。

【讨论】:

    猜你喜欢
    • 2016-06-30
    • 2016-08-04
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 2013-07-14
    • 2017-07-13
    • 2014-09-15
    • 2014-05-04
    相关资源
    最近更新 更多