0

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

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 函数来获取会话并在数据库中进行一次插入。前几个插入工作正常,但一段时间后我得到空指针异常,如下所示:

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)

此异常是否由于 Session 为空/超时?如果我以错误的方式创建或管理会话,请告诉我。或者,如果我的代码有任何问题,请告诉我。

4

1 回答 1

0

我已经更改了获取会话的代码

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 驱动程序实现会话的正确方法吗?感谢您的任何评论和反馈

于 2013-10-11T09:21:06.507 回答