我需要使用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();
有没有什么办法可以有效地使用 PreparedStatement
在 getRandomUsers
?我想我需要确保我只创建一次 PreparedStatement
而不是多次创建它 . 在我当前的架构中,最好的设计是什么?如何使用它?
2 回答
您可以创建所需语句的缓存(这是一个相当基本的例子来提供您的想法) . 让我们从创建将用作缓存的类开始 .
然后在您的单例中添加一个实例:
最后使用你的函数缓存:
我的实现与上面分享的实现大致相同,但是通过性能检查和实现来处理竞争条件 . 在我的思考过程中查看代码的内联注释 .
使用此缓存单例类将如下所示:
很简单;)