2014-05-14 15 views
5

Sto cercando il modo corretto di utilizzare il driver Cassandra C# ufficiale (2.0) in un progetto API Web ASP.NET, utilizzato da un sito ad alto traffico.Modo corretto per connettersi a Cassandra in un'applicazione web/api

Ho fatto una semplice applicazione di esempio che si connette a un cassandra db usando le seguenti classi:

public class CassandraContext 
{ 
    private static ISession _session; 
    public ISession Session { get { return _session; } } 

    public CassandraContext() 
    { 
     var cluster = Cluster.Builder().AddContactPoint("cassandra.some.server").Build(); 
     _session = cluster.Connect("keyspace"); 
    } 
} 

E nel mio controller che sto utilizzando in questo modo:

public class TestController : ApiController 
{ 
    static CassandraContext db = new CassandraContext(); 

    public IHttpActionResult Get() 
    { 
     var result = new List<string>(); 
     var rowSet = db.Session.Execute(@"SELECT * FROM ""Test"";"); 

     foreach (var row in rowSet) 
      result.Add(row.GetValue<string>("data")); 

     return Ok<List<string>>(result); 
    } 
} 

Qualsiasi esempio, le informazioni saranno molto utili.

Grazie.

risposta

1

Penso che tu sia sulla strada giusta. Ecco quello che ho fatto in passato:

public class CassandraDAO 
{ 
    private Cluster cluster; 
    private Session session; 
    private String NODE = ABCServiceTester.Properties.Settings.Default.CASSANDRA_NODE; 
    private String USER = ABCServiceTester.Properties.Settings.Default.USERNAME; 
    private String PASS = ABCServiceTester.Properties.Settings.Default.PASSWORD; 

    public CassandraDAO() 
    { 
     connect(); 
    } 

    private void connect() 
    { 
     cluster = Cluster.Builder().WithCredentials(USER, PASS) 
      .AddContactPoint(NODE).Build(); 
     session = cluster.Connect(); 
    } 

    protected Session getSession() 
    { 
     if (session == null) 
     { 
      connect(); 
     } 

     return session; 
    } 
} 

Con i miei dettagli di connessione isolati nella mia classe CassandraDAO, ho poi scrivere DAO individuali per ogni spazio delle chiavi o area di funzionalità. Questi DAO ereditano quindi la classe CassandraDAO.

public class ProductsDAO : CassandraDAO 
{ 
    public List<Product> getProducts(string _itemID) 
    { 
     string strCQL = "SELECT priceAvail, productGroup, productSpec, sizeProfile " 
      + "FROM products.itemsmaster " 
      + "WHERE itemID=?"; 
     Session localSession = getSession(); 
     PreparedStatement statement = localSession.Prepare(strCQL); 
     BoundStatement boundStatement = new BoundStatement(statement); 
     boundStatement.Bind(_itemID); 

     //get result set from Cassandra 
     RowSet results = localSession.Execute(boundStatement); 

     List<Product> returnVal = new List<Product>(); 

     foreach (Row row in results.GetRows()) 
     { 
      Product tempProd = new Product(); 
      tempProd.itemID= _itemID; 
      tempProd.priceAvail = row.GetValue<int>("priceavail"); 
      tempProd.productGroup = row.GetValue<string>("productgroup"); 
      tempProd.productSpec = row.GetValue<string>("productspec"); 
      tempProd.sizeProfile = row.GetValue<string>("sizeprofile"); 

      returnVal.Add(tempProd); 
     } 

     return returnVal; 
    } 

Non c'è un sacco di codice DataStax ufficiale per C#. L'ho adattato da ciò che ho imparato prendendo la classe di sviluppo Java Cassandra su DataStax Academy. Ovviamente, non stavo facendo MVC in questo esempio, ma spero che aiuti.

+0

Quel codice sembra chiamerà ** Cluster.Bulder() ** e ** cluster.Connect() ** ogni volta che si accede a ProductsDAO - è tutto ok? – Martin

+0

Ho avuto in questo modo solo per cercare di tenerlo corto. All'interno di CassandraDAO, potresti avere un getter protetto per 'session', e chiamarlo' connect' solo se la sessione è nullo. Farò una modifica per riflettere questo. – Aaron

Problemi correlati