com.datastax.driver.core.exceptions.InvalidQueryException:尝试执行未知的准备好的查询

问题描述 投票:0回答:1

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);
}
reactjs spring spring-mvc cassandra-3.0 java-17
1个回答
0
投票

您的代码似乎可能创建多个

Session
对象,并且
createSession()
被调用。

InvalidQueryException
的可能来源是在单独的会话中创建的准备好的语句,该语句在另一个会话中不可用,因此活动会话不知道准备好的查询。

会话是重量级对象,而且价格昂贵,因为它们维护与集群中每个节点的连接,因此为了获得最佳实践,我们建议创建一个由整个应用程序使用和共享的单个会话。

有关更多信息,请参阅Apache Cassandra 驱动程序的最佳实践。干杯!

© www.soinside.com 2019 - 2024. All rights reserved.