我正在使用cassandra1.2和datastax java client 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)此异常是由于会话为null/timedout所致吗?如果我以错误的方式创建或管理会话,请让我知道。或者,如果我的代码有任何问题,请告诉我。
发布于 2013-10-11 17:21:07
我对获取会话的代码进行了更改
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驱动程序实现会话的正确方式吗?感谢您的评论和反馈
https://stackoverflow.com/questions/19311210
复制相似问题