我在云上运行Cassandra数据库。我创建了一个 Rest Web 服务来查询 cassandra Db。我想从将使用我的 Web 服务的 UI 的用户那里获取输入
以下是我运行的代码:
public String cql2(int psa)
{
Cluster.Builder clusterBuilder = Cluster.builder()
.addContactPoints("52.36.24.246").withPort(9042)
.withQueryOptions(new QueryOptions().setFetchSize(2000))
.withCredentials("username", "password");
Session session = clusterBuilder.build().connect();
String cqlStatement = "SELECT * FROM godfather.crime WHERE psa='"+psa+"' ALLOW FILTERING";
for (Row row : session.execute(cqlStatement))
{
cql=(row.toString());
}
return cql;
}
}
通常,当查询要在应用程序的整个生命周期中多次执行(使用或不具有不同的参数(时,预准备语句是最佳解决方案。
基本上你的代码将变成:
public class MyService {
private Cluster cluster;
private Session session;
private PreparedStatement query;
// exception handling not included to keep the code short
public void init() {
cluster = Cluster.builder()
.addContactPoints("52.36.24.246").withPort(9042)
.withQueryOptions(new QueryOptions().setFetchSize(2000))
.withCredentials("username", "password")
.build();
session = cluster.connect();
query = session.prepare("SELECT * FROM godfather.crime WHERE psa= ?");
}
public String execQuery(int psa) {
for(Row r : session.execute(prepared.bind(psa))) {
// your processing here
}
}
}
一些其他细节:
- 建议每个应用程序仅初始化
Cluster
和Session
一次。这些是应该保留的长寿命物体。 - 建议只准备一次报表
- 为了简单起见,上面的代码中不包含异常处理、初始化等内容。
如果您想了解有关 prepare 语句的更多信息:
- 与其他数据库一样,Cassandra确实支持预准备语句。您可以在这篇维基百科文章中阅读有关准备好的陈述的优势的更多信息 Cassandra 中的预准备语句
- 在 Cassandra 的 Java 驱动程序中的预准备语句中有很好的记录