# Java mit Cassandra verbinden



## Korvinus (3. Jan 2018)

Hallo,

ich habe die Aufgabe Daten aus Cassandra von unserem Server herauszuziehen.
Die Daten möchte ich später in Objekte speichern, vergleichen und bearbeiten.
Anschließend sollen die Daten wieder hochgeladen werden in Cassandra.
Die Sicherheitsrelevanten Daten habe ich mit xxx gekennzeichnet, 
aber sie funktionieren. Kollegen arbeiten damit ich.

import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Row;
import com.datastax.driver.core.Session;


class Import {

    public static void main(String[] args) {
        String serverIp = "xxx.xxx.xxx.xxx";
        String keyspace = "xxx";
        String user = "xxx";
        String password = "xxx";

        Session session;
        String cqlStatement;
        Cluster cluster = Cluster.builder()
                .addContactPoints(serverIp)
                .withCredentials(user, password)
                .build();

            session = cluster.connect(keyspace);

        cqlStatement = "SELECT * FROM lieferantendb";
        for (Row row : session.execute(cqlStatement)) {
            System.out.println(row.toString());
        }
    }
}

Ich bekomme allerdings folgende Fehlermeldungen:

"C:\Program Files\Java\jdk-9.0.1\bin\java" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\lib\idea_rt.jar=50967:C:\Program Files\JetBrains\IntelliJ IDEA 2017.3.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Users\Micha\IdeaProjects\Lieferantendatenbank\out\production\Lieferantendatenbank;C:\Program Files\Java\jdk-9.0.1\lib\src.zip;C:\Program Files\Java\jdk-9.0.1\lib\deploy.jar;C:\Program Files\Java\jdk-9.0.1\lib\javaws.jar;C:\Program Files\Java\jdk-9.0.1\lib\jrt-fs.jar;C:\Program Files\Java\jdk-9.0.1\lib\plugin.jar;C:\Program Files\Java\jdk-9.0.1\lib\java.jnlp.jar;C:\Program Files\Java\jdk-9.0.1\lib\ant-javafx.jar;C:\Program Files\Java\jdk-9.0.1\lib\javafx-swt.jar;C:\Program Files\Java\jdk-9.0.1\lib\jdk.deploy.jar;C:\Program Files\Java\jdk-9.0.1\lib\jdk.javaws.jar;C:\Program Files\Java\jdk-9.0.1\lib\jdk.plugin.jar;C:\Program Files\Java\jdk-9.0.1\lib\guava-16.0.1.jar;C:\Program Files\Java\jdk-9.0.1\lib\plugin-legacy.jar;C:\Program Files\Java\jdk-9.0.1\lib\jdk.plugin.dom.jar;C:\Program Files\Java\jdk-9.0.1\lib\slf4j-api-1.7.5.jar;C:\Program Files\Java\jdk-9.0.1\lib\slf4j-api-1.7.25.jar;C:\Program Files\Java\jdk-9.0.1\lib\slf4j-ext-1.7.25.jar;C:\Program Files\Java\jdk-9.0.1\lib\netty-3.9.0.Final.jar;C:\Program Files\Java\jdk-9.0.1\lib\metrics-core-3.0.2.jar;C:\Program Files\Java\jdk-9.0.1\lib\slf4j-jdk14-1.7.25.jar;C:\Program Files\Java\jdk-9.0.1\lib\jul-to-slf4j-1.7.25.jar;C:\Program Files\Java\jdk-9.0.1\lib\jcl-over-slf4j-1.7.25.jar;C:\Program Files\Java\jdk-9.0.1\lib\slf4j-migrator-1.7.25.jar;C:\Program Files\Java\jdk-9.0.1\lib\osgi-over-slf4j-1.7.25.jar;C:\Program Files\Java\jdk-9.0.1\lib\log4j-over-slf4j-1.7.25.jar;C:\Program Files\Java\jdk-9.0.1\lib\slf4j-api-1.7.25-sources.jar;C:\Program Files\Java\jdk-9.0.1\lib\slf4j-ext-1.7.25-sources.jar;C:\Program Files\Java\jdk-9.0.1\lib\slf4j-jcl-1.7.25-sources.jar;C:\Program Files\Java\jdk-9.0.1\lib\slf4j-nop-1.7.25-sources.jar;C:\Program Files\Java\jdk-9.0.1\lib\slf4j-jdk14-1.7.25-sources.jar;C:\Program Files\Java\jdk-9.0.1\lib\cassandra-driver-core-2.0.2.jar;C:\Program Files\Java\jdk-9.0.1\lib\jul-to-slf4j-1.7.25-sources.jar;C:\Program Files\Java\jdk-9.0.1\lib\slf4j-simple-1.7.25-sources.jar;C:\Program Files\Java\jdk-9.0.1\lib\slf4j-android-1.7.25-sources.jar;C:\Program Files\Java\jdk-9.0.1\lib\slf4j-log4j12-1.7.25-sources.jar;C:\Program Files\Java\jdk-9.0.1\lib\jcl-over-slf4j-1.7.25-sources.jar;C:\Program Files\Java\jdk-9.0.1\lib\osgi-over-slf4j-1.7.25-sources.jar;C:\Program Files\Java\jdk-9.0.1\lib\log4j-over-slf4j-1.7.25-sources.jar" Import
Jan. 03, 2018 10:31:19 VORM. com.datastax.driver.core.FrameCompressor$SnappyCompressor <clinit>
WARNUNG: Cannot find Snappy class, you should make sure the Snappy library is in the classpath if you intend to use it. Snappy compression will not be available for the protocol.
Jan. 03, 2018 10:31:19 VORM. com.datastax.driver.core.FrameCompressor$LZ4Compressor <clinit>
WARNUNG: Cannot find LZ4 class, you should make sure the LZ4 library is in the classpath if you intend to use it. LZ4 compression will not be available for the protocol.
Exception in thread "main" com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /127.0.0.1:9042 (com.datastax.driver.core.TransportException: [/127.0.0.1:9042] Cannot connect))
    at com.datastax.driver.core.ControlConnection.reconnectInternal(ControlConnection.java:196)
    at com.datastax.driver.core.ControlConnection.connect(ControlConnection.java:79)
    at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1104)
    at com.datastax.driver.core.Cluster.init(Cluster.java:121)
    at com.datastax.driver.core.Cluster.connect(Cluster.java:198)
    at com.datastax.driver.core.Cluster.connect(Cluster.java:226)
    at Import.main(Import.java:21)
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.jboss.netty.util.internal.ByteBufferUtil (file:/C:/Program%20Files/Java/jdk-9.0.1/lib/netty-3.9.0.Final.jar) to method java.nio.DirectByteBuffer.cleaner()
WARNING: Please consider reporting this to the maintainers of org.jboss.netty.util.internal.ByteBufferUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Process finished with exit code 1

Ich weiß nicht genau wo das Problem liegt.
Hat Jemand vielleicht eine Idee was ich machen soll?


----------



## olfibits (3. Jan 2018)

*WARNING: Please consider reporting this to the maintainers of org.jboss.netty.util.internal.ByteBufferUtil*
Sagt doch alles, oder?
Intern in dieser Bibliothek tritt ein Fehler auf. Und der soll den Entwicklern der genannten Package gemeldet werden, denke ich.


----------



## Korvinus (3. Jan 2018)

Ja, aber es kann ja nicht die Lösung sein einen Fehler an Entwickler eines Packages zu melden.
Das Programm muss ja irgendwie laufen. Wisst ihr vielleicht eine Alternative oder Workaround?
Ich habe auch gehört es kann mit inkompatiblen Versionen zusammen hängen.
Leider mache ich das zum ersten mal und weiß nicht genau was ich jetzt machen soll.


----------



## olfibits (3. Jan 2018)

OK, aber neben dem Fehler, der zu berichten wäre, gibt es noch 3 andere, die mir sofort ins Auge stechen.

*Jan. 03, 2018 10:31:19 VORM. com.datastax.driver.core.FrameCompressor$SnappyCompressor <clinit>
WARNUNG: Cannot find Snappy class, you should make sure the Snappy library is in the classpath if you intend to use it. Snappy compression will not be available for the protocol.*
Da stimmt irgendwas mit einem Classpath nicht.

*Jan. 03, 2018 10:31:19 VORM. com.datastax.driver.core.FrameCompressor$LZ4Compressor <clinit>
WARNUNG: Cannot find LZ4 class, you should make sure the LZ4 library is in the classpath if you intend to use it. LZ4 compression will not be available for the protocol.*
Hier dasselbe.

*Exception in thread "main" com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /127.0.0.1:9042 (com.datastax.driver.core.TransportException: [/127.0.0.1:9042] Cannot connect))*
Hier kann offensichtlich mit dem Server nicht verbunden werden. Hast du die richtigen Daten?


----------



## truesoul (3. Jan 2018)

Hallo. 

Ich sehe bei dir nur serverIp aber kein Port? 
Der Port in der Fehlermeldung *9042 *ist vermutlich nicht richtig. 

Grüße


----------



## Korvinus (3. Jan 2018)

Ja, die Daten sind korrekt, da mein Arbeitskollege mit seinem PHP-Skript auch mit diesen Daten zugreifen kann.
Der Server ist auch online und läuft. Mein Java-Programm bekommt allerdings keine Verbindung hin.

Ist das mein Classpath?
C:\Program Files\Java\jdk-9.0.1\lib


----------



## Korvinus (3. Jan 2018)

truesoul hat gesagt.:


> Hallo.
> 
> Ich sehe bei dir nur serverIp aber kein Port?
> Der Port in der Fehlermeldung *9042 *ist vermutlich nicht richtig.
> ...


Wo kann ich den Port einstellen? Wenn ich den Port einstelle mit xxx.xxx.xxx.xxxort funktioniert es auch nicht.
Die IP lautet auch nicht 127.0.0.1, sondern ist eine öffentliche IP-Adresse im Internet vom Server.


----------



## truesoul (3. Jan 2018)

Korvinus hat gesagt.:


> Wo kann ich den Port einstellen?




```
Cluster.builder().addContactPoint(serverIp).withPort(port).withCredentials(user, password).build();
```


----------



## olfibits (3. Jan 2018)

olfibits hat gesagt.:


> *WARNING: Please consider reporting this to the maintainers of org.jboss.netty.util.internal.ByteBufferUtil*
> Sagt doch alles, oder?
> Intern in dieser Bibliothek tritt ein Fehler auf. Und der soll den Entwicklern der genannten Package gemeldet werden, denke ich.


@truesoul
Wie verfahren wir damit denn am besten? Der Fehler existiert ja auch noch.


----------



## truesoul (3. Jan 2018)

olfibits hat gesagt.:


> @truesoul
> Wie verfahren wir damit denn am besten? Der Fehler existiert ja auch noch.



Gar nicht. Da die NoHostAvailableException wohl die Fehlerursache ist. 

Grüße


----------



## Korvinus (3. Jan 2018)

Der Host ist aber erreichbar. Ich habe jetzt auch den Port eingestellt.
Als Port habe ich eben mal die 7000 und die 9042 versucht.


----------



## truesoul (3. Jan 2018)

Und die Datenbank läuft auf deiner Maschine? 

Weil die IP 127.0.0.1 ist deine Maschine.


----------



## Korvinus (3. Jan 2018)

Nein, es läuft unter einer anderen IP-Adresse.
Wir haben einen Server auf den ich zugreifen möchte.
Das läuft momentan nicht lokal


----------



## truesoul (3. Jan 2018)

Na da hast du dein Problem.
Du solltest auch die IP verwenden wo die Cassandra auch läuft.


----------



## Korvinus (3. Jan 2018)

Tue ich ja. 185.48.xxx.57 ist die IP.
Ich kann die IP-Adresse auch anpingen.
Und wie gesagt bei Kollegen läuft die Verbindung mittels php

String serverIp = "185.48.xxx.57";
String keyspace = "xxx";
String user = "xxx";
String password = "xxx";

Session session;
String cqlStatement;
Cluster cluster = Cluster.builder().addContactPoint(serverIp).withPort(9042).withCredentials(user, password).build();


----------



## truesoul (3. Jan 2018)

Korvinus hat gesagt.:


> Exception in thread "main" com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /127.0.0.1:9042 (com.datastax.driver.core.TransportException: [/127.0.0.1:9042] Cannot connect))



Was mich aber wundert ist, dass in der Fehlermeldung speziell deine Maschine steht. 

Also da ich das Problem noch nicht so hatte, kann dir evtl. ein anderer helfen oder Google hilft. 

Sorry


----------



## Korvinus (3. Jan 2018)

truesoul hat gesagt.:


> Was mich aber wundert ist, dass in der Fehlermeldung speziell deine Maschine steht.
> 
> Also da ich das Problem noch nicht so hatte, kann dir evtl. ein anderer helfen oder Google hilft.
> 
> Sorry



Weil ich da mal was probiert hatte. Da steht immer die IP-Adresse, welche ich eingebe.
Aktuell die vom Server.


----------



## mrBrown (3. Jan 2018)

olfibits hat gesagt.:


> Wie verfahren wir damit denn am besten? Der Fehler existiert ja auch noch.


Der Fehler ist nur eine Warnung, die auch behoben wäre, wenn er entweder ein aktuelles netty oder Java 8 nutzen würde.


----------



## Korvinus (9. Jan 2018)

So ich habe jetzt nochmal von neu begonnen. Ich habe Ubuntu 16.04 mit Java8 und Intellij installiert.
Ich habe auch Cassandra installiert und zum laufen gebracht (lokal)
Kann mir Jemand eine Schritt für Schritt anleitung geben, was ich tun muss um:

*1. Cassandra einzurichten, sodass ich eine Testdatenbank habe
2. In IntelliJ mittels Java auf Cassandra zugreifen zu können um Daten zu ziehen
3. Diese Daten dann in Java bearbeitn zu können.*

=======================================
*Muss ich folgendes irgendwo einbinden? Wenn ja wie?*
=======================================
<dependency>
  <groupId>com.datastax.cassandra</groupId>
  <artifactId>cassandra-driver-core</artifactId>
  <version>3.3.0</version>
</dependency>

Note that the object mapper is published as a separate artifact:

Copy
<dependency>
  <groupId>com.datastax.cassandra</groupId>
  <artifactId>cassandra-driver-mapping</artifactId>
  <version>3.3.0</version>
</dependency>

The ‘extras’ module is also published as a separate artifact:

Copy
<dependency>
  <groupId>com.datastax.cassandra</groupId>
  <artifactId>cassandra-driver-extras</artifactId>
  <version>3.3.0</version>
</dependency>
=======================================
*Was ist Maven? Was hat das mit Maven zutun?*
=======================================

=======================================
*Wie kann ich die imports machen? Bisher hat er die Daten nie gefunden*
=======================================
*import com.datastax.driver.core.Cluster;*
*import com.datastax.driver.core.Host;*
*import com.datastax.driver.core.Metadata;*
*import com.datastax.driver.core.Session;*

Später möchte ich natürlich immernoch Daten vom richtigen Ubuntu Server mit Cassandra Daten abgreifen.
Nur ich wollte erstmal schauen wie das Ganze lokal funktioniert.


----------

