Jumat, 21 September 2012

Java Persistence API (JPA)

Hampir semua aplikasi bisnis menggunakan database. Konsep database relasional sudah populer jauh sebelum konsep objectoriented digunakan orang. Oleh karena itu, apapun bahasa pemrograman yang kita gunakan, menggunakan database adalah suatu keniscayaan.

Dalam interaksi kita dengan database, ada beberapa masalah yang umum kita temukan, diantaranya

• perbedaan dialek SQL antar merek database
• perbedaan konsep relasional dan object-oriented
• peningkatan kinerja (performance)

Pada buku ini kita akan membahas tentang framework yang disebut Object/Relational Mapping (ORM). JPA termasuk framework dalam kategori ORM. Dengan kita menggunakan ORM, maka banyak masalah umum di atas yang dapat diselesaikan tanpa kita harus membuat solusi sendiri.

Mari kita elaborasi.


Perbedaan dialek SQL
Masing-masing vendor database berusaha mempertahankan pelanggannya dengan cara membuat nilai tambah di produk mereka, yang membedakan produknya dengan produk pesaing. Nilai tambah ini tentunya diberikan dalam bentuk fitur-fitur canggih yang dimiliki database. Karena antarmuka utama database dan user (dalam hal ini programmer) adalah perintah SQL, maka kita sekarang melihat banyak sekali perbedaan SQL antar merek database. Bahkan untuk kasus sederhana saja, mengambil 10 barisn pertama dari hasil query, para vendor database ini tidak bisasepakat.

Perbedaan ini sangat menyulitkan bila kita ingin membuat produk aplikasi. Untuk menjangkau pasar yang luas, produk kita harus bisa digunakan di berbagai kondisi dan konfigurasi. Kita harus bisa mendukung pelanggan yang menggunakan PostgreSQL maupun Oracle. Perbedaan dialek SQL menyebabkan kita harus mengeluarkan biaya tambahan untuk mendukung berbagai jenis database.

Framework ORM menjembatani antara kode program dengan SQL. Kita tidak lagi menjalankan SQL sesuai merek database, tapi kita menggunakan Query Language yang disediakan ORM. Bila suatu

saat kita ingin mengganti database, kita cukup mengkonfigurasi ORM untuk berganti dialek.

Perbedaan konsep relasional dan object-oriented
Cara berpikir kita dalam mendesain struktur tabel database sangat berbeda dengan paradigma yang kita gunakan pada waktu mendesain struktur objek aplikasi kita. Mari kita lihat beberapa konsep berikut:

• equality
• inheritance
• relationship

Konsep equality membahas bagaimana kita menyatakan bahwa object a sama dengan object b. Di dalam bahasa Java, kedua object dinyatakan sama jika berada dalam lokasi memori yang sama, sehingga bisa dibandingkan dengan operator ==. Selain itu, kita juga bisa membuat definisi kita sendiri tentang kesamaan dengan cara meng-override method equals.

Di database, suatu record disebut sama dengan record lainnya bila kedua record memiliki nilai primary key yang sama dan tersimpan dalam tabel yang sama.

Bahasa pemrograman berorientasi objek seperti Java mengenal konsep inheritance. Dengan konsep ini, banyak teknik pemrograman canggih yang bisa dilakukan. Konsep ini tidak ada di database.

Relasi di kode Java ditentukan oleh method yang kita sediakan untuk navigasi. Sebagai contoh, bila satu Category memiliki banyak Article di dalamnya, ada beberapa kemungkinan yang bisa dilakukan:

• class Category bisa melihat semua Article dan sebaliknya, Article tahu dalam Category apa dia berada

public class Category {
public List<Article> articles;
} public class Article {
private Category category;
}


• class Article tahu tentang Category, tapi Category bisa melihat Article yang ada di dalamnya

public class Category {
}
public class Article {
private Category category;
}


• class Category bisa melihat isi Article, tapi Article tidak tahu Category tempat dia disimpan.

public class Category {
public List<Article> articles;
} public class Article {
}


Database tidak mengenal konsep navigasi. Bila kita punya struktur database seperti ini:

create table Category (
id INT,
name VARCHAR
);
create table Article (
id INT,
category_id INT,
title VARCHAR
);


Maka kita bisa mendapatkan baik Article maupun Category dengan query seperti ini

select * from Article where category_id = ?


ORM menjembatani perbedaan ini, sehingga kita bisa membuat kode program dengan lebih rapi.

Peningkatan kinerja
Ada banyak hal yang bisa kita lakukan untuk mengoptimasi akses database, diantaranya:

• database connection pooling
• lazy-loading
• deferred SQL
• mengurangi hit ke database
• query result cache

Urusan connect/disconnect dari database merupakan urusan yang rumit. Banyak langkah yang terlibat di sana, misalnya inisialisasi koneksi, proses otentikasi, dan sebagainya.

Aplikasi besar biasanya mengoptimasi urusan connect/disconnect ini dengan menggunakan teknik connection pooling. Pada waktu dinyalakan, aplikasi langsung membuat banyak koneksi sekaligus (pool). Bila ada kode program yang ingin menggunakan koneksi untuk menjalankan SQL, maka koneksi diambil dari pool dan
diberikan. Setelah selesai menjalankan SQL, koneksi tidak ditutup, melainkan dikembalikan ke pool. Dengan cara ini, overhead proses connect/disconnect dapat dikurangi.

Dengan menggunakan ORM, semua koneksi database diatur di satu tempat, sehingga mengubah konfigurasi dari koneksi biasa menjadi connection-pooling tidak berpengaruh besar terhadap keseluruhan kode program.

Tidak semua data yang kita ambil dari database akan digunakan. Kadangkala sebagian besar data yang diambil akan dibuang. Tentunya ini memboroskan kerja CPU, penggunaan memori, dan juga bandwidth. Beberapa ORM mendukung fitur lazy-loading, yaitu mengambil data kalau benar-benar diperlukan.

Bila aplikasi kita menggunakan ORM, perintah SQL ke database dieksekusi oleh ORM, bukan oleh kode program kita. Karena itu, ORM memiliki kebebasan untuk menjalankan SQL kapan saja, asal tidak mengacaukan aplikasi kita. Kebebasan ini digunakan oleh ORM untuk menunda dan mengumpulkan eksekusi SQL, sehingga bisa dijalankan secara efisien.

Pada aplikasi besar, umumnya application server dan database server diinstal di mesin yang berbeda. Untuk mengaksesnya digunakan akses melalui jaringan (network). Oleh karena itu, akses ke database harus diperhitungkan dengan teliti, agar tidak terlalu banyak perintah atau data yang “menyeberangi” jaringan. ORM senantiasa berusaha mengurangi komunikasinya dengan database, sehingga kinerja aplikasi dapat ditingkatkan.

Mengambil data dari memori selalu jauh lebih cepat daripada mengambil data dari disk atau jaringan. Karena kontrol penuh yang dimilikinya atas hubungan ke database, ORM dapat menggunakan cache dengan leluasa. ORM dapat mengamati data mana yang jarang berubah, dan kemudian akan menyimpannya di memori
(cache). Bila kode program kita meminta data tersebut, ORM tidak perlu mengakses database, melainkan langsung mengambilnya dari cache. Ini akan sangat mempercepat eksekusi aplikasi.

Tidak ada komentar:

Posting Komentar