【问题标题】:Query results of Cassandra DBCassandra DB的查询结果
【发布时间】:2015-08-29 15:15:43
【问题描述】:

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

在此先感谢并欢呼!

【问题讨论】:

    标签: javascript java html cassandra playframework-2.0


    【解决方案1】:

    典型的方法是通过可以动态构建网页的服务器为您的网页提供服务。 Java 的一个示例是提供页面,这些页面最初是由您的服务器(例如 tomcat 或 glassfish)处理的 jsp 模板,这些模板被处理成 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 克隆的示例。 This repo 展示了如何使用 java 和 cassandra 来提供网页服务。

    【讨论】:

    • 感谢您的回复。我可以直接在 Play Framework 结构中使用这种方法吗?或者在Play中使用JSP有什么问题吗?
    • @Messy 是的,您只需将 cassandra java 驱动程序添加到您的依赖项中(我推荐 datastax's driver,它现在被认为是行业标准)。然后您可以将查询嵌入到您的 java 代码中。
    【解决方案2】:

    Play 使用“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);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-12
      • 1970-01-01
      • 2016-01-11
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 2021-10-20
      相关资源
      最近更新 更多