首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取datastax中的nullpointer异常

获取datastax中的nullpointer异常
EN

Stack Overflow用户
提问于 2013-10-11 13:58:01
回答 1查看 1.7K关注 0票数 0

我正在使用cassandra1.2和datastax java client 1.0.3使用来自datastax的java客户端的示例我已经创建了一个类,它将返回会话

代码语言:javascript
复制
public class DataStaxPlugin {

    public static final Logger LOGGER = Logger.getLogger(DataStaxPlugin.class.getName());
    private static Cluster cluster;
    private static Session session = null;
    private static String node;
    private static String port;
    private static DataStaxPlugin instance = null;

    protected DataStaxPlugin() {
        // Exists only to defeat instantiation.
    }

    public void connect() {
        node = ReadPropertiesFile.getProperty("db.server.name");
        port = ReadPropertiesFile.getProperty("db.server.port");

        LOGGER.debug("Connecting to DB server: " + node);
        LOGGER.debug("port: " + port);

        cluster = Cluster.builder().withPort(Integer.parseInt(port))
                .addContactPoint(node).build();

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

    }

    public void close() {
        cluster.shutdown();
    }

    public static Session getDataStaxSession() {
        synchronized (DataStaxPlugin.class) {
            try {
                if (instance == null) {
                    instance = new DataStaxPlugin();
                    instance.connect();
                }

                return session;
            } finally {
            }
        }
    }
}

我使用getDatastaxSession函数获取会话并在数据库中执行一次插入操作。最初的几个插入工作正常,但过了一段时间后,我得到了空指针异常,如下所示:

代码语言:javascript
复制
Exception in thread "Cassandra Java Driver worker-5" java.lang.NullPointerException
    at com.datastax.driver.core.Connection$Future.onException(Connection.java:602)
    at     com.datastax.driver.core.RequestHandler.setFinalException(RequestHandler.java:219)
    at com.datastax.driver.core.RequestHandler.sendRequest(RequestHandler.java:103)
    at com.datastax.driver.core.RequestHandler$1.run(RequestHandler.java:170)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:724)

此异常是由于会话为null/timedout所致吗?如果我以错误的方式创建或管理会话,请让我知道。或者,如果我的代码有任何问题,请告诉我。

EN

回答 1

Stack Overflow用户

发布于 2013-10-11 17:21:07

我对获取会话的代码进行了更改

代码语言:javascript
复制
public void connect() {
    node = ReadPropertiesFile.getProperty("db.server.name");
    port = ReadPropertiesFile.getProperty("db.server.port");

    LOGGER.debug("Connecting to DB server: " + node);
    LOGGER.debug("port: " + port);

    cluster = Cluster.builder().withPort(Integer.parseInt(port))
    .addContactPoint(node).build();

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


}

public void close() {
    cluster.shutdown();
}


public static Session getDataStaxSession() {
    synchronized (DataStaxPlugin.class) {
        try {
            if(instance == null)
            {
                instance = new DataStaxPlugin();
                instance.connect();
            } 
            session = cluster.connect();        
            return session;
        } finally {
        }
    }
}


public static void closeDataStaxSession() {
    synchronized (DataStaxPlugin.class) {
        try {
            if(session != null)
            {
                session.shutdown();
                session = null;
            }
        } finally {
        }
    }
}

现在,每次我为每个请求创建一个session=cluster.session,并在所有处理完成后关闭会话。

我想以前当我获取会话并试图再次使用它时,在一段时间后,当会话空闲了一段时间后导致异常,这是为Datastax java驱动程序实现会话的正确方式吗?感谢您的评论和反馈

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

https://stackoverflow.com/questions/19311210

复制
相关文章

相似问题

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