首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cassandra单节点连接错误

cassandra单节点连接错误
EN

Stack Overflow用户
提问于 2015-01-15 21:14:14
回答 2查看 2.9K关注 0票数 0

我试图使用卡桑德拉作为数据库的应用程序,我正在工作。这个应用程序是一个Netbeans平台应用程序。为了在本地主机上启动cassandra服务器,我发出Runtime.getRuntime().exec(命令),其中命令是启动cassandra服务器的字符串,然后用datastax驱动程序连接到cassandra服务器。然而,我得到了错误:

代码语言:javascript
复制
com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query   failed (tried: /127.0.0.1:9042 (com.datastax.driver.core.TransportException: [/127.0.0.1:9042]  Cannot connect))
at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:199)
at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:80)
at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1154)
at com.datastax.driver.core.Cluster.getMetadata(Cluster.java:318)
at org.dhviz.boot.DatabaseClient.connect(DatabaseClient.java:43)
at org.dhviz.boot.Installer.restored(Installer.java:67)
....

我发现服务器需要一些时间来启动,所以我增加了行Thread.sleep(MAX_DELAY_SERVER),这似乎解决了问题。

有什么更好的方法来解决这个问题吗?谢谢。

密码在下面。

代码语言:javascript
复制
public class Installer extends ModuleInstall {

private final int MAX_DELAY_SERVER = 12000;

//private static final String pathSrc = "/org/dhviz/resources";
@Override
public void restored() {

    /*
     -*-*-*-*-*DESCRIPTION*-*-*-*-*-*
     IMPLEMENT THE CASSANDRA DATABASE
     *********************************
     */
    DatabaseClient d = new DatabaseClient();
    // launch an instance of the cassandra server 
    d.loadDatabaseServer();


    /*wait for MAX_DELAY_SERVER milliseconds before launching the other instructions. 
    */
    try {
        Thread.sleep(MAX_DELAY_SERVER);
        Logger.getLogger(Installer.class.getName()).log(Level.INFO, "wait for MAX_DELAY_SERVER milliseconds before the connect database");
    } catch (InterruptedException ex) {
        Exceptions.printStackTrace(ex);
        Logger.getLogger(Installer.class.getName()).log(Level.INFO, "exeption in thread sleep");
    }

    d.connect("127.0.0.1");

}
}



public class DatabaseClient {

private Cluster cluster;
private Session session;
private ShellCommand shellCommand;
private final String defaultKeyspace = "dhviz";

final private String LOAD_CASSANDRA = "launchctl load    /usr/local/Cellar/cassandra/2.1.2/homebrew.mxcl.cassandra.plist";

final private String UNLOAD_CASSANDRA = "launchctl unload /usr/local/Cellar/cassandra/2.1.2/homebrew.mxcl.cassandra.plist";

public DatabaseClient() {
    shellCommand = new ShellCommand();

}

public void connect(String node) {
//this connect to the cassandra database

    cluster = Cluster.builder()
            .addContactPoint(node).build();
//  cluster.getConfiguration().getSocketOptions().setConnectTimeoutMillis(12000);
    Metadata metadata = cluster.getMetadata();
    System.out.printf("Connected to cluster: %s\n",
            metadata.getClusterName());
    for (Host host
            : metadata.getAllHosts()) {
        System.out.printf("Datatacenter: %s; Host: %s; Rack: %s\n",
                host.getDatacenter(), host.getAddress(), host.getRack());

    }

        session = cluster.connect();


    Logger.getLogger(DatabaseClient.class.getName()).log(Level.INFO, "connected to server");
}

public void loadDatabaseServer() {
    if (shellCommand == null) {

        shellCommand = new ShellCommand();

    }
    shellCommand.executeCommand(LOAD_CASSANDRA);
    Logger.getLogger(DatabaseClient.class.getName()).log(Level.INFO, "database cassandra loaded");
}

public void unloadDatabaseServer() {
    if (shellCommand == null) {

        shellCommand = new ShellCommand();

    }

    shellCommand.executeCommand(UNLOAD_CASSANDRA);

    Logger.getLogger(DatabaseClient.class.getName()).log(Level.INFO, "database cassandra unloaded");
}

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-15 21:56:33

如果您调用卡桑德拉没有任何参数在Runtime.getRuntime().exec(command),这很可能是产卵卡桑德拉作为一个背景进程,并返回之前,卡桑德拉节点已完全启动,并正在监听。

我不知道您为什么要在应用程序中嵌入cassandra,但是您可能会发现使用卡桑德拉-单位可以提供一种在应用程序中嵌入cassandra的机制。它主要用于运行需要cassandra实例的测试,但也可能满足您的用例。

维基提供了一个有用的示例,说明如何使用cassandra单元启动嵌入式cassandra实例:

代码语言:javascript
复制
EmbeddedCassandraServerHelper.startEmbeddedCassandra();

根据我的经验,卡桑德拉单元将等到服务器启动并监听后再返回。您还可以使用与这个答案相反的逻辑,编写一个等待套接字使用的方法。

票数 1
EN

Stack Overflow用户

发布于 2015-01-30 11:29:30

我已经从下面的答案中获取灵感,将代码更改为以下内容。谢谢你的帮忙!

代码语言:javascript
复制
cluster = Cluster.builder()
            .addContactPoint(node).build();

    cluster.getConfiguration().getSocketOptions().setConnectTimeoutMillis(50000);

    boolean serverConnected = false;
    while (serverConnected == false) {
        try {
            try {
                Thread.sleep(MAX_DELAY_SERVER);

            } catch (InterruptedException ex) {
                Exceptions.printStackTrace(ex);
            }
            cluster = Cluster.builder()
                    .addContactPoint(node).build();

            cluster.getConfiguration().getSocketOptions().setConnectTimeoutMillis(50000);
            session = cluster.connect();
            serverConnected = true;

        } catch (NoHostAvailableException ex) {
            Logger.getLogger(DatabaseClient.class.getName()).log(Level.INFO, "trying connection to cassandra server...");
            serverConnected = false;
        }

    }                                                   
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27973103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档