Showing posts with label NoSQL. Show all posts
Showing posts with label NoSQL. Show all posts

Sunday, July 1, 2018

Spring boot + Cassandra



Pengenalan Cassandra

Cassandra atau lengkapnya Apache Cassandra adalah salah satu produk open source yang dirancang untuk menangani jumlah data yang sangat besar yang tersebar di banyak, Cassandra merupakan salah satu implementasi dari NoSQL, sedangkan NoSQL merupakan  konsep penyimpanan database dinamis yang tidak terikat pada relasi-relasi tabel yang kaku seperti RDBMS.

Sejarah Cassandra
1. Cassandra dikembangkan di Facebook untuk daya fitur Inbox Pencarian ( Jeff Hammerbacher).
2. Opensource oleh Facebook pada tahun 2008.
3. Menjadi Apache incubator proyek di tahun 2009
4. Dan Facebook ditinggalkan Cassandra pada akhir 2010 ketika mereka membangun Facebook platform Messaging pada HBase.

Nah mungkin saat ini banyak NoSQL yang opensourc sama juga seperti Cassandra berikut ini adalah beberapa fitur database Cassandra :
1. Elastic Scalability
2. Penyimpanan data yang fleksibel 
3. Distribusi data yang mudah
4. Menulis cepat

Makin bingung kan ? kapan kita menggunkan cassandra dan kapan kita menggunakan MongoDB . nah mungkin beberapa perbandingannya bisa kita cek di bawah ini :
Menurut saya cassandra lebih mudah jika kita terbiasa menggunakan database SQL karna query database cassandra yang di sebut CQL itu querynya hampir sama dengan query SQL, waah hehe .... berbeda dengan query MongoDB yang sangat berbeda dengan query SQL.

Kembali ke tema kita yaitu spring boot + cassandra, nah skrng kita mulai project spring bootnya .
1. Siapkan project spring-boot
2. Instal Cassandra, bisa melalui datastax
Tambahkan dependency cassandra di project Spring kita :

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-cassandra</artifactId>
</dependency>

kemudian buka datastaxnya kita buat keyspace(bisa di sebut juga sebagai nama databasenya/schema) dan buka cassandra CQL Shell


Kita buat Keyspacenya :
CREATE KEYSPACE toko WITH replication = {‘class’:’SimpleStrategy’,’replication_factor’:1};
Configurasi di project spring : application.properties

spring.data.cassandra.keyspace-name=test_cassandra
spring.data.cassandra.contact-points=localhost
spring.data.cassandra.port=9042

nah untuk kali ini kita mencoba fitur MAP di cassandra, buat domain seperti berikut:


kita buat attribute imageurl sebagai MAP

kemudian untuk repositorynya kita gunakan CQL ,
query CQL insert :
INSERT INTO produk(kode,description,imageurl,price) values(:kode,:description,:imageurl,:price)

Dan ini query CQL update :
UPDATE produk SET description = :description,price = :price,imageurl = imageurl + :imageurl where kode=:kode



berikut payload untuk insert data :


Nah jadi atribute imageurl yang berisi map1 dan map2 bisa lebih flexible.
Sekarang kita get datanya :


Dari gambar diatas yang kita get melalu postman dapat terlihat perbedaan data di atribute imageurl data pertama memiliki 1(satu) atribute, dan data kedua memiliki 2(dua) atribute. dan kita cek data yg telah kita insert tadi melalui cql shell 


*describe keyspaces = untuk menampilkan keyspace yang ada


Kesimpulan

jadi NoSQL mungkin lebih flexible tapi perlu di ingat data seperti ini kurang baik untuk sistem sistem yang mempunyai banyak transaksi yang berelasi karna data kurang terstruktur, ya mungkin harus di lihat sejauh mana kebutuhan dalam penggunaan NoSQL.


Monday, June 16, 2014

Hibernate OGM

Hibernate OGM (Object Grid Mapper) merupakan persistence framework untuk NoSQL datastore (seperti MongoDB). Berbeda dengan Hibernate ORM yang khusus untuk relational database seperti MySQL, Oracle, postgresql dll.
Sayang sekali versi yang terakhir direlease masih Beta (belum final atau stable), yakni 4.1.0.Beta4. Jadi kemungkinan masih banyak kekurangan dan perlu banyak pengembangan.
Jika kita sudah familiar dengan JPA tentunya akan lebih mudah untuk menggunakan framework ini.
Untuk dokumentasi lebih lengkapnya bisa dilihat disini.

Sekarang kita mulai saja dengan contohnya.

Database yang akan digunakan adalah MongoDB.
Start mongoDB admin dan client nya
 $ mongod  
 $ mongo  

Create java project dengan struktur maven. Tambahkan library MongoDB driver dan MongoDB hibernate OGM di pom.xml
 <dependency>  
       <groupId>org.mongodb</groupId>  
       <artifactId>mongo-java-driver</artifactId>  
       <version>2.12.2</version>  
 </dependency>  
 <dependency>  
       <groupId>org.hibernate.ogm</groupId>  
       <artifactId>hibernate-ogm-mongodb</artifactId>  
       <version>4.1.0.Beta3</version>  
     </dependency>  


Tambahkan library core untuk Hibernate OGM
 <dependency>  
       <groupId>org.hibernate.ogm</groupId>  
       <artifactId>hibernate-ogm-core</artifactId>  
       <version>4.1.0.Beta4</version>  
     </dependency>  
     <dependency>  
       <groupId>org.hibernate.ogm</groupId>  
       <artifactId>hibernate-ogm-infinispan</artifactId>  
       <version>4.1.0.Beta4</version>  
     </dependency>  

Create satu contoh domain entity class. Misalnya class Employee. Hampir sama dengan hibernate ORM, karena kita memakai standart JPA.

 @Entity  
 public class Employee {  
   @Id  
   @GeneratedValue(strategy = GenerationType.AUTO)  
   private Integer id;  
   @Column(name = "firstname")  
   private String firstname;  
   @Column(name = "lastname")  
   private String lastname;  
   @Column(name = "phone")  
   private String phone;  
   ……       
 }  


Create persistence.xml di resource/META-INF yang berisi daftar class mapping dan koneksi ke datastrore.

Jangan lupa providernya diset  “org.hibernate.ogm.jpa.HibernateOgmPersistence”.
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>  
 <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">  
 <persistence-unit name="samplePersistenceUnit" transaction-type="RESOURCE_LOCAL">  
   <!-- Use Hibernate OGM provider: configuration will be transparent -->  
   <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>  
   <class>com.andri.hibernate.sample.persistence.domain.Employee</class>  
   <class>com.andri.hibernate.sample.persistence.domain.Address</class>  
   <properties>  
       <!-- Configure Hibernate OGM to mount Infinispan -->  
       <property name="hibernate.ogm.datastore.provider" value="org.hibernate.ogm.datastore.mongodb.impl.MongoDBDatastoreProvider"/>  
       <property name="hibernate.ogm.datastore.database" value="sample-mongo-test"/>  
       <property name="hibernate.ogm.datastore.host" value="localhost"/>  
       <property name="hibernate.search.default.directory_provider" value="filesystem"/>  
       <property name="hibernate.search.default.indexBase" value="/tmp/.hibernate_ogm_demo_luceneindexes"/>  
       <property name="hibernate.ogm.datastore.grid_dialect" value="org.hibernate.ogm.datastore.mongodb.MongoDBDialect" />  
   </properties>  
   </persistence-unit>  
 </persistence>  

Create sample class DAO yang mengimplementasikan proses CRUD untuk domain yang sudah kita buat tadi (persist, merge, delete).
 public class EmployeeDao {  
   private EntityManagerFactory emf = Persistence.createEntityManagerFactory("samplePersistenceUnit");  
   private EntityManager em = emf.createEntityManager();  
   public void save(Employee employee){  
     EntityTransaction transaction = em.getTransaction();  
     try {  
       transaction.begin();  
       em.persist(employee);  
       transaction.commit();  
     }catch (Exception e){  
       if(transaction !=null && transaction.isActive())  
         transaction.rollback();  
     }  
   }  
   public void update(Employee employee){  
     EntityTransaction transaction = em.getTransaction();  
     try {  
       if(findById(employee.getId())!=null) {  
         transaction.begin();  
         em.merge(employee);  
         transaction.commit();  
       }  
     }catch (Exception e){  
       if(transaction !=null && transaction.isActive())  
         transaction.rollback();  
     }  
   }  
   public void delete(Employee employee){  
     EntityTransaction transaction = em.getTransaction();  
     try {  
       if(findById(employee.getId())!=null) {  
         transaction.begin();  
         em.remove(employee);  
         transaction.commit();  
       }  
     }catch (Exception e){  
       if(transaction !=null && transaction.isActive())  
         transaction.rollback();  
     }  
   }  
   public void deleteById(Integer id){  
     EntityTransaction transaction = em.getTransaction();  
     try {  
       Employee find = findById(id);  
       if(find != null) {  
         transaction.begin();  
         em.remove(find);  
         transaction.commit();  
       }  
     }catch (Exception e){  
       if(transaction !=null && transaction.isActive())  
         transaction.rollback();  
     }  
   }  
   public Employee findById(Integer id) {  
     try {  
       return em.find(Employee.class, id);  
     } catch (Exception ex) {  
       System.out.println("Could not find Employee with id: " + id + "; " + ex.getMessage());  
     }  
     return null;  
   }  
   public EntityManager getEntityManager() {  
     return em;  
   }  
 }  

Create Test class untuk mencoba proses CRUD di dao.
 public class EmployeeDaoTest {  
   private EmployeeDao employeeDao = new EmployeeDao();  
   @Test  
   public void testInsert(){  
     Employee employeeFirst = new Employee();  
     employeeFirst.setFirstname("Andri");  
     employeeFirst.setLastname("Sasuke");  
     employeeFirst.setPhone("0817777");  
     Employee employeeSecond = new Employee();  
     employeeSecond.setFirstname("Budi");  
     employeeSecond.setLastname("Ini");  
     employeeSecond.setPhone("081888");  
     employeeDao.save(employeeFirst);  
     employeeDao.save(employeeSecond);  
     Assert.assertTrue(employeeFirst.getId()!=null && employeeSecond.getId()!=null);  
   }  
   ………..  
 }  

Masuk mongoDB client,  dapat dilihat data yang kita insert masuk.
Dengan perintah : $ db.Employee.find()


Data formatnya JSON. Kalau di MongoDB table dianggap menjadi sebuah Collection da nisi datanya formatnya JSON.
Untuk spesifikasi lebih lanjut tentang MongoDB bisa diliat di sini.

Untuk proses select query saya masih belum menemukan caranya. Jika digunakan query JP-QL ternyata masih error. Kalo dibaca baca di documentasinya mungkin bisa menggunakan Hibernate Search.

Source code tutorial ini bisa dilihat di sini : https://github.com/andrisasuke/sample-hibernate-ogm-mongoDB

Mungkin kedepannya tutorial ini bisa dilengkapi dengan Spring atau Spring MVC

Selamat mencoba dan maaf atas kekurangannya. J