Apakah Anda sering mendapat keluhan dari pelanggan tentang lambatnya kecepatan respon halaman JSP? Pernahkah Anda berpikir bagaimana aplikasi WEB Anda dapat menahan jumlah kunjungan yang semakin meningkat ketika jumlah kunjungan pelanggan meningkat drastis? Artikel ini menjelaskan beberapa metode praktis untuk menyesuaikan JSP dan servlet, yang dapat membuat halaman servlet dan JSP Anda lebih responsif dan skalabel. Selain itu, seiring bertambahnya jumlah pengguna, beban sistem akan menunjukkan tren peningkatan yang mulus. Pada artikel ini, saya akan menggunakan beberapa contoh praktis dan metode konfigurasi untuk meningkatkan kinerja aplikasi Anda secara tidak terduga. Beberapa teknik penyetelan ini diterapkan dalam pekerjaan pemrograman Anda. Teknologi lainnya terkait dengan konfigurasi server aplikasi. Pada artikel ini, kami akan menjelaskan secara rinci cara meningkatkan kinerja aplikasi Anda secara keseluruhan dengan menyetel halaman servlet dan JSP. Sebelum membaca artikel ini, diasumsikan Anda memiliki pengetahuan dasar tentang servlet dan JSP.
Metode 1: Cache data dalam metode init() servlet.
Setelah server aplikasi menginisialisasi instance servlet dan sebelum melayani permintaan klien, ia memanggil metode init() servlet. Dalam siklus hidup servlet, metode init() hanya akan dipanggil satu kali. Dengan menyimpan beberapa data statis dalam metode init() atau menyelesaikan beberapa operasi yang memakan waktu dan hanya perlu dilakukan satu kali, kinerja sistem dapat ditingkatkan secara signifikan.
Misalnya, membuat kumpulan koneksi JDBC dalam metode init() adalah contoh terbaik. Misalkan kita menggunakan antarmuka DataSource jdbc2.0 untuk mendapatkan koneksi database. Dalam keadaan normal, kita perlu mendapatkan data tertentu melalui sumber JNDI. Kita dapat membayangkan bahwa dalam aplikasi tertentu, jika kueri JNDI dijalankan untuk setiap permintaan SQL, kinerja sistem akan turun tajam. Solusinya adalah kode berikut, yang menyimpan DataSource dalam cache sehingga masih dapat digunakan pada panggilan SQL berikutnya:
public class ControllerServlet extends HttpServlet
{
javax.sql.DataSource testDS pribadi = null;
public void init (konfigurasi ServletConfig) menampilkan ServletException
{
super.init(konfigurasi);
Konteks ctx = null;
mencoba
{
ctx = InitialContext baru();
testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS");
}
tangkapan(PenamaanPengecualian ne)
{
ne.printStackTrace();
}
menangkap (Pengecualian e)
{
e.printStackTrace();
}
}
javax.sql.DataSource getTestDS() publik
{
kembalikan tesDS;
}
...
...
}
Metode 2: Nonaktifkan servlet dan JSP reload otomatis (auto-reload)
Servlet/JSP menyediakan teknologi praktis, yaitu teknologi reload otomatis, yang memberikan pengembang lingkungan pengembangan yang baik ketika Anda mengubah halaman servlet dan JSP tanpa harus me-restart aplikasi server. Namun, teknologi ini merupakan kerugian besar pada sumber daya sistem selama tahap pengoperasian produk, karena akan membawa beban besar pada pemuat kelas mesin JSP. Oleh karena itu, mematikan fungsi isi ulang otomatis sangat membantu untuk meningkatkan kinerja sistem.
Metode 3: Jangan menyalahgunakan HttpSession.
Di banyak aplikasi, program kami perlu menjaga status klien agar halaman dapat berkomunikasi satu sama lain. Namun sayangnya, karena HTTP pada dasarnya tidak memiliki kewarganegaraan, maka HTTP tidak dapat menyimpan status klien. Oleh karena itu, server aplikasi umum menyediakan sesi untuk menyimpan status klien. Di server aplikasi JSP, fungsi sesi diimplementasikan melalui objek HttpSession, namun meskipun nyaman, namun juga membawa banyak beban pada sistem. Karena setiap kali Anda memperoleh atau memperbarui suatu sesi, operator sistem harus melakukan operasi serialisasi yang memakan waktu. Anda dapat meningkatkan kinerja sistem dengan menangani HttpSession dengan cara berikut:
· Jika tidak diperlukan, Anda harus mematikan pengaturan default untuk HttpSession di halaman JSP: Jika Anda tidak menentukannya secara eksplisit, setiap halaman JSP akan default ke Buat HttpSession . Jika Anda tidak perlu menggunakan sesi di JSP Anda, Anda dapat menonaktifkannya melalui indikator halaman JSP berikut:
<%@ page session="false"%>
· Jangan menyimpan objek data besar di HttpSession: Jika Anda memiliki data besar objek disimpan di HttpSession, server aplikasi akan membuat serialisasinya setiap kali dibaca atau ditulis, sehingga menambah beban ekstra pada sistem. Semakin besar objek data yang Anda simpan di HttpSession, maka kinerja sistem akan semakin cepat menurun.
· Bila Anda tidak lagi memerlukan HttpSession, lepaskan sesegera mungkin: Bila Anda tidak lagi memerlukan sesi, Anda dapat melepaskannya dengan memanggil metode HttpSession.invalidate().
· Cobalah untuk mengatur batas waktu sesi sesingkat mungkin: Di server aplikasi JSP, ada batas waktu sesi default. Ketika pelanggan tidak melakukan operasi apa pun setelah waktu ini, sistem akan secara otomatis melepaskan sesi yang relevan dari memori. Semakin besar batas waktu yang ditetapkan, semakin rendah performa sistem, jadi cara terbaik adalah mencoba menjaga nilainya serendah mungkin.
Metode 4: Mengompresi keluaran halaman
adalah cara yang baik untuk mengatasi redundansi data, terutama saat ini ketika bandwidth jaringan tidak cukup berkembang. Beberapa browser mendukung gzip (GNU zip) untuk mengompres file HTML. Metode ini dapat mengurangi waktu pengunduhan file HTML secara signifikan. Oleh karena itu, jika halaman HTML yang dihasilkan oleh halaman servlet atau JSP dikompres, pengguna akan merasakan kecepatan penelusuran halaman akan sangat cepat. Sayangnya, tidak semua browser mendukung kompresi gzip, tetapi Anda dapat memeriksa program Anda apakah browser klien mendukungnya. Berikut cuplikan kode implementasi metode ini:
public void doGet(permintaan HttpServletRequest, respons HttpServletResponse)
melempar IOException, ServletException
{
OutputStream keluar = nol
Pengkodean string = request.getHeader("Terima-Encoding");
if (pengkodean != null && pengkodean.indexOf("gzip") != -1)
{
request.setHeader("Pengkodean Konten" , "gzip");
keluar = new GZIPOutputStream(permintaan.getOutputStream());
}
else if (pengkodean != null && pengkodean.indexOf("kompres") != -1)
{
request.setHeader("Pengkodean Konten" , "kompres");
keluar = ZIPOutputStream baru(permintaan.getOutputStream());
}
kalau tidak
{
keluar = permintaan.getOutputStream();
}
...
...
}
Metode 5: Gunakan kumpulan thread.
Server aplikasi membuat thread untuk memproses setiap permintaan klien yang berbeda secara default, dan menetapkan metode service() kepada mereka. Ketika pemanggilan metode service() selesai, thread yang sesuai juga Kemudian dibatalkan . Karena membuat dan menghancurkan thread menghabiskan sumber daya sistem tertentu, mode default ini mengurangi kinerja sistem. Tapi untungnya kita bisa mengubah situasi ini dengan membuat thread pool. Selain itu, kita juga perlu mengatur jumlah minimum thread dan jumlah maksimum thread untuk kumpulan thread ini. Ketika server aplikasi dimulai, itu akan membuat kumpulan thread dengan jumlah yang sama dengan jumlah minimum thread. Ketika pelanggan memiliki permintaan, thread dikeluarkan dari pool untuk diproses dimasukkan kembali ke dalam kolam tengah. Jika jumlah thread di pool tidak mencukupi, sistem akan secara otomatis menambah jumlah thread di pool, namun jumlah totalnya tidak boleh melebihi jumlah maksimum thread. Dengan menggunakan kumpulan thread, ketika permintaan klien meningkat tajam, beban sistem akan menunjukkan kurva ke atas yang mulus, sehingga meningkatkan skalabilitas sistem.
Metode 6: Pilih mekanisme penyertaan halaman yang benar.
Ada dua metode di JSP yang dapat digunakan untuk memasukkan halaman lain: 1. Gunakan indikator penyertaan (<%@ includee file="test.jsp" %>). 2. Gunakan indikator jsp (<jsp:includee page="test.jsp" flush="true"/>). Dalam praktiknya, saya menemukan bahwa jika Anda menggunakan cara pertama, kinerja sistem bisa lebih tinggi.
Metode 7: Menentukan dengan benar siklus hidup javabeans.
Salah satu aspek kuat dari JSP adalah dukungannya terhadap javabeans. Dengan menggunakan tag <jsp:useBean> di halaman JSP, javabeans dapat disisipkan langsung ke halaman JSP. Penggunaannya adalah sebagai berikut:
<jsp:useBean id="name" scope="page|request|session|application" class=
"paket.namakelas" type="typeName">
</jsp:useBean>
Atribut scope menunjukkan siklus hidup kacang ini. Siklus hidup default adalah halaman. Jika Anda tidak memilih siklus hidup bean dengan benar, hal itu akan mempengaruhi kinerja sistem.
Misalnya, jika Anda hanya ingin menggunakan kacang tertentu dalam satu permintaan, tetapi Anda mengatur siklus hidup kacang ke sesi, maka ketika permintaan berakhir, kacang akan tetap berada di memori kecuali sesi Timeout atau pengguna menutup browser. Hal ini akan menghabiskan sejumlah memori dan menambah beban kerja pengumpul sampah JVM secara tidak perlu. Oleh karena itu, menetapkan siklus hidup kacang yang benar dan membersihkannya sesegera mungkin setelah misinya selesai akan meningkatkan kinerja sistem.
Beberapa metode berguna lainnya
: Cobalah untuk tidak menggunakan operator "+" dalam operasi penggabungan string: Dalam pemrograman Java, kita sering menggunakan operator "+" untuk menghubungkan beberapa string, tetapi Anda mungkin tidak pernah memikirkannya. Ini sebenarnya akan mempengaruhi sistem kinerja, bukan? Karena string adalah konstanta, JVM akan menghasilkan beberapa objek sementara. Semakin banyak "+" yang Anda gunakan, semakin banyak objek sementara yang dihasilkan, yang juga akan berdampak pada kinerja sistem. Solusinya adalah dengan menggunakan objek StringBuffer alih-alih operator "+".
· Hindari penggunaan metode System.out.println(): Karena System.out.println() adalah panggilan sinkron, yaitu ketika memanggilnya, operasi I/O disk harus menunggu selesai, jadi kita harus mencoba hindari menggunakannya panggilan. Namun ini adalah alat yang sangat diperlukan dan berguna saat kita men-debug program. Untuk mengatasi kontradiksi ini, saya sarankan Anda menggunakan alat Log4j ( http://Jakarta.apache.org ), yang dapat memfasilitasi proses debug tanpa Metode seperti System.out. .println() akan dihasilkan.
· Trade-off antara ServletOutputStream dan PrintWriter: Menggunakan PrintWriter mungkin membawa sedikit overhead, karena mengubah semua output mentah menjadi aliran karakter untuk output, jadi jika digunakan sebagai output halaman, sistem harus menanggung proses konversi. Tidak ada masalah jika Anda menggunakan ServletOutputStream sebagai keluaran halaman, tetapi keluarannya dalam biner. Oleh karena itu, pro dan kontra dari keduanya harus dipertimbangkan dalam penerapan praktisnya.
Ringkasan
Tujuan artikel ini adalah untuk meningkatkan kinerja aplikasi Anda melalui beberapa teknik penyetelan untuk servlet dan JSP, dan oleh karena itu meningkatkan kinerja seluruh aplikasi J2EE. Melalui teknik penyetelan ini, Anda dapat mengetahui bahwa bukan platform teknis tertentu (seperti perselisihan antara J2EE dan .NET) yang menentukan kinerja aplikasi Anda itu Hanya dengan begitu Anda dapat mengoptimalkan aplikasi Anda secara mendasar!