Bagikan melalui


Penembolokan Data saat Memulai Aplikasi (C#)

oleh Scott Mitchell

Unduh PDF

Dalam aplikasi Web apa pun, beberapa data akan sering digunakan dan beberapa data jarang akan digunakan. Kami dapat meningkatkan performa aplikasi ASP.NET kami dengan memuat data yang sering digunakan secara lebih awal, sebuah teknik yang dikenal sebagai Caching. Tutorial ini menunjukkan satu pendekatan untuk pemuatan proaktif, yaitu memuat data ke dalam cache saat pengaktifan aplikasi.

Pendahuluan

Dua tutorial sebelumnya membahas tentang penyimpanan sementara data di Lapisan Presentasi dan Lapisan Penyimpanan Sementara. Di Penyimpanan Sementara Data dengan ObjectDataSource, dibahas penggunaan fitur penyimpanan sementara ObjectDataSource untuk menyimpan data di Lapisan Presentasi. Caching Data dalam Arsitektur meneliti caching dalam Lapisan Caching baru yang terpisah. Kedua tutorial ini menggunakan pemuatan reaktif dalam bekerja dengan cache data. Dengan pemuatan reaktif, setiap kali data diminta, sistem terlebih dahulu memeriksa apakah ada di cache. Jika tidak, ia mengambil data dari sumber asal, seperti database, lalu menyimpannya di cache. Keuntungan utama dari pemuatan reaktif adalah kemudahan implementasinya. Salah satu kelemahannya adalah performanya yang tidak merata di seluruh permintaan. Bayangkan halaman yang menggunakan Lapisan Penembolokan dari tutorial sebelumnya untuk menampilkan informasi produk. Ketika halaman ini dikunjungi untuk pertama kalinya, atau dikunjungi untuk pertama kalinya setelah data yang di-cache dikeluarkan karena kendala memori atau kedaluwarsa yang ditentukan telah tercapai, data harus diambil dari database. Oleh karena itu, permintaan pengguna ini akan memakan waktu lebih lama daripada permintaan pengguna yang dapat dilayani oleh cache.

Pemuatan proaktif menyediakan strategi manajemen cache alternatif yang memuluskan performa di seluruh permintaan dengan memuat data yang di-cache sebelum diperlukan. Biasanya, pemuatan proaktif menggunakan beberapa proses yang secara berkala memeriksa atau diberi tahu ketika telah ada pembaruan pada data yang mendasar. Proses ini kemudian memperbarui cache agar tetap segar. Pemuatan proaktif sangat berguna jika data yang mendasar berasal dari koneksi database yang lambat, layanan Web, atau beberapa sumber data lain yang sangat lamban. Tetapi pendekatan untuk pemuatan proaktif ini lebih sulit diimplementasikan, karena memerlukan pembuatan, pengelolaan, dan penyebaran proses untuk memeriksa perubahan dan memperbarui cache.

Jenis lain dari pengisian proaktif, dan jenis yang akan kita jelajahi dalam tutorial ini, adalah memuat data ke dalam cache saat aplikasi dimulai. Pendekatan ini sangat berguna untuk caching data statis, seperti entri dalam tabel pencarian database.

Nota

Untuk melihat lebih mendalam perbedaan antara pemuatan proaktif dan reaktif, serta daftar rekomendasi pro, kontra, dan implementasi, lihat bagian Mengelola Konten Cache dari Panduan Arsitektur Penembolokan untuk Aplikasi .NET Framework.

Langkah 1: Menentukan Data apa yang akan Di-Cache di Startup Aplikasi

Contoh penyimpanan sementara menggunakan pemuatan reaktif yang kami periksa dalam dua tutorial sebelumnya bekerja dengan baik dengan data yang dapat berubah secara berkala dan tidak memerlukan waktu yang sangat lama untuk dihasilkan. Tetapi jika data yang di-cache tidak pernah berubah, masa berlaku yang digunakan dengan pemuatan reaktif menjadi berlebihan. Seperti halnya, jika data yang di-cache membutuhkan waktu yang sangat lama untuk dihasilkan, maka pengguna yang permintaannya menemukan cache kosong harus menanggung penantian panjang selama pengambilan data dasarnya. Pertimbangkan caching data statis dan data yang membutuhkan waktu yang sangat lama untuk dihasilkan pada saat startup aplikasi.

Meskipun database memiliki banyak nilai dinamis yang sering berubah, sebagian besar juga memiliki sejumlah besar data statis. Misalnya, hampir semua model data memiliki satu atau beberapa kolom yang berisi nilai tertentu dari sekumpulan pilihan tetap. Tabel Patients database mungkin memiliki PrimaryLanguage kolom, yang set nilainya bisa bahasa Inggris, Spanyol, Prancis, Rusia, Jepang, dan sebagainya. Sering kali, jenis kolom ini diimplementasikan menggunakan tabel pencarian. Daripada menyimpan string Bahasa Inggris atau Prancis dalam Patients tabel, tabel kedua dibuat yang memiliki, umumnya, dua kolom - pengidentifikasi unik dan deskripsi string - dengan catatan untuk setiap nilai yang mungkin. Kolom PrimaryLanguage dalam Patients tabel menyimpan pengidentifikasi unik yang sesuai dalam tabel pencarian. Pada Gambar 1, bahasa utama pasien John Doe adalah bahasa Inggris, sedangkan Ed Johnson adalah bahasa Rusia.

Tabel Bahasa adalah Tabel Pencarian yang Digunakan oleh Tabel Pasien

Gambar 1: Languages Tabel adalah tabel pencarian yang digunakan oleh Patients Tabel

Antarmuka pengguna untuk mengedit atau menambahkan pasien baru akan menyertakan daftar drop-down bahasa yang diizinkan yang diisi dengan catatan dari tabel Languages. Tanpa caching, setiap kali antarmuka ini dikunjungi, sistem harus mengakses tabel Languages. Ini boros dan tidak perlu karena nilai tabel pencarian jarang berubah, jika pernah.

Kita dapat menyimpan Languages data menggunakan teknik pemuatan reaktif yang sama yang diperiksa dalam tutorial sebelumnya. Namun, pemuatan reaktif menggunakan kedaluwarsaan berbasis waktu, yang tidak diperlukan untuk data tabel pencarian statis. Meskipun penembolokan menggunakan pemuatan reaktif akan lebih baik daripada tidak ada penembolokan sama sekali, pendekatan terbaik adalah memuat data tabel pencarian secara proaktif ke dalam cache saat pengaktifan aplikasi.

Dalam tutorial ini kita akan melihat cara menyimpan data tabel pencarian cache dan informasi statis lainnya.

Langkah 2: Memeriksa Berbagai Cara untuk Cache Data

Informasi dapat di-cache secara terprogram dalam aplikasi ASP.NET menggunakan berbagai pendekatan. Kami telah melihat cara menggunakan cache data dalam tutorial sebelumnya. Atau, objek dapat di-cache secara terprogram menggunakan anggota statis atau status aplikasi.

Saat bekerja dengan kelas, biasanya kelas harus diinstansiasi terlebih dahulu sebelum anggotanya dapat diakses. Misalnya, untuk memanggil metode dari salah satu kelas di Lapisan Logika Bisnis kami, kita harus terlebih dahulu membuat instans kelas:

ProductsBLL productsAPI = new ProductsBLL();
productsAPI.SomeMethod();
productsAPI.SomeProperty = "Hello, World!";

Sebelum kita dapat memanggil SomeMethod atau bekerja dengan SomeProperty, kita harus terlebih dahulu membuat instans kelas menggunakan new kata kunci. SomeMethod dan SomeProperty dikaitkan dengan instans tertentu. Masa pakai anggota ini terkait dengan masa pakai objek terkait mereka. Anggota statis, di sisi lain, adalah variabel, properti, dan metode yang dibagikan di antara semua instans kelas dan, akibatnya, memiliki masa pakai selama kelas. Anggota statis ditandai dengan kata kunci static.

Selain anggota statis, data dapat di-cache menggunakan status aplikasi. Setiap aplikasi ASP.NET mempertahankan koleksi nama/nilai yang dibagikan di semua pengguna dan halaman aplikasi. Koleksi ini dapat diakses menggunakan properti HttpContext kelasApplication, dan digunakan dari kelas code-behind halaman ASP.NET seperti:

Application["key"] = value;
object value = Application["key"];

Cache data menyediakan API yang jauh lebih kaya untuk perangkat cache, memungkinkan mekanisme untuk kedaluwarsa berdasarkan waktu dan ketergantungan, prioritas item cache, dan sebagainya. Dengan anggota statis dan status aplikasi, fitur tersebut harus ditambahkan secara manual oleh pengembang halaman. Namun, saat penyimpanan data pada saat aplikasi dimulai untuk masa pakai aplikasi, keunggulan cache data menjadi tidak relevan. Dalam tutorial ini kita akan memeriksa kode yang menggunakan ketiga teknik untuk pencaching data statis.

Langkah 3: PenembolokanSuppliersData Tabel

Tabel database Northwind yang telah kami terapkan hingga saat ini tidak menyertakan tabel pencarian tradisional apa pun. Empat DataTable yang diimplementasikan dalam DAL kami semua tabel model yang nilainya non-statis. Daripada menghabiskan waktu untuk menambahkan DataTable baru ke DAL dan kemudian kelas dan metode baru ke BLL, untuk tutorial ini mari kita anggap saja bahwa Suppliers data tabel statis. Oleh karena itu, kita dapat menyimpan data ini di startup aplikasi.

Untuk memulai, buat kelas baru bernama StaticCache.cs di CL folder .

Membuat Kelas StaticCache.cs di Folder CL

Gambar 2: Buat StaticCache.cs Kelas di CL Folder

Kita perlu menambahkan metode yang memuat data saat startup ke penyimpanan cache yang sesuai, serta metode yang mengembalikan data dari cache ini.

[System.ComponentModel.DataObject]
public class StaticCache
{
    private static Northwind.SuppliersDataTable suppliers = null;
    public static void LoadStaticCache()
    {
        // Get suppliers - cache using a static member variable
        SuppliersBLL suppliersBLL = new SuppliersBLL();
        suppliers = suppliersBLL.GetSuppliers();
    }
    [DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
    public static Northwind.SuppliersDataTable GetSuppliers()
    {
        return suppliers;
    }
}

Kode di atas menggunakan variabel anggota statis suppliers untuk menahan hasil dari metode SuppliersBLL dari kelas GetSuppliers(), yang dipanggil dari metode LoadStaticCache(). Metode LoadStaticCache() ini dimaksudkan untuk dipanggil selama awal aplikasi. Setelah data ini dimuat saat startup aplikasi, halaman apa pun yang perlu bekerja dengan data pemasok dapat memanggil StaticCache metode kelas GetSuppliers() . Oleh karena itu, panggilan ke database untuk mendapatkan pemasok hanya terjadi sekali, pada awal aplikasi.

Daripada menggunakan variabel anggota statis sebagai penyimpanan cache, kita dapat menggunakan status aplikasi atau cache data secara alternatif. Kode berikut menunjukkan kelas yang dikustomisasi ulang untuk memanfaatkan status aplikasi.

[System.ComponentModel.DataObject]
public class StaticCache
{
    public static void LoadStaticCache()
    {
        // Get suppliers - cache using application state
        SuppliersBLL suppliersBLL = new SuppliersBLL();
        HttpContext.Current.Application["key"] = suppliersBLL.GetSuppliers();
    }
    [DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
    public static Northwind.SuppliersDataTable GetSuppliers()
    {
        return HttpContext.Current.Application["key"] as Northwind.SuppliersDataTable;
    }
}

Dalam LoadStaticCache(), informasi pemasok disimpan ke kunci variabel aplikasi. Ini dikembalikan sebagai jenis yang sesuai (Northwind.SuppliersDataTable) dari GetSuppliers(). Meskipun status aplikasi dapat diakses di kelas code-behind halaman ASP.NET menggunakan Application["key"], dalam arsitektur yang harus kita gunakan HttpContext.Current.Application["key"] untuk mendapatkan yang saat ini HttpContext.

Demikian juga, cache data dapat digunakan sebagai penyimpanan cache, seperti yang ditunjukkan oleh kode berikut:

[System.ComponentModel.DataObject]
public class StaticCache
{
    public static void LoadStaticCache()
    {
        // Get suppliers - cache using the data cache
        SuppliersBLL suppliersBLL = new SuppliersBLL();
        HttpRuntime.Cache.Insert(
          /* key */                "key", 
          /* value */              suppliers, 
          /* dependencies */       null, 
          /* absoluteExpiration */ Cache.NoAbsoluteExpiration, 
          /* slidingExpiration */  Cache.NoSlidingExpiration, 
          /* priority */           CacheItemPriority.NotRemovable, 
          /* onRemoveCallback */   null);
    }
    [DataObjectMethodAttribute(DataObjectMethodType.Select, true)]
    public static Northwind.SuppliersDataTable GetSuppliers()
    {
        return HttpRuntime.Cache["key"] as Northwind.SuppliersDataTable;
    }
}

Untuk menambahkan item ke cache data tanpa kedaluwarsa berbasis waktu, gunakan System.Web.Caching.Cache.NoAbsoluteExpiration nilai dan System.Web.Caching.Cache.NoSlidingExpiration sebagai parameter input. Kelebihan khusus metode cache Insert data ini dipilih sehingga kami dapat menentukan prioritas item cache. Prioritas digunakan untuk menentukan item apa yang akan diaiskan dari cache ketika memori yang tersedia hampir habis. Di sini kita menggunakan prioritas NotRemovable, yang memastikan bahwa item cache ini tidak akan dihapus.

Nota

Unduhan tutorial ini mengimplementasikan StaticCache kelas menggunakan pendekatan variabel anggota statis. Kode untuk status aplikasi dan teknik cache data tersedia dalam komentar dalam file kelas.

Langkah 4: Menjalankan Kode di Startup Aplikasi

Untuk menjalankan kode ketika aplikasi web pertama kali dimulai, kita perlu membuat file khusus bernama Global.asax. File ini dapat berisi penanganan aktivitas untuk peristiwa tingkat aplikasi, sesi, dan permintaan, dan di sinilah kita dapat menambahkan kode yang akan dijalankan setiap kali aplikasi dimulai.

Global.asax Tambahkan file ke direktori akar aplikasi web Anda dengan mengklik kanan nama proyek situs web di Penjelajah Solusi Visual Studio dan memilih Tambahkan Item Baru. Dari kotak dialog Tambahkan Item Baru, pilih tipe item Kelas Aplikasi Global lalu klik tombol Tambahkan.

Nota

Jika Anda sudah memiliki Global.asax file dalam proyek Anda, tipe item Kelas Aplikasi Global tidak akan tercantum dalam kotak dialog Tambahkan Item Baru.

Tambahkan File Global.asax ke Direktori Akar Aplikasi Web Anda

Gambar 3: Tambahkan Global.asax File ke Direktori Akar Aplikasi Web Anda (Klik untuk melihat gambar ukuran penuh)

Templat file default Global.asax mencakup lima metode dalam tag sisi <script> server:

  • Application_Start dijalankan ketika aplikasi web pertama kali dimulai
  • Application_End berjalan ketika aplikasi dimatikan
  • Application_Error dijalankan setiap kali pengecualian yang tidak tertangani mencapai aplikasi
  • Session_Start dijalankan ketika sesi baru dibuat
  • Session_End berfungsi saat sesi kedaluwarsa atau dihentikan

Penanganan kejadian Application_Start hanya dipanggil sekali selama siklus hidup sebuah aplikasi. Aplikasi mulai berjalan pertama kali saat sumber daya ASP.NET diminta dari aplikasi dan terus berjalan sampai aplikasi dimulai ulang, yang dapat terjadi dengan memodifikasi konten di folder /Bin, memodifikasi Global.asax, memodifikasi konten di folder App_Code, atau memodifikasi file Web.config, di antara penyebab lainnya. Lihat Ringkasan Siklus Hidup Aplikasi ASP.NET untuk diskusi yang lebih rinci tentang siklus hidup aplikasi.

Untuk tutorial ini, kita hanya perlu menambahkan kode ke Application_Start metode , jadi jangan ragu untuk menghapus yang lain. Dalam Application_Start, cukup panggil StaticCache metode kelas LoadStaticCache() , yang akan memuat dan menyimpan informasi pemasok:

<%@ Application Language="C#" %>
<script runat="server">
    void Application_Start(object sender, EventArgs e) 
    {
        StaticCache.LoadStaticCache();
    }
</script>

Hanya itu saja! Pada startup aplikasi, LoadStaticCache() metode ini akan mengambil informasi pemasok dari BLL, dan menyimpannya dalam variabel anggota statis (atau penyimpanan cache apa pun yang akhirnya Anda gunakan di StaticCache kelas). Untuk memverifikasi perilaku ini, atur titik henti dalam Application_Start metode dan jalankan aplikasi Anda. Perhatikan bahwa titik henti dicapai pada saat aplikasi mulai berjalan. Namun, permintaan berikutnya tidak menyebabkan Application_Start metode dijalankan.

Gunakan Titik Henti untuk Memverifikasi bahwa Penanganan Aktivitas Application_Start Sedang Dijalankan

Gambar 4: Gunakan Poin Pengecekan untuk Memverifikasi bahwa Application_Start Pengendali Peristiwa Sedang Dijalankan (Klik untuk melihat gambar ukuran penuh)

Nota

Jika Anda tidak mencapai titik henti Application_Start saat pertama kali memulai penelusuran kesalahan, itu karena aplikasi Anda sudah berjalan. Paksa aplikasi untuk memulai ulang dengan memodifikasi file atau Global.asax AndaWeb.config, lalu coba lagi. Anda cukup menambahkan (atau menghapus) baris kosong di akhir salah satu file ini untuk memulai ulang aplikasi dengan cepat.

Langkah 5: Menampilkan Data yang Di-cache

Pada saat ini, kelas StaticCache memiliki versi data pemasok yang telah di-cache pada saat startup aplikasi, dan dapat diakses melalui metode GetSuppliers(). Untuk bekerja dengan data ini dari Lapisan Presentasi, kita dapat menggunakan ObjectDataSource atau secara terprogram memanggil metode dari kelas StaticCacheGetSuppliers() dari kelas code-behind halaman ASP.NET. Mari kita lihat menggunakan kontrol ObjectDataSource dan GridView untuk menampilkan informasi pemasok yang di-cache.

Mulailah dengan membuka AtApplicationStartup.aspx halaman di Caching folder. Seret GridView dari Kotak Alat ke perancang, atur propertinya ID ke Suppliers. Selanjutnya, dari tag pintar GridView pilih untuk membuat ObjectDataSource baru bernama SuppliersCachedDataSource. Konfigurasikan ObjectDataSource untuk menggunakan kelas StaticCache metode GetSuppliers().

Mengonfigurasi ObjectDataSource untuk menggunakan Kelas StaticCache

Gambar 5: Konfigurasikan ObjectDataSource untuk menggunakan StaticCache Kelas (Klik untuk melihat gambar ukuran penuh)

Gunakan Metode GetSuppliers() untuk Mengambil Data Pemasok Cache

Gambar 6: Gunakan GetSuppliers() Metode untuk Mengambil Data Pemasok Singgahan (Klik untuk melihat gambar ukuran penuh)

Setelah menyelesaikan wizard, Visual Studio akan secara otomatis menambahkan BoundFields untuk setiap bidang data di SuppliersDataTable. Markup deklaratif GridView dan ObjectDataSource Anda akan terlihat mirip dengan yang berikut ini:

<asp:GridView ID="Suppliers" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="SupplierID" DataSourceID="SuppliersCachedDataSource" 
    EnableViewState="False">
    <Columns>
        <asp:BoundField DataField="SupplierID" HeaderText="SupplierID" 
            InsertVisible="False" ReadOnly="True" 
            SortExpression="SupplierID" />
        <asp:BoundField DataField="CompanyName" HeaderText="CompanyName" 
            SortExpression="CompanyName" />
        <asp:BoundField DataField="Address" HeaderText="Address" 
            SortExpression="Address" />
        <asp:BoundField DataField="City" HeaderText="City" 
            SortExpression="City" />
        <asp:BoundField DataField="Country" HeaderText="Country" 
            SortExpression="Country" />
        <asp:BoundField DataField="Phone" HeaderText="Phone" 
            SortExpression="Phone" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="SuppliersCachedDataSource" runat="server" 
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetSuppliers" TypeName="StaticCache" />

Gambar 7 memperlihatkan halaman saat ditampilkan melalui browser. Outputnya sama jika kami menarik data dari kelas BLL SuppliersBLL , tetapi menggunakan StaticCache kelas mengembalikan data pemasok seperti yang di-cache pada startup aplikasi. Anda dapat mengatur titik henti dalam StaticCache metode kelas GetSuppliers() untuk memverifikasi perilaku ini.

Data Pemasok Yang Di-cache Ditampilkan dalam GridView

Gambar 7: Data Pemasok yang Disimpan dalam Cache Ditampilkan dalam GridView (Klik untuk melihat gambar ukuran penuh)

Ringkasan

Sebagian besar setiap model data berisi sejumlah besar data statis, biasanya diimplementasikan dalam bentuk tabel pencarian. Karena informasi ini statis, tidak ada alasan untuk terus mengakses database setiap kali informasi ini perlu ditampilkan. Selain itu, karena sifatnya yang statis, saat melakukan caching data tidak diperlukan pengaturan waktu kadaluwarsa. Dalam tutorial ini kita melihat cara mengambil data tersebut dan menyimpannya di cache data, status aplikasi, dan melalui variabel anggota statis. Informasi ini di-cache pada pengaktifan aplikasi dan tetap berada di cache selama masa pakai aplikasi.

Dalam tutorial ini dan dua tutorial sebelumnya, kami telah melihat penyimpanan sementara data selama durasi masa pakai aplikasi serta menggunakan kedaluwarsa berbasis waktu. Namun, ketika melakukan caching data database, kedaluwarsa berbasis waktu mungkin kurang ideal. Daripada secara berkala menghapus cache, akan optimal untuk hanya mengeluarkan item yang di-cache ketika data database yang mendasar dimodifikasi. Ideal ini dimungkinkan melalui penggunaan dependensi cache SQL, yang akan kita periksa dalam tutorial berikutnya.

Selamat Pemrograman!

Tentang Penulis

Scott Mitchell, penulis tujuh buku ASP/ASP.NET dan pendiri 4GuysFromRolla.com, telah bekerja sama dengan teknologi Microsoft Web sejak 1998. Scott bekerja sebagai konsultan, pelatih, dan penulis independen. Buku terbarunya adalah Sams Teach Yourself ASP.NET 2.0 dalam 24 Jam. Dia dapat dijangkau di mitchell@4GuysFromRolla.com.

Ucapan terima kasih khusus kepada

Seri tutorial ini ditinjau oleh banyak peninjau yang bermanfaat. Peninjau utama untuk tutorial ini adalah Teresa Murphy dan Zack Jones. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.