gpt4 book ai didi

java - 如何在 Cassandra 中使用 datastax java 驱动程序有效地使用准备好的语句?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:07:03 25 4
gpt4 key购买 nike

我需要使用 Datastax Java 驱动程序查询 Cassandra 中的一个表。下面是我的代码,工作正常-

public class TestCassandra {

private Session session = null;
private Cluster cluster = null;

private static class ConnectionHolder {
static final TestCassandra connection = new TestCassandra();
}

public static TestCassandra getInstance() {
return ConnectionHolder.connection;
}

private TestCassandra() {
Builder builder = Cluster.builder();
builder.addContactPoints("127.0.0.1");

PoolingOptions opts = new PoolingOptions();
opts.setCoreConnectionsPerHost(HostDistance.LOCAL, opts.getCoreConnectionsPerHost(HostDistance.LOCAL));

cluster = builder.withRetryPolicy(DowngradingConsistencyRetryPolicy.INSTANCE).withPoolingOptions(opts)
.withLoadBalancingPolicy(new TokenAwarePolicy(new DCAwareRoundRobinPolicy("DC2")))
.withReconnectionPolicy(new ConstantReconnectionPolicy(100L))
.build();
session = cluster.connect();
}

private Set<String> getRandomUsers() {
Set<String> userList = new HashSet<String>();

for (int table = 0; table < 14; table++) {
String sql = "select * from testkeyspace.test_table_" + table + ";";

try {
SimpleStatement query = new SimpleStatement(sql);
query.setConsistencyLevel(ConsistencyLevel.QUORUM);
ResultSet res = session.execute(query);

Iterator<Row> rows = res.iterator();
while (rows.hasNext()) {
Row r = rows.next();

String user_id = r.getString("user_id");
userList.add(user_id);
}
} catch (Exception e) {
System.out.println("error= " + ExceptionUtils.getStackTrace(e));
}
}

return userList;
}
}

我在我的主应用程序中使用这样的类 -

TestCassandra.getInstance().getRandomUsers();

有什么方法可以有效地在 getRandomUsers 中使用 PreparedStatement 吗?我想我需要确保只创建一次 PreparedStatement 而不是多次创建它。在我当前的架构中,什么是最好的设计?我该如何使用它?

最佳答案

您可以为所需的语句创建缓存(这是一个相当基本的示例,可以让您了解)。让我们从创建将用作缓存的类开始。

private class StatementCache {
Map<String, PreparedStatement> statementCache = new HashMap<>();
public BoundStatement getStatement(String cql) {
PreparedStatement ps = statementCache.get(cql);
// no statement cached, create one and cache it now.
if (ps == null) {
ps = session.prepare(cql);
statementCache.put(cql, ps);
}
return ps.bind();
}
}

然后给你的单例添加一个实例:

public class TestCassandra {
private Session session = null;
private Cluster cluster = null;
private StatementCache psCache = new StatementCache();
// rest of class...

最后使用函数中的缓存:

private Set<String> getRandomUsers(String cql) {
// lots of code.
try {
SimpleStatement query = new SimpleStatement(cql);
query.setConsistencyLevel(ConsistencyLevel.QUORUM);
// abstract the handling of the cache to it's own class.
// this will need some work to make sure it's thread safe
// as currently it's not.
ResultSet res = session.execute(psCache.getStatement(cql));

关于java - 如何在 Cassandra 中使用 datastax java 驱动程序有效地使用准备好的语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28776172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com