连接Cassandra的正确方式在web/api应用程序中是什么?

8

我正在寻找在高流量网站中使用官方Cassandra C#驱动程序(2.0)正确的方法,该驱动程序需要在ASP.NET Web API项目中使用。

我已经创建了一个非常简单的示例应用程序,使用以下类连接到Cassandra数据库:

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

在我的控制器中,我是这样使用它的:

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

任何的例子和信息都会非常有帮助。
谢谢。

你有没有更好的解决方案来连接.net到Cassandra? - Sebastian
1个回答

3

我认为你正在正确的方向上。以下是我过去所做的事情:

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

在我的CassandraDAO类中隔离了连接细节后,我为每个键空间或功能区编写单独的DAO。这些DAO然后继承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;
    }

目前没有太多官方的DataStax C#代码。我从参加DataStax Academy上的Cassandra Java开发课程中学到的内容进行了适应。显然,这个示例中我并没有使用MVC,但我希望它能有所帮助。


那段代码看起来每次访问ProductsDAO时都会调用Cluster.Builder()和cluster.Connect(),这样做可以吗? - Martin
我只是那样做是为了尝试保持简短。在CassandraDAO中,你可以有一个受保护的session getter,并且如果session为空,则调用connect。我会进行编辑以反映这一点。 - Aaron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接