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

约翰

我需要使用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();

有什么办法,我可以使用PreparedStatementgetRandomUsers高效率?我想我需要确保PreparedStatement创建一次而不是多次创建。在我当前的体系结构中,最佳的设计是什么?如何使用它?

柳本·托多罗夫(Lyuben Todorov)

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

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));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Datastax Java驱动程序有效地使用批写入Cassandra?

来自分类Dev

如何正确有效地重用C#.NET(SQL Server)中的准备好的语句?

来自分类Dev

如何正确有效地重用C#.NET(SQL Server)中的准备好的语句?

来自分类Dev

使用准备好的语句时,Cassandra中的python驱动程序出现问题

来自分类Dev

来自准备好的语句的 Cassandra PHP 驱动程序 502 badgateway

来自分类Dev

如何在Spatialite Android中使用准备好的语句?

来自分类Dev

如何在Joomla中使用准备好的语句?

来自分类Dev

如何在Android sqlite中使用准备好的语句?

来自分类Dev

Datastax Java Cassandra驱动程序:使用WHERE的多个AND语句?

来自分类Dev

如何在Datastax Java驱动程序中使用异步/批量写入功能

来自分类Dev

'如何通过node.js mongodb驱动程序有效地流式传输大型json文档?

来自分类Dev

如何使用带有Datastax Java驱动程序的CQL向Cassandra添加任意列?

来自分类Dev

如何使用带有Datastax Java驱动程序的CQL向Cassandra添加任意列?

来自分类Dev

如何在Java8中使用if有效地创建列表?

来自分类Dev

如何在内部 sql 语句中使用准备好的语句?

来自分类Dev

如何在 DO 语句中使用准备好的语句?

来自分类Dev

Cassandra准备的语句错误与datastax php驱动程序

来自分类Dev

使用准备好的语句登录Servlet

来自分类Dev

使用准备好的语句更新

来自分类Dev

使用准备好的语句写入 mysql

来自分类Dev

如何准备带有很多if语句的准备好的语句?

来自分类Dev

如何在使用FILESTREAM的应用程序中有效地使用CHECKPOINT

来自分类Dev

如何使用DataStax Java驱动程序设置Cassandra客户端到节点的加密?

来自分类Dev

如何在PDO准备好的语句的标记参数中使用句点?

来自分类Dev

如何在PDO准备好的语句的标记参数中使用句点?

来自分类Dev

使用Datastax Java驱动程序的Cassandra复合键

来自分类Dev

有效地使用JSON流(在Java中)

来自分类Dev

有效地使用 Java Streams

来自分类Dev

有效地使用ConcurrentHashMap?

Related 相关文章

  1. 1

    如何使用Datastax Java驱动程序有效地使用批写入Cassandra?

  2. 2

    如何正确有效地重用C#.NET(SQL Server)中的准备好的语句?

  3. 3

    如何正确有效地重用C#.NET(SQL Server)中的准备好的语句?

  4. 4

    使用准备好的语句时,Cassandra中的python驱动程序出现问题

  5. 5

    来自准备好的语句的 Cassandra PHP 驱动程序 502 badgateway

  6. 6

    如何在Spatialite Android中使用准备好的语句?

  7. 7

    如何在Joomla中使用准备好的语句?

  8. 8

    如何在Android sqlite中使用准备好的语句?

  9. 9

    Datastax Java Cassandra驱动程序:使用WHERE的多个AND语句?

  10. 10

    如何在Datastax Java驱动程序中使用异步/批量写入功能

  11. 11

    '如何通过node.js mongodb驱动程序有效地流式传输大型json文档?

  12. 12

    如何使用带有Datastax Java驱动程序的CQL向Cassandra添加任意列?

  13. 13

    如何使用带有Datastax Java驱动程序的CQL向Cassandra添加任意列?

  14. 14

    如何在Java8中使用if有效地创建列表?

  15. 15

    如何在内部 sql 语句中使用准备好的语句?

  16. 16

    如何在 DO 语句中使用准备好的语句?

  17. 17

    Cassandra准备的语句错误与datastax php驱动程序

  18. 18

    使用准备好的语句登录Servlet

  19. 19

    使用准备好的语句更新

  20. 20

    使用准备好的语句写入 mysql

  21. 21

    如何准备带有很多if语句的准备好的语句?

  22. 22

    如何在使用FILESTREAM的应用程序中有效地使用CHECKPOINT

  23. 23

    如何使用DataStax Java驱动程序设置Cassandra客户端到节点的加密?

  24. 24

    如何在PDO准备好的语句的标记参数中使用句点?

  25. 25

    如何在PDO准备好的语句的标记参数中使用句点?

  26. 26

    使用Datastax Java驱动程序的Cassandra复合键

  27. 27

    有效地使用JSON流(在Java中)

  28. 28

    有效地使用 Java Streams

  29. 29

    有效地使用ConcurrentHashMap?

热门标签

归档