Cassandra java 驱动警告
Cassandra java driver warning
我一直在日志中看到这条消息,主要是每次进行查询时。
Query 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
username=?; is not prepared on /XX.YY.91.205:9042, preparing before
retrying executing. Seeing this message a few times is fine, but
seeing it a lot may be source of performance problems.
查询是使用 mapper.get("username") ---> com.datastax.driver.mapping.Mapper
这就是我在构造函数中初始化映射器的方式。之后我就不再使用mappingManager了。
this.mapper = mappingManager.mapper(MyPojo.class);
有什么线索吗?
看起来您并没有长期保留 MappingManager
的实例,而是在每次获取数据时重新创建它。这是一个大错误 - MappingManager
应该与 Cluster
和 Session
对象具有相同的生命周期。
映射管理器负责从您的 class 中提取字段注释、生成查询、准备查询然后执行。准备好的查询缓存在映射管理器中,所以当它被销毁时,缓存会丢失,当你再次尝试执行 get
时,这个过程会重复,导致巨大的开销 - 需要再次准备查询,并且这是很大的网络开销,所以实际上您的查询比使用非准备查询要慢。
只需将 MappingManager
实例移动到某个静态块,这样它就可以重新用于所有映射器操作。
我一直在日志中看到这条消息,主要是每次进行查询时。
Query 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 username=?; is not prepared on /XX.YY.91.205:9042, preparing before retrying executing. Seeing this message a few times is fine, but seeing it a lot may be source of performance problems.
查询是使用 mapper.get("username") ---> com.datastax.driver.mapping.Mapper
这就是我在构造函数中初始化映射器的方式。之后我就不再使用mappingManager了。
this.mapper = mappingManager.mapper(MyPojo.class);
有什么线索吗?
看起来您并没有长期保留 MappingManager
的实例,而是在每次获取数据时重新创建它。这是一个大错误 - MappingManager
应该与 Cluster
和 Session
对象具有相同的生命周期。
映射管理器负责从您的 class 中提取字段注释、生成查询、准备查询然后执行。准备好的查询缓存在映射管理器中,所以当它被销毁时,缓存会丢失,当你再次尝试执行 get
时,这个过程会重复,导致巨大的开销 - 需要再次准备查询,并且这是很大的网络开销,所以实际上您的查询比使用非准备查询要慢。
只需将 MappingManager
实例移动到某个静态块,这样它就可以重新用于所有映射器操作。