2015-02-27 16 views
5

Datastax Java sürücüsünü kullanarak Cassandra'daki tablolardan birini sorgulamam gerekir. Aşağıda ben kod iyi çalışır - benim ana uygulamada böyle sınıfının üstünde kullanıyorumCassandra'da datastax java sürücüsünü kullanarak hazırlanmış ifadeyi verimli bir şekilde nasıl kullanabilirim?

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

var mı ben verimli getRandomUsers içinde PreparedStatement kullanabilirsiniz herhangi bir yolu? Sanırım birden çok kez oluşturmak yerine PreparedStatement'u sadece bir kez oluşturduğumdan emin olmalıyım. Şu anki mimarimdeki en iyi tasarım nedir ve nasıl kullanabilirim?

cevap

11

Gereksinim duyduğunuz ifadelerin önbelleğini (bu size bir fikir vermek için oldukça basit bir örnektir) oluşturabilirsiniz. Önbellek olarak kullanılacak sınıfı oluşturarak başlayalım.

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

Ve nihayet işlevinden önbelleği kullanabilir:

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

Ardından tekil bir örneğini ekleyin

private Set<String> getRandomUsers(PreparedStatement ps) { 
// lots of code.  
     try { 
      SimpleStatement query = new SimpleStatement(sql); 
      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(sql)); 
+0

Bu müthiş. Şimdi anladığımız şeyi anladım, temel olarak, tüm yeni ifadeleri bir önbellekte doldurmamız gereken ve daha sonra bu ifadeleri alıcıdan kullanmamız gereken bir tek satırlık güvenli sınıf yapmamız gerekiyor. Sağ? – john

+0

@david Aslında, her iş parçacığı için bir önbellek alabilirim (haritanın alışı çok pahalı hale geldiğinde çalışmanız gerekir, böylece yeni bir paylaşılan önbellek gerekir) 5 iş parçacığı için 1 önbellek gibi bir şey deneyin. Muhtemelen her iş parçacığının kendi ps önbelleğine sahip olması gerekir (orada kaç tane ifadenin bulunduğuna, daha fazla ifade, ihtiyacınız olan daha az önbellek). –

+0

Son yorumunuzu, her konu için önbelleği anlamadım. Bunu nasıl yapabiliriz? – john

İlgili konular