com.datastax.driver.core.exceptions.InvalidQueryException:尝试执行未知的准备好的查询。您可能使用了通过另一个集群实例创建的PreparedStatement
将应用程序从 java 8 升级到 java 17 后遇到此问题。
目前我们正在使用 datastax 驱动程序核心 3.3.0 和 3.11.7 cassandra 服务器
private ResultSet execute(BoundStatement boundStatement) {
queryLogger.debug("Executing : {}", boundStatement.preparedStatement().getQueryString());
ResultSet resultSet = getSession(boundStatement).execute(boundStatement);
return resultSet;
}
在调用方法的
getSession()
时抛出此错误。 `getSession()方法实现是这样的
private Session getSession(BoundStatement boundStatement) {
return cassandraConfiguration.getSession(boundStatement.preparedStatement().getQueryKeyspace());
}
public Session getSession(String keyspace) {
if (!sessionCache.containsKey(keyspace)) {
sessionCache.put(keyspace, createSession(keyspace));
}
return sessionCache.get(keyspace);
}
您的代码似乎可能创建多个
Session
对象,并且 createSession()
被调用。
InvalidQueryException
的可能来源是在单独的会话中创建的准备好的语句,该语句在另一个会话中不可用,因此活动会话不知道准备好的查询。
会话是重量级对象,而且价格昂贵,因为它们维护与集群中每个节点的连接,因此为了获得最佳实践,我们建议创建一个由整个应用程序使用和共享的单个会话。
有关更多信息,请参阅Apache Cassandra 驱动程序的最佳实践。干杯!