Эффективный способ подключения к базе данных Cassandra с помощью клиента Pelops
Я работаю над проектом, в котором мне нужно использовать Cassandra Database
, У меня есть пример программы, которая будет заполнять данные в Cassandra database
, я использую Pelops client
для этого.
Так что теперь я думаю сделать Singleton class
за Cassandra database
это сделает связь с Cassandra database
а потом я использую этот экземпляр из Singelton class
в мой CassandraDAO
вставить в базу данных Cassandra и получить данные из базы данных Cassandra.
Ниже мой класс Singleton, который я построил до сих пор, который будет подключаться к базе данных Cassandra-
public class CassandraConnection {
private static CassandraConnection _instance;
private String keyspace;
private String[] seeds;
private int port;
private String poolName;
public static synchronized CassandraConnection getInstance() {
if (_instance == null) {
_instance = new CassandraConnection();
}
return _instance;
}
private CassandraConnection() {
setKeyspace(ICassandraDo.KEYSPACE_NAME);
setSeeds(ICassandraDo.NODES).split(",");
setPort(ICassandraDo.CASSANDRA_PORT);
setPoolName(ICassandraDo.THRIFT_CONNECTION_POOL);
createPool();
}
//This is the right way to `addPool` in pelops?
private void createPool() {
Pelops.addPool(getPoolName(), getSeeds(), getPort(),
false, getKeyspace(), new Policy());
}
private String setSeeds(String nodes) {
// I am not sure what I am supposed to do here?
// Any guidance will be of great help
}
private void setPoolName(String thriftConnectionPool) {
this.poolName = thriftConnectionPool;
}
private void setPort(int cassandraPort) {
this.port = cassandraPort;
}
private void setKeyspace(String keyspaceName) {
this.keyspace = keyspaceName;
}
public void setSeeds(String[] seeds) {
this.seeds = seeds;
}
public String[] getSeeds() {
return seeds;
}
public int getPort() {
return port;
}
public String getKeyspace() {
return keyspace;
}
public String getPoolName() {
return poolName;
}
}
Постановка задачи:-
У меня мало сомнений в моем коде выше.
- Во-первых, что я должен делать в
setSeeds
метод в моем классе выше? Любые указатели или примеры будут очень полезны. - Во-вторых, я не уверен, что это правильный способ сделать это, когда я создаю класс Singleton? Мне интересно, каков наилучший подход для управления соединением кластера с клиентом pelops.
- А также, что является лучшим способом использования
addPool
метод в моем коде выше? Думаю, я что-то там тоже испортил? Как я продолжаю видеть разныеaddPool
методы вPelops class
? Итак, какой метод я должен использовать, помня об этом, так как я буду использовать его в производственной среде.
И после того, как вышеупомянутый класс Singleton будет готов, я планирую использовать вышеупомянутый класс в моем DAO
код, что-то вроде этого
Mutator mutator = Pelops.createMutator(CassandraConnection.getInstance().getPoolName());
mutator.writeColumns(other data inside)
;
А затем сделайте селектор для извлечения данных.
Просто к вашему сведению, я работаю с Cassandra 1.2.3
а также Scale 7 pelops client
,
Любая помощь будет оценена. Заранее спасибо.
Обновленный код: -
Ниже мой обновленный код.
public class CassandraConnection {
private static CassandraConnection _instance;
private String keyspace;
private String[] nodes;
private int port;
private String poolName;
public static synchronized CassandraConnection getInstance() {
if (_instance == null) {
_instance = new CassandraConnection();
}
return _instance;
}
private CassandraConnection() {
setKeyspace(ICassandraDo.KEYSPACE_NAME);
setNodes(ICassandraDo.NODES);
setPort(ICassandraDo.CASSANDRA_PORT);
setPoolName(ICassandraDo.THRIFT_CONNECTION_POOL);
createPool();
}
private void createPool() {
Pelops.addPool(getPoolName(), getCluster(), getKeyspace());
}
private Cluster getCluster() {
Config casconf = new Config(ICassandraDo.CASSANDRA_PORT, true, 0);
Cluster cluster= new Cluster(nodes, casconf, ICassandraDo.NODE_DISCOVERY);
return cluster;
}
private void setPoolName(String thriftConnectionPool) {
this.poolName = thriftConnectionPool;
}
private void setPort(int cassandraPort) {
this.port = cassandraPort;
}
private void setKeyspace(String keyspaceName) {
this.keyspace = keyspaceName;
}
private void setNodes(String nodes) {
this.nodes = nodes.split(",");
}
public int getPort() {
return port;
}
public String getKeyspace() {
return keyspace;
}
public String getPoolName() {
return poolName;
}
}
Просто к сведению, в моем случае у меня будет два кластера с 12 узлами в каждом.
Может кто-нибудь взглянуть и дать мне знать, что я все правильно понял? Спасибо за помощь.
1 ответ
Узлы семян - это два (или более, но 2 - это рекомендуемое число из документации Cassandra) вашего кластера. В каждом файле конфигурации узла cassandra (cassandra.yaml) есть адрес начальных узлов для кластера. Представьте, что у вас есть кластер из 5 узлов
192.168.1.100 192.168.1.101 192.168.1.102 192.168.1.103 192.168.1.104
в каждом файле конфигурации будет, например,
Семена 192.168.1.101 192.168.1.103
Для этого кластера эти 2 адреса являются начальными узлами. Каждый узел кластера при запуске свяжется с этими 2 узлами и получит необходимую информацию. В вашем примере вы можете передать адреса, найденные в конфигурации, или просто пару адресных узлов кластера.
String[] nodes = new String[2];
nodes[1] = "192.168.1.101";
nodes[2] = "192.168.1.103";
2) Синглтон абсолютно не нужен, поскольку класс Pelops состоит только из статических элементов. Если у вас есть Init/Startup в вашем приложении, просто объявите там соединение с Cassandra, и оно будет доступно во всем вашем коде
3) Правильного ответа нет, правильный способ подключения к кластеру зависит от кластера. Возможно, вам придется установить свои пользовательские параметры или оставить один от Pelops. В моей рабочей среде (5 узлов, RF=3) я использую параметры по умолчанию без проблем.
Чао