2013-10-11 4 views
0

Я использую cassandra1.2 с datastax Java клиента 1.0.3 Использование образцов для клиента Java от datastax я создал класс, который будет возвращать мне сеансполучение NullPointer исключение в datastax

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 { 
      } 
     } 
    } 
} 

I используйте функцию getDatastaxSession, чтобы получить сеанс и сделать одну вставку в базе данных. Первые несколько вставок работает нормально, но через некоторое время я получаю 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) 

Это исключение из-за сессии является нулевым/timedout? Пожалуйста, дайте мне знать, если я создаю или управляю сессией неправильно. Или, пожалуйста, сообщите мне, есть ли какие-либо проблемы с моим кодом.

+0

Я запускаю это на VertX 2.0.0, который является однопоточным – user2681607

ответ

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 { 
     } 
    } 
} 

Теперь каждый раз, когда я создаю сессионный = cluster.session для каждого запроса и завершение сеанса после того, как вся обработка делается.

Я думаю, что раньше, когда я получал сессию один раз и пытался ее использовать снова, через некоторое время был тайм-аут, когда когда-либо сессия оставалась бездействующей, когда-то приводила к исключению Правильно ли это, чтобы реализовать сеанс для Драйвер datastax java? Спасибо за любые комментарии и обратная связь

Смежные вопросы