Monday, October 8, 2012

ADF - Table Pagination

Sebelum kita membahas Pagination di ADF, mari kita pahami dulu Pagination.

Apa sih Pagination itu ?
Pagination berasal dari kata page, yang artinya halaman. Jadi pagination adalah proses pembacaan data per-halaman atau per-bagian. Banyak sekali contoh pagination, salah satunya adalah aplikasi instagram. Dimana saat aplikasi tersebut di jalankan, instagram hanya menampilkan beberapa bagian data terbaru saja. Bukan semua data yang di tampilkan dalam gadget kita.

Kenapa harus menggunakan Pagination ?
Pagination digunakan saat proses pengambilan data yang besar (biasanya ratusan ribu atau jutaan data). Tidaklah bijak jika kita mengambil data dari database secara keseluruhan, bukan bagian per bagian. Dengan adanya pagination kita bisa mengefektifkan penggunaan memori dan tentunya data yang ditampilkan lebih cepat.

Lalu, apa yang bisa dilakukan oleh ADF ?
Seperti yang kita tahu, ADF adalah framework yang begitu mudah digunakan. Banyak sekali wizard yang disediakan di JDeveloper, untuk mempercepat kita dalam proses pembuatan aplikasi. Pagination pada ADF juga sangat mudah, cukup optimalisasi pada VO (View Object).

Bagaimana caranya ?
Sebelum kita membahas lebih lanjut, disini kita hanya menggunakan komponen ADF Table yang akan di tampilkan dalam bentuk Web. Kenapa table, karena pagination biasanya digunakan pada table.
Tanpa banyak membuang waktu, mari kita coba cara pembuatan pagination di ADF. Untuk itu ada beberapa hal yang harus kita lakukan, yaitu :
  1. Membuat aplikasi ADF dengan menggunakan JDeveloper. Pada bagian Model kita menggunakan EO (Entity Object) dan VO (View Object) yang terkoneksi ke database. Sedangkan di bagian ViewController kita menggunakan JSF Page dengan komponen ADF Table. Untuk langkah-langkah pembuatan aplikasi tersebut, nantikan blog saya selanjutnya, yaitu Step by step - ADF Pagination.
  2. Setelah aplikasi selesai dibuat, klik VO yang digunakan pada ADF Table.
  3. Pada bagian Tuning, ubah Access Mode menjadi Range Paging.
  4. Nilai yang kita isikan pada bagian range size sesuai dengan range size yang dipakai di iterator.
View Object
View Object

Setelah melakukan perubahan tersebut, aplikasi siap untuk di deploy dan di test. Jangan lupa klik tombol save sebelum melakukan proses deploy.

Tunjukan buktinya ?
Sebelum kita memberikan bukti, mari kita lakukan test sederhana berikut ini :

  1. Setelah aplikasi berhasil di deploy, buka aplikasi tersebut di browser.
  2. Tunggu beberapa saat hingga kita bisa melihat aplikasi secara sempurna.
  3. Lakukan scroll hingga mencapai akhir dari Vertical ScrollBar.
  4. Bandingkan hasilnya, antara yang menggunakan pagination dan yang tidak.
Ini lah buktinya. Kedua gambar di bawah, diambil dengan menggunakan jconsole dengan kisaran data mencapai 100 ribu.

Table tanpa pagination
Table tanpa pagination

Table dengan pagination
Table dengan pagination

Dari gambar disamping terlihat bahwa ada pergerakan penggunaan memori pada saat :

  • Aplikasi mulai di jalankan, dimana penggunaan memori berkisar antara 160Mb.
  • Sedangkan saat proses scroll data hingga mencapai akhir dari Vertical ScrollBar berkisar antara 250Mb.






Jika kita bandingkan dengan gambar di sebelah kanan terlihat sekali beda. Saat aplikasi di jalankan dan proses scroll data hingga akhir dari Vertical ScrollBar tidak lebih dari 200mb, atau kisaran 160Mb dari titik awal dan 170Mb untuk titik tertingginya.








Kok bisa seperti itu ?
Terlihat seperti magic bukan, apa yang dilakukan oleh ADF. Namun tidak ada yang magic di dunia komputer. Jadi apa yang dilakukan ADF adalah mengubah query yang ada dengan menambahkan hint dan range. Untuk lebih jelasnya perhatikan contoh query ini:

SELECT Sample.ID, Sample.DATA FROM SAMPLE Sample

Query diatas adalah bentuk awal sebelum kita ubah access mode-nya menjadi range paging. Apabila kita rubah menjadi range paging, query diatas berubah menjadi:


SELECT * FROM (SELECT /*+ FIRST_ROWS */ IQ.*, ROWNUM AS Z_R_N FROM (SELECT Sample.ID, Sample.DATA FROM SAMPLE Sample) IQ WHERE ROWNUM < :Bind_RangePage_High) WHERE Z_R_N > :Bind_RangePage_Low

Jadi adanya penambahan hit dan range pada saat kita melakukan proses pagination berlangsung.