0

datastax Java クライアント 1.0.3 で cassandra1.2 を使用しています 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 関数を使用してセッションを取得し、データベースに 1 回挿入します。最初のいくつかの挿入は正常に機能しますが、しばらくすると、以下に示すように nullpointer 例外が発生します。

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 が null/timedout であるためですか? セッションを間違った方法で作成または管理している場合はお知らせください。または、私のコードに問題がある場合はお知らせください。

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 に答える