繁体   English   中英

查询Cassandra DB的结果

[英]Query results of Cassandra DB

我正在创建一个基于Cassandra的Web应用程序:到目前为止使用Play Framework。 我通过Java驱动程序与Cassandra连接但是如何将查询结果嵌入到我的前端? 详细信息:我有一个用户列系列,并希望在我的页面上显示所有用户。 有没有选项可以在HTML或JavaScript中嵌入查询结果? 或者还有其他方法常见吗?

在此先感谢并欢呼!

典型的方法是从可以动态构建它们的服务器提供您的网页。 java的一个例子是提供最初由服务器处理的jsp模板的页面(例如tomcat或glassfish),这些页面被处理成html。

所以像这样:

backend java queries cassandra (SELECT * FROM users)
  -> passes results to jsp
    -> jsp gets processed into html by server
      -> server sends html to user.

用于演示cassandra的Web应用程序是一个如何使用C *构建twitter克隆的示例。 此repo显示了如何使用java和cassandra来提供网页。

播放使用“Twirl”作为模板引擎。 当然,您可以将其更改为使用您喜欢的任何一个。 最简单的输出仍然是纯文本。

你使用Play和Cassandra。 它们都是为异步编程而创建的。 所以最有效的方法是利用这种能力。

还有一点 - 你打算打印所有用户,这意味着结果可能很大。 更好的方法是通过块打印,如视频流,其他方式,结果可能是如此巨大,以至于服务器内存可能不足以同时为少量请求。

我编写了一个简单的“单功能”解决方案,以便于理解。 最好将它拆分为真实程序。

package controllers;

import play.*;
import play.mvc.*;

import views.html.*;

import java.io.StringWriter;
import java.io.PrintWriter;

import com.google.common.util.concurrent.FutureCallback;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.MoreExecutors;

import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.ResultSet;
import com.datastax.driver.core.ResultSetFuture;

public class Application extends Controller {

  public Result users(){
    // Cassandra connection information.
    String node = "localhost";
    int port = 9042;

    // Connect to the cassandra.
    Cluster cluster = Cluster.builder()
      .addContactPoint(node)
      .withPort(port)
      .build();
    Session session = cluster.connect();

    // Prepare output.
    Chunks<String> chunks = new StringChunks() {
            public void onReady(Chunks.Out<String> out) {

        // Query data from the cassandra.
        String query = "SELECT * FROM mykeyspace.users";

        // Do asynchronious query to the cassandra.
        ResultSetFuture resultSet = session.executeAsync(query);
        Futures.addCallback(resultSet,
          new FutureCallback<ResultSet>() {
            @Override
            public void onSuccess(ResultSet set) {
              try {
                // This cycle asynchronious as well.
                // It will fetch some data, then process it, then fetch more
                // All this done by cassandra driver
                set.forEach(row -> {
                        // Just plain text. You can output JSON as well.
                        out.write(row.toString());
                        out.write("\n");
                });
              } finally {
                out.close();
              }
            }

            @Override
            public void onFailure(Throwable t) {
                StringWriter sw = new StringWriter();
                t.printStackTrace(new PrintWriter(sw));
                out.write(sw.toString());
                out.close();
            }
          }, MoreExecutors.sameThreadExecutor());

            }
        };

    return ok(chunks);
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM