Pengantar Driver Java DataStax untuk Apache Cassandra

1. Ikhtisar

Distribusi DataStax Apache Cassandra adalah database terdistribusi siap produksi, kompatibel dengan Cassandra sumber terbuka. Ia menambahkan beberapa fitur yang tidak tersedia dalam distribusi open-source, termasuk pemantauan, peningkatan batch, dan pemrosesan data streaming.

DataStax juga menyediakan klien Java untuk distribusinya Apache Cassandra. Driver ini sangat mudah disetel dan dapat memanfaatkan semua fitur tambahan dalam distribusi DataStax, namun juga kompatibel sepenuhnya dengan versi sumber terbuka.

Dalam tutorial ini, kita akan melihat bagaimana menggunakan DataStax Java Driver untuk Apache Cassandra untuk terhubung ke database Cassandra dan melakukan manipulasi data dasar.

2. Ketergantungan Maven

Untuk menggunakan Driver Java DataStax untuk Apache Cassandra, kita perlu memasukkannya ke dalam classpath kita.

Dengan Maven, kita hanya perlu menambahkan dependensi java-driver-core ke pom.xml kita :

 com.datastax.oss java-driver-core 4.1.0   com.datastax.oss java-driver-query-builder 4.1.0 

3. Menggunakan Driver DataStax

Sekarang kita sudah memiliki drivernya, mari kita lihat apa yang bisa kita lakukan dengannya.

3.1. Hubungkan ke Database

Untuk bisa terhubung ke database, kita akan membuat CqlSession :

CqlSession session = CqlSession.builder().build();

Jika kita tidak secara eksplisit mendefinisikan titik kontak apa pun, pembuatnya akan secara default ke 127.0.0.1:9042 .

Mari buat kelas konektor, dengan beberapa parameter yang dapat dikonfigurasi, untuk membuat CqlSession :

public class CassandraConnector { private CqlSession session; public void connect(String node, Integer port, String dataCenter) { CqlSessionBuilder builder = CqlSession.builder(); builder.addContactPoint(new InetSocketAddress(node, port)); builder.withLocalDatacenter(dataCenter); session = builder.build(); } public CqlSession getSession() { return this.session; } public void close() { session.close(); } }

3.2. Buat Keyspace

Sekarang kita memiliki koneksi ke database, kita perlu membuat ruang kunci kita. Mari kita mulai dengan menulis kelas repositori sederhana untuk bekerja dengan ruang kunci kita.

Untuk tutorial ini, kami akan menggunakan strategi replikasi SimpleStrategy dengan jumlah replika yang disetel ke 1 :

public class KeyspaceRepository { public void createKeyspace(String keyspaceName, int numberOfReplicas) { CreateKeyspace createKeyspace = SchemaBuilder.createKeyspace(keyspaceName) .ifNotExists() .withSimpleStrategy(numberOfReplicas); session.execute(createKeyspace.build()); } // ... }

Juga, kita dapat mulai menggunakan ruang kunci di sesi saat ini :

public class KeyspaceRepository { //... public void useKeyspace(String keyspace) { session.execute("USE " + CqlIdentifier.fromCql(keyspace)); } }

3.3. Buat tabel

Driver memberikan pernyataan untuk mengkonfigurasi dan menjalankan kueri dalam database. Misalnya, kita dapat mengatur ruang kunci untuk digunakan secara individual di setiap pernyataan .

Kami akan menentukan model Video dan membuat tabel untuk mewakilinya:

public class Video { private UUID id; private String title; private Instant creationDate; // standard getters and setters }

Mari buat tabel kita, memiliki kemungkinan untuk mendefinisikan ruang kunci di mana kita ingin melakukan kueri. Kami akan menulis kelas VideoRepository sederhana untuk bekerja dengan data video kami:

public class VideoRepository { private static final String TABLE_NAME = "videos"; public void createTable() { createTable(null); } public void createTable(String keyspace) { CreateTable createTable = SchemaBuilder.createTable(TABLE_NAME) .withPartitionKey("video_id", DataTypes.UUID) .withColumn("title", DataTypes.TEXT) .withColumn("creation_date", DataTypes.TIMESTAMP); executeStatement(createTable.build(), keyspace); } private ResultSet executeStatement(SimpleStatement statement, String keyspace) { if (keyspace != null) { statement.setKeyspace(CqlIdentifier.fromCql(keyspace)); } return session.execute(statement); } // ... }

Perhatikan bahwa kami membebani metode createTable .

Ide di balik membebani metode ini adalah memiliki dua opsi untuk pembuatan tabel:

  • Buat tabel di ruang kunci tertentu, dengan mengirimkan nama ruang kunci sebagai parameter, terlepas dari ruang kunci mana yang sedang digunakan sesi
  • Mulai gunakan ruang kunci dalam sesi, dan gunakan metode untuk pembuatan tabel tanpa parameter apa pun - dalam hal ini, tabel akan dibuat di ruang kunci yang saat ini digunakan sesi

3.4. Sisipkan Data

Selain itu, pengemudi memberikan pernyataan yang disiapkan dan dibatasi.

The PreparedStatement biasanya digunakan untuk query dieksekusi sering, dengan perubahan hanya dalam nilai-nilai.

Kita dapat mengisi PreparedStatement dengan nilai yang kita butuhkan. Setelah itu, kami akan membuat BoundStatement dan menjalankannya.

Mari tulis metode untuk memasukkan beberapa data ke dalam database:

public class VideoRepository { //... public UUID insertVideo(Video video, String keyspace) { UUID videoId = UUID.randomUUID(); video.setId(videoId); RegularInsert insertInto = QueryBuilder.insertInto(TABLE_NAME) .value("video_id", QueryBuilder.bindMarker()) .value("title", QueryBuilder.bindMarker()) .value("creation_date", QueryBuilder.bindMarker()); SimpleStatement insertStatement = insertInto.build(); if (keyspace != null) { insertStatement = insertStatement.setKeyspace(keyspace); } PreparedStatement preparedStatement = session.prepare(insertStatement); BoundStatement statement = preparedStatement.bind() .setUuid(0, video.getId()) .setString(1, video.getTitle()) .setInstant(2, video.getCreationDate()); session.execute(statement); return videoId; } // ... }

3.5. Data Kueri

Sekarang, mari tambahkan metode yang membuat kueri sederhana untuk mendapatkan data yang telah kita simpan di database:

public class VideoRepository { // ... public List selectAll(String keyspace) { Select select = QueryBuilder.selectFrom(TABLE_NAME).all(); ResultSet resultSet = executeStatement(select.build(), keyspace); List result = new ArrayList(); resultSet.forEach(x -> result.add( new Video(x.getUuid("video_id"), x.getString("title"), x.getInstant("creation_date")) )); return result; } // ... }

3.6. Menyatukan Semuanya

Terakhir, mari kita lihat contoh penggunaan setiap bagian yang telah kita bahas dalam tutorial ini:

public class Application { public void run() { CassandraConnector connector = new CassandraConnector(); connector.connect("127.0.0.1", 9042, "datacenter1"); CqlSession session = connector.getSession(); KeyspaceRepository keyspaceRepository = new KeyspaceRepository(session); keyspaceRepository.createKeyspace("testKeyspace", 1); keyspaceRepository.useKeyspace("testKeyspace"); VideoRepository videoRepository = new VideoRepository(session); videoRepository.createTable(); videoRepository.insertVideo(new Video("Video Title 1", Instant.now())); videoRepository.insertVideo(new Video("Video Title 2", Instant.now().minus(1, ChronoUnit.DAYS))); List videos = videoRepository.selectAll(); videos.forEach(x -> LOG.info(x.toString())); connector.close(); } }

Setelah kami menjalankan contoh kami, sebagai hasilnya, kami dapat melihat di log bahwa data disimpan dengan benar di database:

INFO com.baeldung.datastax.cassandra.Application - [id:733249eb-914c-4153-8698-4f58992c4ad4, title:Video Title 1, creationDate: 2019-07-10T19:43:35.112Z] INFO com.baeldung.datastax.cassandra.Application - [id:a6568236-77d7-42f2-a35a-b4c79afabccf, title:Video Title 2, creationDate: 2019-07-09T19:43:35.181Z]

4. Kesimpulan

Dalam tutorial ini, kami membahas konsep dasar Driver Java DataStax untuk Apache Cassandra. Kami terhubung ke database dan membuat ruang kunci dan tabel. Selain itu, kami memasukkan data ke dalam tabel dan menjalankan kueri untuk mengambilnya kembali.

Seperti biasa, kode sumber untuk tutorial ini tersedia di Github.