Kerangka kerja cache objek J2EE

Aplikasi web biasanya diakses oleh banyak pengguna secara bersamaan. Biasanya, data aplikasi disimpan dalam database relasional atau sistem file, dan dibutuhkan waktu dan biaya tambahan untuk mengakses sumber data ini. Hambatan akses database dapat memperlambat atau bahkan merusak aplikasi jika menerima terlalu banyak permintaan secara bersamaan. Caching objek adalah salah satu teknik yang mengatasi masalah ini. Dalam artikel ini, Srini Penchikala membahas kerangka implementasi caching sederhana yang dia buat untuk menyimpan cache objek data pencarian dalam proyek portal Web.

Caching objek memungkinkan aplikasi untuk berbagi objek di seluruh permintaan dan pengguna, dan mengoordinasikan siklus hidup objek di seluruh proses. Dengan menyimpan objek yang sering diakses atau mahal untuk dibuat dalam memori, cache objek menghilangkan kebutuhan untuk membuat dan memuat data berulang kali. Ini menghindari perolehan kembali objek yang mahal dengan tidak melepaskan objek segera setelah digunakan. Sebaliknya, objek disimpan dalam memori dan digunakan kembali untuk permintaan klien berikutnya.

Berikut cara kerja caching: Saat data diambil dari sumber data untuk pertama kalinya, data disimpan sementara dalam buffer memori yang disebut cache. Jika data yang sama harus diakses lagi, objek diambil dari cache, bukan dari sumber data. Data yang di-cache dilepaskan dari memori saat tidak lagi diperlukan. Untuk mengontrol kapan objek tertentu dapat dilepaskan dari memori, waktu kedaluwarsa yang wajar harus ditentukan, setelah itu, data yang disimpan dalam objek menjadi tidak valid dari sudut pandang aplikasi Web.

Sekarang kita telah membahas dasar-dasar cara kerja caching, mari kita lihat beberapa skenario terkenal dalam aplikasi J2EE yang menggunakan mekanisme penyimpanan objek yang mirip dengan caching.

Metode konvensional untuk pencarian objek seperti hashtable sederhana, JNDI (Java Naming and Directory Interface), atau bahkan EJB (Enterprise JavaBeans) menyediakan cara untuk menyimpan objek dalam memori dan melakukan pencarian objek berdasarkan kunci. Tetapi tidak satu pun dari metode ini menyediakan mekanisme apa pun untuk menghapus objek dari memori saat tidak lagi diperlukan atau secara otomatis membuat objek saat diakses setelah kedaluwarsa. The HttpSessionobjek (dalam paket servlet) juga memungkinkan objek yang akan di-cache, tetapi tidak memiliki konsep berbagi, pembatalan, kadaluwarsa per-objek, loading, atau spooling, yang merupakan elemen penting dari kerangka caching.

Cache objek di portal Web

Portal harus mengelola profil pengguna dan objek yang tersedia di portal. Karena sebagian besar portal Web menyediakan fitur sistem masuk tunggal (SSO), menyimpan data profil pengguna sangat penting bahkan jika pengguna beralih di antara berbagai modul dalam aplikasi portal Web. Profil pengguna harus disimpan dengan aman di cache sehingga pengguna Web lain tidak dapat mengaksesnya. Objek dapat berusia keluar dari cache untuk mengosongkan ruang atau fitur waktu siaga dapat menghapus objek yang tidak sedang diakses. Ini menyederhanakan manajemen objek, karena aplikasi tidak perlu terus-menerus memantau objek mana yang dibutuhkan pada waktu tertentu. Objek "panas" secara otomatis tersedia di cache. Objek yang mahal untuk dibuat atau diambil dapat ditulis ke disk lokal dan diambil secara transparan sesuai kebutuhan. Jadi,cache objek dapat digunakan untuk mengelola informasi profil pengguna dan data pencarian, seperti informasi produk perusahaan, yang dapat dibagikan di antara beberapa pengguna portal.

Manfaat dan kewajiban cache objek

Salah satu manfaat utama cache objek adalah peningkatan yang signifikan dalam kinerja aplikasi. Dalam aplikasi multitier, akses data adalah operasi yang mahal dibandingkan dengan tugas lainnya. Dengan menyimpan data yang sering diakses dan tidak merilisnya setelah digunakan pertama kali, kita dapat menghindari biaya dan waktu yang diperlukan untuk perolehan kembali dan rilis data. Cache objek menghasilkan kinerja aplikasi Web yang ditingkatkan karena alasan berikut:

  • Ini mengurangi jumlah perjalanan ke database atau sumber data lain, seperti database XML atau sistem warisan ERP (perencanaan sumber daya perusahaan)
  • Ini menghindari biaya berulang kali membuat objek
  • Ini berbagi objek antara utas dalam suatu proses dan antar proses
  • Ini secara efisien menggunakan sumber daya proses

Skalabilitas adalah manfaat lain dari cache objek. Karena data yang di-cache diakses di beberapa sesi dan aplikasi Web, cache objek dapat menjadi bagian besar dari desain aplikasi Web yang dapat diskalakan. Caching objek membantu menghindari biaya perolehan dan pelepasan objek. Ini membebaskan sumber daya perangkat keras dan perangkat lunak sistem yang berharga dengan mendistribusikan data di seluruh perusahaan daripada menyimpannya di satu tempat terpusat seperti tingkat data. Data yang disimpan secara lokal secara langsung mengatasi latensi, mengurangi biaya pengoperasian, dan menghilangkan kemacetan. Caching memfasilitasi manajemen aplikasi Web dengan memungkinkan mereka untuk mengukur pada waktu lalu lintas puncak tanpa biaya server tambahan. Secara efektif dapat memuluskan kurva kinerja dalam aplikasi Web untuk kinerja dan alokasi sumber daya yang lebih baik secara keseluruhan.

Caching objek juga mencakup beberapa kelemahan, seperti ukuran memori, misalnya. Cache dapat menggunakan ruang heap yang signifikan di server aplikasi. Ukuran memori JVM bisa menjadi sangat besar jika banyak data yang tidak digunakan ada di cache dan tidak dilepaskan dari memori secara berkala.

Kerugian lainnya adalah kompleksitas sinkronisasi. Bergantung pada jenis datanya, kompleksitas meningkat karena konsistensi antara status data yang di-cache dan data asli sumber data harus dipastikan. Jika tidak, data yang di-cache bisa tidak sinkron dengan data sebenarnya, yang menyebabkan ketidakakuratan data.

Akhirnya, perubahan pada data yang di-cache bisa hilang saat server macet, kerugian lainnya. Cache yang disinkronkan dapat mencegah masalah ini.

Penggunaan cache objek

Penggunaan umum caching objek mencakup penyimpanan halaman HTML, hasil kueri database, atau informasi apa pun yang dapat disimpan sebagai objek Java. Pada dasarnya, data apa pun yang tidak sering berubah dan membutuhkan banyak waktu untuk kembali dari sumber data adalah kandidat yang baik untuk penyimpanan dalam cache. Itu mencakup sebagian besar jenis data pencarian, daftar kode dan deskripsi, dan hasil pencarian umum dengan fungsionalitas halaman (hasil pencarian dapat diekstrak dari sumber data sekali dan disimpan dalam cache untuk digunakan ketika pengguna mengklik link halaman layar hasil).

The HttpSessionobjek dalam Tomcat servlet penawaran wadah contoh yang baik dari objek caching. Tomcat menggunakan sebuah instance Hashtableuntuk menyimpan objek sesi dan mengakhiri objek sesi yang sudah usang menggunakan thread latar belakang.

Teknologi middleware seperti EJB dan CORBA memungkinkan transfer jarak jauh objek di mana objek jarak jauh ditransfer antara klien dan server. Jenis akses ini, juga dikenal sebagai akses data berbutir kasar, meminimalkan jumlah pemanggilan metode jarak jauh yang mahal. Objek transfer data ini (juga dikenal sebagai objek nilai) dapat disimpan dalam cache jika objek tidak sering berubah, yang membatasi berapa kali kontainer servlet harus mengakses server aplikasi.

Lebih banyak contoh penggunaan cache objek ikuti:

  • Enterprise JavaBeans: Biji entitas EJB mewakili informasi database di tingkat menengah, server aplikasi. Setelah dibuat, biji entitas di-cache dalam wadah EJB, yang menghindari pengambilan data yang mahal (akuisisi sumber daya) dari database.
  • EJBHomeFactorycache: Jika aplikasi klien tidak menyimpan stub ke dalam cache di suatu tempat, pemanggilan metode jarak jauh bisa menjadi jauh lebih mahal karena setiap panggilan logis ke server memerlukan dua panggilan jarak jauh: satu ke layanan penamaan untuk mengambil sebuah rintisan dan satu lagi ke server sebenarnya. Masalah ini bisa diatasi dengan membuat EJBHomeFactorykelas untuk menyimpan referensi ke Homeantarmuka EJB dan menggunakannya kembali untuk panggilan berikutnya.
  • Browser Web: Browser Web terpopuler seperti Netscape dan cache Internet Explorer yang sering mengakses Halaman Web. Jika pengguna mengakses halaman yang sama, browser mengambil konten halaman dari cache, sehingga menghindari pengambilan konten yang mahal dari Situs Web. Stempel waktu menentukan berapa lama untuk mempertahankan halaman dalam cache dan kapan harus mengeluarkannya.
  • Cache data: Data yang disimpan dalam RDBMS (sistem manajemen basis data relasional) dipandang sebagai sumber daya yang terkadang sulit diperoleh. Cache berukuran benar adalah komponen penting dari database yang disetel dengan baik. Sebagian besar database menyertakan semacam cache data. Oracle, misalnya, menyertakan area global bersama yang berisi cache dari blok database yang baru-baru ini digunakan dan cache dari kode prosedur tersimpan yang dikompilasi, pernyataan SQL yang diuraikan, informasi kamus data, dan banyak lagi.

Bagaimana dengan data yang tidak cocok untuk caching? Berikut daftar data yang tidak direkomendasikan untuk penyimpanan dalam cache:

  • Amankan informasi yang dapat diakses pengguna lain di Situs Web
  • Informasi pribadi, seperti Nomor Jaminan Sosial dan detail kartu kredit
  • Informasi bisnis yang sering berubah dan menyebabkan masalah jika tidak mutakhir dan akurat
  • Data khusus sesi yang mungkin tidak dimaksudkan untuk diakses oleh pengguna lain

Algoritme cache

Sumber daya yang disimpan dalam cache membutuhkan memori. Jika sumber daya ini tidak digunakan untuk waktu yang lama, mempertahankannya terbukti tidak efisien. Karena kapasitas cache terbatas, maka ketika cache sudah penuh, kita harus membersihkan beberapa konten cache sebelum mengisinya kembali. Aplikasi dapat secara eksplisit membatalkan objek yang di-cache dalam tiga cara berbeda: dengan mengaitkan "time-to-live" (TTL) atau "idle-time" dengan objek, atau jika kapasitas sistem cache telah tercapai (ini adalah nilai yang dapat dikonfigurasi ), objek yang tidak baru-baru ini digunakan akan dihapus oleh sistem cache.

Berbagai mekanisme kedaluwarsa cache dapat menghapus objek dari cache. Algoritme ini didasarkan pada kriteria seperti paling jarang digunakan (LFU), paling terakhir digunakan (LRU), paling terakhir digunakan (MRU), pertama masuk pertama keluar (FIFO), waktu akses terakhir, dan ukuran objek. Setiap algoritma memiliki kelebihan dan kekurangan. LFU dan LRU itu sederhana, tetapi mereka tidak mempertimbangkan ukuran objek. Algoritme berbasis ukuran menghapus objek besar (yang membutuhkan banyak memori), tetapi laju byte-hit akan rendah. Penting untuk mempertimbangkan semua persyaratan aplikasi Web sebelum memutuskan algoritma cache mana yang akan digunakan untuk objek cache yang kedaluwarsa.

Cache objek dalam aplikasi J2EE

Dalam sistem terdistribusi seperti aplikasi J2EE, ada dua bentuk caching: caching sisi klien dan sisi server. Caching sisi klien berguna untuk menghemat bandwidth jaringan dan waktu yang diperlukan untuk mengirimkan data server berulang kali ke klien. Di sisi lain, cache sisi server berguna ketika banyak permintaan klien mengarah pada akuisisi berulang atas sumber daya yang sama di server. Caching sisi server dapat dicapai di semua tingkatan, yaitu database, server aplikasi, kontainer servlet, dan server Web.

Subsistem server seperti mesin servlet dapat meningkatkan kinerja server dengan menggabungkan item seperti objek permintaan, respons, dan buffer. Objek servlet itu sendiri dapat disimpan di cache. Fitur pembatalan grup kemudian dapat digunakan saat aplikasi perlu memuat ulang. Semua servlet dan objek terkait dalam aplikasi dapat dibersihkan dengan satu panggilan metode. Sebagian atau semua respons dapat disimpan dalam cache jika diterapkan ke lebih dari satu respons, yang dapat meningkatkan waktu respons secara signifikan. Demikian pula, di tingkat data, caching dapat memberikan peningkatan kinerja yang signifikan.

IronEye Cache (dari IronGrid) menyediakan opsi untuk menyimpan pernyataan SQL yang sering diminta dalam cache untuk meminimalkan panggilan database dan menyampaikan informasi yang biasa diminta dengan cepat. Oracle menyediakan cache objek di semua tingkatan. Oracle Web Cache berada di depan server aplikasi (server Web), menyimpan konten mereka dan menyediakan konten itu ke browser Web yang memintanya. Layanan Cache Objek untuk Java menyediakan caching untuk objek Java yang mahal atau sering digunakan dalam program Java. Layanan Cache Objek untuk Java secara otomatis memuat dan memperbarui objek seperti yang ditentukan oleh aplikasi Java. Dan terakhir, Oracle iCache Data Source menyediakan data caching di dalam database server.

Cache objek dalam cluster J2EE

Cache objek dalam cluster penting karena beberapa JVM berjalan dalam cluster, dan menjaga sinkronisasi semua data cache anggota cluster sangat penting. Karena setiap penampung servlet memiliki instance pengelola cache di JVM-nya, perubahan data harus tercermin di semua cache untuk mencegah pembacaan yang basi. Ini dapat dicapai dengan menggunakan pesan berbasis kacang (MDB) untuk memberi tahu semua manajer cache kapan me-refresh data cache. Banyak kerangka kerja cache menyediakan dukungan cluster bawaan untuk data cache.

Kerangka kerja cache

Beberapa kerangka kerja cache objek (sumber terbuka dan implementasi komersial) menyediakan cache terdistribusi dalam wadah servlet dan server aplikasi. Daftar dari beberapa kerangka kerja yang tersedia saat ini sebagai berikut:

Sumber Terbuka:

  • Sistem Caching Java (JCS)
  • OSCache
  • Cache Objek Java (JOCache)
  • Java Caching Service, implementasi open source dari JCache API (SourceForge.net)
  • SwarmCache
  • JBossCache
  • IronEye Cache

Komersial:

  • SpiritCache (dari SpiritSoft)
  • Koherensi (Tangosol)
  • ObjectCache (ObjectStore)
  • Layanan Cache Objek untuk Java (Oracle)

Jika Anda tertarik untuk membaca lebih lanjut tentang implementasi caching ini, lihat Sumberdaya untuk tautan ke semua kerangka kerja ini.

Faktor yang perlu dipertimbangkan dalam kerangka kerja cache objek

Cari faktor-faktor berikut dalam kerangka penyimpanan cache: