Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Scott Mitchell
Penembolokan dapat menentukan apakah aplikasi Web menjadi lambat atau cepat. Tutorial ini adalah yang pertama dari empat yang melihat cache secara terperinci dalam ASP.NET. Pelajari konsep utama penembolokan dan cara menerapkan penembolokan ke Lapisan Presentasi melalui kontrol ObjectDataSource.
Pendahuluan
Dalam ilmu komputer, caching adalah proses mengambil data atau informasi yang mahal untuk diperoleh dan menyimpan salinannya di lokasi yang lebih cepat diakses. Untuk aplikasi berbasis data, kueri besar dan kompleks biasanya menggunakan sebagian besar waktu eksekusi aplikasi. Performa aplikasi seperti itu, kemudian, sering dapat ditingkatkan dengan menyimpan hasil kueri database yang mahal dalam memori aplikasi.
ASP.NET 2.0 menawarkan berbagai opsi caching. Seluruh halaman web atau markup yang dirender oleh Kontrol Pengguna dapat di-cache melalui caching output. Kontrol ObjectDataSource dan SqlDataSource juga menyediakan fitur caching, sehingga memungkinkan pencaching data pada tingkat kontrol. Dan data cache ASP.NET menyediakan API cache yang kaya fitur yang memfasilitasi pengembang halaman untuk menyimpan objek secara terprogram. Dalam tutorial ini dan tiga tutorial berikutnya kita akan memeriksa penggunaan fitur caching ObjectDataSource serta penyimpanan data sementara. Kami juga akan mengeksplorasi cara menyimpan data di seluruh aplikasi saat startup dan cara menjaga data cache tetap segar melalui penggunaan dependensi cache SQL. Tutorial-tutorial ini tidak membahas penyimpanan sementara output. Untuk melihat pengemacetan output secara terperinci, lihat Pengemacetan Output di ASP.NET 2.0.
Caching dapat diterapkan di mana saja dalam arsitektur, dari Lapisan Akses Data hingga Lapisan Presentasi. Dalam tutorial ini kita akan melihat penggunaan cache pada lapisan presentasi melalui kontrol ObjectDataSource. Di tutorial selanjutnya, kita akan membahas penyimpanan sementara data pada Lapisan Logika Bisnis.
Konsep Cache Kunci
Penembolokan dapat sangat meningkatkan performa dan skalabilitas keseluruhan aplikasi dengan mengambil data yang mahal untuk menghasilkan dan menyimpan salinannya di lokasi yang dapat diakses dengan lebih efisien. Karena cache hanya menyimpan salinan dari data aktual yang mendasar, cache tersebut dapat menjadi usang, atau tidak terbaru, jika data yang mendasar berubah. Untuk memerangi hal ini, pengembang halaman dapat menunjukkan kriteria di mana item cache akan dikeluarkan dari cache, menggunakan:
- Kriteria berbasis waktu item dapat ditambahkan ke cache untuk durasi absolut atau geser. Misalnya, pengembang halaman dapat menunjukkan durasi, misalnya, 60 detik. Dengan durasi absolut, item yang di-cache dikeluarkan 60 detik setelah ditambahkan ke cache, terlepas dari seberapa sering item diakses. Dengan durasi geser, item yang di-cache dikeluarkan 60 detik setelah akses terakhir.
- Kriteria berbasis dependensi dependensi dapat dikaitkan dengan item saat ditambahkan ke cache. Ketika dependensi item berubah, itu dikeluarkan dari cache. Dependensinya mungkin file, item cache lain, atau kombinasi keduanya. ASP.NET 2.0 juga memungkinkan dependensi cache SQL, yang memungkinkan pengembang untuk menambahkan item ke cache dan membuatnya dikeluarkan ketika data database yang mendasar berubah. Kami akan memeriksa dependensi cache SQL dalam tutorial Dependensi Cache SQL yang akan datang.
Terlepas dari kriteria penghapusan yang ditentukan, item dalam cache dapat dikeluarkan sebelum kriteria berbasis waktu atau berbasis dependensi telah terpenuhi. Jika cache telah mencapai kapasitasnya, item yang ada harus dihapus sebelum yang baru dapat ditambahkan. Akibatnya, ketika secara terprogram bekerja dengan data cache, sangat penting bahwa Anda selalu berasumsi bahwa data yang di-cache mungkin tidak ada. Kita akan melihat pola yang akan digunakan saat mengakses data dari cache secara terprogram dalam tutorial berikutnya, Caching Data di Arsitektur.
Penembolokan menyediakan cara yang ekonomis untuk meningkatkan kinerja aplikasi. Seperti yang disampaikan Steven Smith dalam artikelnya ASP.NET Caching: Teknik dan Praktik Terbaik:
Caching bisa menjadi cara yang baik untuk mendapatkan kinerja yang cukup memadai tanpa membutuhkan banyak waktu dan analisis. Memori itu murah, jadi jika Anda bisa mendapatkan performa yang Anda butuhkan dengan menyimpan output selama 30 detik daripada menghabiskan satu hari atau seminggu mencoba mengoptimalkan kode atau database Anda, gunakan solusi caching (dengan asumsi data lama 30 detik tidak apa-apa) dan lakukan hal lain. Akhirnya, desain yang buruk mungkin akan mengejar Anda, jadi tentu saja Anda harus mencoba merancang aplikasi Anda dengan benar. Tetapi jika Anda hanya perlu mendapatkan performa yang memadai hari ini, caching bisa menjadi pendekatan yang sangat baik, memberi Anda kesempatan untuk merefaktor aplikasi nanti ketika waktu tersedia.
Meskipun caching dapat memberikan peningkatan performa yang signifikan, itu tidak berlaku dalam semua situasi, seperti dengan aplikasi yang menggunakan data real-time yang sering diperbarui, atau di mana data lama yang tidak bisa diterima tidak dapat dimaafkan. Tetapi untuk sebagian besar aplikasi, cache harus digunakan. Untuk memahami lebih dalam mengenai penyimpanan sementara di ASP.NET 2.0, lihatlah bagian Penyimpanan Sementara untuk Performa dari Tutorial Mulai Cepat ASP.NET 2.0.
Langkah 1: Membuat Halaman Web Caching
Sebelum kita mulai eksplorasi fitur caching ObjectDataSource, mari kita luangkan waktu sejenak untuk membuat halaman ASP.NET dalam proyek situs web kita yang akan kita butuhkan untuk tutorial ini dan tiga tutorial berikutnya. Mulailah dengan menambahkan folder baru bernama Caching
. Selanjutnya, tambahkan halaman ASP.NET berikut ke folder tersebut Site.master
, pastikan untuk mengaitkan setiap halaman dengan halaman master:
Default.aspx
ObjectDataSource.aspx
FromTheArchitecture.aspx
AtApplicationStartup.aspx
SqlCacheDependencies.aspx
Gambar 1: Tambahkan Halaman ASP.NET untuk Tutorial Caching-Related
Seperti di folder lain, Default.aspx
di Caching
folder akan mencantumkan tutorial di bagiannya. Ingat bahwa SectionLevelTutorialListing.ascx
Kontrol Pengguna menyediakan fungsionalitas ini. Oleh karena itu, tambahkan Kontrol Pengguna ini ke Default.aspx
dengan menyeretnya dari Penjelajah Solusi ke tampilan Desain halaman.
Gambar 2: Gambar 2: Tambahkan SectionLevelTutorialListing.ascx
Kontrol Pengguna ke Default.aspx
(Klik untuk melihat gambar ukuran penuh)
Terakhir, tambahkan halaman ini sebagai entri ke Web.sitemap
file. Secara khusus, tambahkan markup berikut setelah Bekerja dengan Data <siteMapNode>
Biner :
<siteMapNode title="Caching" url="~/Caching/Default.aspx"
description="Learn how to use the caching features of ASP.NET 2.0.">
<siteMapNode url="~/Caching/ObjectDataSource.aspx"
title="ObjectDataSource Caching"
description="Explore how to cache data directly from the
ObjectDataSource control." />
<siteMapNode url="~/Caching/FromTheArchitecture.aspx"
title="Caching in the Architecture"
description="See how to cache data from within the
architecture." />
<siteMapNode url="~/Caching/AtApplicationStartup.aspx"
title="Caching Data at Application Startup"
description="Learn how to cache expensive or infrequently-changing
queries at the start of the application." />
<siteMapNode url="~/Caching/SqlCacheDependencies.aspx"
title="Using SQL Cache Dependencies"
description="Examine how to have data automatically expire from the
cache when its underlying database data is modified." />
</siteMapNode>
Setelah memperbarui Web.sitemap
, luangkan waktu sejenak untuk melihat situs web tutorial melalui browser. Menu di sebelah kiri sekarang sudah menyertakan item untuk tutorial penggunaan cache.
Gambar 3: Peta Situs Sekarang Menyertakan Entri untuk Tutorial Penyimpanan Sementara
Langkah 2: Menampilkan Daftar Produk di Halaman Web
Tutorial ini mengeksplorasi cara menggunakan fitur caching bawaan yang dimiliki oleh kontrol ObjectDataSource. Namun, sebelum kita dapat melihat fitur-fitur ini, kita terlebih dahulu membutuhkan halaman untuk bekerja. Mari kita buat halaman web yang menggunakan GridView untuk mencantumkan informasi produk yang diambil oleh ObjectDataSource dari ProductsBLL
kelas .
Mulailah dengan membuka ObjectDataSource.aspx
halaman di Caching
folder. Seret GridView dari Kotak Alat ke Perancang, atur propertinya ID
ke Products
, dan, dari tag pintarnya, pilih untuk mengikatnya ke kontrol ObjectDataSource baru bernama ProductsDataSource
. Konfigurasikan ObjectDataSource untuk bekerja dengan ProductsBLL
kelas .
Gambar 4: Konfigurasikan ObjectDataSource untuk Menggunakan ProductsBLL
Kelas (Klik untuk melihat gambar ukuran penuh)
Untuk halaman ini, mari kita buat GridView yang dapat diedit sehingga kita dapat memeriksa apa yang terjadi ketika data di-cache di ObjectDataSource dimodifikasi melalui antarmuka GridView. Biarkan daftar drop-down di tab SELECT diatur ke defaultnya, GetProducts()
, tetapi ubah item yang dipilih di tab UPDATE menjadi overload UpdateProduct
yang menerima productName
, unitPrice
, dan productID
sebagai parameter inputnya.
Gambar 5: Atur tab UPDATE daftar Drop-Down ke pembebanan yang sesuai UpdateProduct
(Klik untuk melihat gambar ukuran penuh)
Terakhir, atur daftar drop-down di tab INSERT dan DELETE ke (Tidak Ada) dan klik Selesai. Setelah menyelesaikan wizard Konfigurasi Sumber Data, Visual Studio mengatur properti ObjectDataSource OldValuesParameterFormatString
ke original_{0}
. Seperti yang dibahas dalam tutorial Gambaran Umum Menyisipkan, Memperbarui, dan Menghapus Data , properti ini perlu dihapus dari sintaks deklaratif atau diatur kembali ke nilai defaultnya, {0}
, agar alur kerja pembaruan kami dilanjutkan tanpa kesalahan.
Selain itu, setelah penyelesaian wizard, Visual Studio menambahkan bidang baru ke GridView untuk setiap bidang data produk. Hapus semua kecuali ProductName
, , CategoryName
dan UnitPrice
BoundFields. Selanjutnya, perbarui HeaderText
properti masing-masing BoundFields ini ke Produk, Kategori, dan Harga. Karena bidang ProductName
diperlukan, konversikan BoundField menjadi TemplateField dan tambahkan RequiredFieldValidator ke EditItemTemplate
. Demikian pula, konversikan UnitPrice
BoundField menjadi TemplateField dan tambahkan CompareValidator untuk memastikan bahwa nilai yang dimasukkan oleh pengguna adalah nilai mata uang yang valid yang lebih besar dari atau sama dengan nol. Selain modifikasi ini, jangan ragu untuk melakukan perubahan estetika apa pun, seperti meratakan nilai UnitPrice
ke kanan, atau menentukan pemformatan untuk teks UnitPrice
dalam antarmuka baca saja dan pengeditan.
Buat GridView dapat diedit dengan mencentang kotak centang Aktifkan Pengeditan di tag pintar GridView. Centang juga kotak centang Aktifkan Halaman dan Aktifkan Pengurutan.
Nota
Perlu tinjauan tentang cara menyesuaikan antarmuka pengeditan GridView? Jika demikian, lihat kembali tutorial Menyesuaikan Antarmuka Modifikasi Data .
Gambar 6: Aktifkan Dukungan GridView untuk Pengeditan, Pengurutan, dan Penomoran Halaman (Klik untuk melihat gambar ukuran penuh)
Setelah membuat modifikasi GridView ini, markup deklaratif GridView dan ObjectDataSource akan terlihat mirip dengan yang berikut ini:
<asp:GridView ID="Products" runat="server" AutoGenerateColumns="False"
DataKeyNames="ProductID" DataSourceID="ProductsDataSource"
AllowPaging="True" AllowSorting="True">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:TemplateField HeaderText="Product" SortExpression="ProductName">
<EditItemTemplate>
<asp:TextBox ID="ProductName" runat="server"
Text='<%# Bind("ProductName") %>'></asp:TextBox>
<asp:RequiredFieldValidator
ID="RequiredFieldValidator1" Display="Dynamic"
ControlToValidate="ProductName" SetFocusOnError="True"
ErrorMessage="You must provide a name for the product."
runat="server">*</asp:RequiredFieldValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server"
Text='<%# Bind("ProductName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="CategoryName" HeaderText="Category"
ReadOnly="True" SortExpression="CategoryName" />
<asp:TemplateField HeaderText="Price" SortExpression="UnitPrice">
<EditItemTemplate>
$<asp:TextBox ID="UnitPrice" runat="server" Columns="8"
Text='<%# Bind("UnitPrice", "{0:N2}") %>'></asp:TextBox>
<asp:CompareValidator ID="CompareValidator1"
ControlToValidate="UnitPrice" Display="Dynamic"
ErrorMessage="You must enter a valid currency value with no
currency symbols. Also, the value must be greater than
or equal to zero."
Operator="GreaterThanEqual" SetFocusOnError="True"
Type="Currency" runat="server"
ValueToCompare="0">*</asp:CompareValidator>
</EditItemTemplate>
<ItemStyle HorizontalAlign="Right" />
<ItemTemplate>
<asp:Label ID="Label1" runat="server"
Text='<%# Bind("UnitPrice", "{0:c}") %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server"
OldValuesParameterFormatString="{0}" SelectMethod="GetProducts"
TypeName="ProductsBLL" UpdateMethod="UpdateProduct">
<UpdateParameters>
<asp:Parameter Name="productName" Type="String" />
<asp:Parameter Name="unitPrice" Type="Decimal" />
<asp:Parameter Name="productID" Type="Int32" />
</UpdateParameters>
</asp:ObjectDataSource>
Seperti yang ditunjukkan Gambar 7, GridView yang dapat diedit mencantumkan nama, kategori, dan harga setiap produk dalam database. Luangkan waktu sejenak untuk menguji fungsionalitas halaman mengurutkan hasil, menelusuri halaman, dan mengedit rekaman.
Gambar 7: Setiap Nama, Kategori, dan Harga Produk Tercantum dalam GridView yang Dapat Diurutkan, Dapat Dipaginasi, dan Dapat Diedit (Klik untuk melihat gambar ukuran penuh)
Langkah 3: Memeriksa Kapan ObjectDataSource Meminta Data
Products
GridView mengambil datanya untuk ditampilkan dengan memanggil metode Select
dari ProductsDataSource
ObjectDataSource. ObjectDataSource ini membuat instans kelas Lapisan Logika Bisnis ProductsBLL
dan memanggil metodenya GetProducts()
, yang pada gilirannya memanggil metode Lapisan Akses Data ProductsTableAdapter
GetProducts()
. Metode DAL menghubungkan ke database Northwind dan menjalankan kueri yang telah dikonfigurasi SELECT
. Data ini kemudian dikembalikan ke DAL, yang mengemasnya dalam NorthwindDataTable
. Objek DataTable dikembalikan ke BLL, yang mengembalikannya ke ObjectDataSource, yang mengembalikannya ke GridView. GridView kemudian membuat GridViewRow
objek untuk masing-masing DataRow
di DataTable, dan masing-masing GridViewRow
akhirnya dirender ke dalam HTML yang dikembalikan ke klien dan ditampilkan di browser pengunjung.
Urutan peristiwa ini terjadi setiap kali GridView perlu menghubungkan diri dengan sumber data yang mendasarinya. Itu terjadi ketika halaman pertama kali dikunjungi, saat berpindah dari satu halaman data ke halaman lain, saat mengurutkan GridView, atau saat memodifikasi data GridView melalui antarmuka pengeditan atau penghapusan bawaannya. Jika status tampilan GridView dinonaktifkan, GridView juga akan direbound pada setiap postback. GridView juga dapat secara eksplisit rebound ke datanya dengan memanggil metodenya DataBind()
.
Untuk sepenuhnya menghargai frekuensi pengambilan data dari database, mari kita tampilkan pesan yang menunjukkan kapan data diambil kembali. Tambahkan kontrol Web Label di atas GridView bernama ODSEvents
. Hapus propertinya Text
dan atur propertinya EnableViewState
ke False
. Di bawah Label, tambahkan kontrol Web berupa Tombol dan atur propertinya Text
ke Postback.
Gambar 8: Tambahkan Label dan Tombol ke Halaman Di Atas Tampilan Kisi (Klik untuk melihat gambar ukuran penuh)
Selama alur kerja akses data, peristiwa pada ObjectDataSource dipicu Selecting
sebelum objek dasar dibuat dan metode yang dikonfigurasi dipanggil. Buat penanganan aktivitas untuk kejadian ini dan tambahkan kode berikut:
Protected Sub ProductsDataSource_Selecting(sender As Object, _
e As ObjectDataSourceSelectingEventArgs) _
Handles ProductsDataSource.Selecting
ODSEvents.Text = "-- Selecting event fired"
End Sub
Setiap kali ObjectDataSource membuat permintaan ke arsitektur untuk data, Label akan menampilkan teks Memilih peristiwa yang diaktifkan .
Kunjungi halaman ini di browser. Saat halaman pertama kali dikunjungi, teks Memilih peristiwa diaktifkan akan ditampilkan. Klik tombol Postback dan perhatikan bahwa teks menghilang (dengan asumsi bahwa properti GridView s EnableViewState
diatur ke True
, default). Ini karena, pada postback, GridView direkonstruksi dari status tampilan dan dengan demikian tidak bergantung pada ObjectDataSource untuk memperoleh datanya. Pengurutan, pemilahan halaman, atau pengeditan data menyebabkan GridView menghubungkan kembali ke sumber datanya, dan oleh karena itu, teks peristiwa Pemilihan muncul lagi.
Gambar 9: Setiap kali GridView diikat ulang ke sumber datanya, peristiwa pemilihan yang diaktifkan ditampilkan (Klik untuk melihat gambar ukuran penuh)
Gambar 10: Mengklik Tombol Postback Menyebabkan GridView Direkonstruksi dari Status Tampilannya (Klik untuk melihat gambar ukuran penuh)
Mungkin tampak boros untuk mengambil data database setiap kali data dihalamankan atau diurutkan. Lagipula, karena kita menggunakan halaman default, ObjectDataSource telah mengambil semua rekaman saat menampilkan halaman pertama. Bahkan jika GridView tidak memberikan dukungan pengurutan dan penomoran, data harus diambil dari database setiap kali halaman pertama kali dikunjungi oleh pengguna mana pun (dan pada setiap postback, jika status tampilan dinonaktifkan). Tetapi jika GridView menampilkan data yang sama kepada semua pengguna, permintaan database tambahan ini berlebihan. Mengapa tidak menyimpan cache hasil yang dikembalikan dari GetProducts()
metode dan mengikat GridView ke hasil cache tersebut?
Langkah 4: Penampungan Data Menggunakan ObjectDataSource
Hanya dengan mengatur beberapa properti, ObjectDataSource dapat dikonfigurasi untuk secara otomatis menyimpan data yang diambil dalam cache data ASP.NET. Daftar berikut ini merangkum properti terkait cache objectDataSource:
-
EnableCaching harus diatur ke
True
untuk mengaktifkan penembolokan. Defaultnya adalahFalse
. -
CacheDuration jumlah waktu, dalam detik, di mana data disimpan dalam cache. Defaultnya adalah 0. ObjectDataSource hanya akan menyimpan data jika
EnableCaching
adalahTrue
danCacheDuration
diatur ke nilai yang lebih besar dari nol. -
CacheExpirationPolicy dapat diatur ke
Absolute
atauSliding
. JikaAbsolute
, ObjectDataSource menyimpan data yang diambil selamaCacheDuration
beberapa detik; jikaSliding
, data kedaluwarsa hanya setelah tidak diakses selamaCacheDuration
beberapa detik. Defaultnya adalahAbsolute
. -
CacheKeyDependency menggunakan properti ini untuk mengaitkan entri cache ObjectDataSource dengan dependensi cache yang ada. Entri data ObjectDataSource dapat dikeluarkan secara prematur dari cache dengan kedaluwarsa yang terkait
CacheKeyDependency
. Properti ini paling umum digunakan untuk mengaitkan dependensi cache SQL dengan cache ObjectDataSource, topik yang akan kita jelajahi di masa mendatang Menggunakan tutorial Dependensi Cache SQL .
Mari kita konfigurasikan ProductsDataSource
ObjectDataSource untuk menyimpan datanya selama 30 detik pada skala absolut. Atur properti EnableCaching
dari ObjectDataSource ke True
dan propertinya CacheDuration
ke 30. Biarkan properti tetap diatur ke default, CacheExpirationPolicy
.
Gambar 11: Konfigurasikan ObjectDataSource untuk Menyimpan Datanya selama 30 Detik (Klik untuk melihat gambar ukuran penuh)
Simpan perubahan Anda dan kunjungi kembali halaman ini di browser. Teks Memilih peristiwa yang diaktifkan akan muncul saat Anda pertama kali mengunjungi halaman, karena awalnya data tidak ada di cache. Tetapi postback berikutnya yang dipicu dengan mengklik tombol Postback, mengurutkan, mengganti halaman, atau mengklik tombol Edit atau Batalkan tidak menampilkan ulang teks dari event Selecting yang dijalankan. Ini karena Selecting
peristiwa hanya diaktifkan ketika ObjectDataSource mendapatkan datanya dari objek yang mendasarinya; Selecting
peristiwa tidak diaktifkan jika data ditarik dari cache data.
Setelah 30 detik, data akan dikeluarkan dari cache. Data juga akan dikeluarkan dari cache jika metode ObjectDataSource s Insert
, Update
, atau Delete
dipanggil. Akibatnya, setelah 30 detik berlalu atau tombol Perbarui diklik, mengurutkan, menomori halaman, atau mengklik tombol Edit atau Batal akan menyebabkan ObjectDataSource mendapatkan datanya dari objek dasarnya, dan menampilkan teks bahwa peristiwa Pemilihan diaktifkan saat peristiwa Selecting
diaktifkan. Hasil yang dikembalikan ini ditempatkan kembali ke dalam cache data.
Nota
Jika Anda sering melihat teks 'Selecting event fired', bahkan ketika Anda mengharapkan ObjectDataSource bekerja dengan data yang di-cache, itu mungkin disebabkan oleh batasan memori. Jika memori yang tersedia tidak cukup, data yang ditambahkan ke cache oleh ObjectDataSource mungkin telah dihapus. Jika ObjectDataSource tampaknya tidak menyimpan data dengan benar atau hanya menyimpan data secara spora, tutup beberapa aplikasi untuk membebaskan memori dan coba lagi.
Gambar 12 mengilustrasikan alur kerja pencachean ObjectDataSource. Saat teks peristiwa Selecting terpicu muncul di layar Anda, itu karena data tidak ada di cache dan harus diambil dari objek dasar. Namun, ketika teks ini hilang, itu karena data tersedia dari cache. Ketika data dikembalikan dari cache, tidak ada panggilan ke objek yang mendasar dan, oleh karena itu, tidak ada kueri database yang dijalankan.
Gambar 12: ObjectDataSource Menyimpan dan Mengambil Datanya dari Cache Data
Setiap aplikasi ASP.NET memiliki instans cache data sendiri yang dibagikan di semua halaman dan pengunjung. Itu berarti bahwa data yang disimpan dalam cache data oleh ObjectDataSource juga dibagikan di semua pengguna yang mengunjungi halaman. Untuk memverifikasi ini, buka ObjectDataSource.aspx
halaman di browser. Saat Anda pertama kali mengakses halaman, teks 'Selecting event fired' akan muncul (dengan asumsi bahwa data yang sebelumnya ditambahkan ke cache oleh pengujian sebelumnya sekarang telah dikeluarkan dari cache). Buka instans browser kedua dan salin dan tempel URL dari instans browser pertama ke yang kedua. Di instans browser kedua, teks peristiwa Pemilihan terpicu tidak ditampilkan karena menggunakan data cache yang sama dengan yang pertama.
Saat menyisipkan data yang diambil ke dalam cache, ObjectDataSource menggunakan nilai kunci cache yang mencakup: nilai-nilai properti CacheDuration
dan CacheExpirationPolicy
; jenis objek bisnis yang mendasar yang digunakan oleh ObjectDataSource, yang ditentukan melalui properti TypeName
(ProductsBLL
, dalam contoh ini); nilai properti SelectMethod
serta nama dan nilai parameter dalam koleksi SelectParameters
; dan nilai-nilai properti StartRowIndex
dan MaximumRows
, yang digunakan saat mengimplementasikan paging kustom.
Membuat nilai kunci cache sebagai kombinasi dari properti ini memastikan entri cache unik saat nilai-nilai ini berubah. Misalnya, dalam tutorial sebelumnya kita telah melihat menggunakan ProductsBLL
kelas , GetProductsByCategoryID(categoryID)
yang mengembalikan semua produk untuk kategori tertentu. Satu pengguna mungkin datang ke halaman dan melihat minuman, yang memiliki CategoryID
dengan nilai 1. Jika ObjectDataSource menyimpan hasilnya tanpa mempedulikan nilai-nilai SelectParameters
, ketika pengguna lain datang ke halaman untuk melihat bumbu sementara produk minuman tersimpan di cache, mereka akan melihat produk minuman yang tersimpan di cache daripada bumbu. Dengan memvariasikan kunci cache oleh properti ini, yang mencakup nilai SelectParameters
, ObjectDataSource mempertahankan entri cache terpisah untuk minuman dan bumbu.
Kekhawatiran tentang Data Kedaluarsa
ObjectDataSource secara otomatis mengeluarkan itemnya dari cache ketika salah satu metode Insert
, , Update
atau Delete
dipanggil. Ini membantu melindungi dari data kedaluarsa dengan menghapus entri cache saat data dimodifikasi melalui halaman. Namun, dimungkinkan bagi ObjectDataSource dengan menggunakan pencaching untuk tetap menampilkan data yang sudah usang. Dalam kasus paling sederhana, itu bisa disebabkan oleh data yang berubah langsung dalam database. Mungkin administrator database baru saja menjalankan skrip yang memodifikasi beberapa rekaman dalam database.
Skenario ini juga dapat terungkap dengan cara yang lebih halus. Sementara ObjectDataSource mengeluarkan itemnya dari cache ketika salah satu metode modifikasi datanya dipanggil, item yang di-cache dihapus adalah untuk kombinasi nilai properti tertentu ObjectDataSource (CacheDuration
, , TypeName
, SelectMethod
dan sebagainya). Jika Anda memiliki dua ObjectDataSources yang menggunakan SelectMethods
atau SelectParameters
yang berbeda, tetapi masih dapat memperbarui data yang sama, maka satu ObjectDataSource dapat memperbarui baris dan menghapus entri cache-nya sendiri, tetapi baris yang sesuai untuk ObjectDataSource kedua masih akan diambil dari cache. Saya mendorong Anda untuk membuat halaman untuk menunjukkan fungsionalitas ini. Buat halaman yang menampilkan GridView yang dapat diedit dan mengambil datanya dari ObjectDataSource yang menggunakan cache, serta dikonfigurasi untuk mendapatkan data dari metode ProductsBLL
dalam kelas GetProducts()
. Tambahkan GridView dan ObjectDataSource lain yang dapat diedit ke halaman ini (atau yang lain), tetapi untuk ObjectDataSource kedua ini, gunakan metode .GetProductsByCategoryID(categoryID)
Karena dua properti ObjectDataSources SelectMethod
berbeda, mereka masing-masing akan memiliki nilai cache sendiri. Jika Anda mengedit produk dalam satu kisi, lain kali Anda mengikat data kembali ke kisi lain (dengan penomoran, pengurutan, dan sebagainya), produk tersebut masih akan melayani data lama yang di-cache dan tidak mencerminkan perubahan yang dibuat dari kisi lain.
Singkatnya, hanya gunakan kedaluwarsa berbasis waktu jika Anda bersedia memiliki potensi data kedaluwarsa, dan menggunakan kedaluwarsa yang lebih pendek untuk skenario di mana kesegaran data penting. Jika data kadaluarsa tidak dapat diterima, abaikan cache atau gunakan dependensi cache SQL (dengan asumsi itu adalah data database yang Anda cache). Kita akan menjelajahi dependensi cache SQL dalam tutorial mendatang.
Ringkasan
Dalam tutorial ini kami memeriksa kemampuan penyimpanan yang bawaan ObjectDataSource. Dengan hanya mengatur beberapa properti, kita dapat menginstruksikan ObjectDataSource untuk mencache hasil yang dikembalikan dari SelectMethod
yang ditentukan ke dalam cache data ASP.NET. Properti CacheDuration
dan CacheExpirationPolicy
menunjukkan durasi item di-cache dan apakah itu kedaluwarsa absolut atau geser. Properti CacheKeyDependency
mengaitkan semua entri cache ObjectDataSource dengan dependensi cache yang ada. Ini dapat digunakan untuk mengeluarkan entri ObjectDataSource dari cache sebelum kedaluwarsa berbasis waktu tercapai, dan biasanya digunakan dengan dependensi cache SQL.
Karena ObjectDataSource hanya menyimpan nilainya ke cache data, kita dapat mereplikasi fungsionalitas bawaan ObjectDataSource secara terprogram. Tidak masuk akal untuk melakukan ini di Lapisan Presentasi, karena ObjectDataSource menawarkan fungsionalitas ini yang langsung tersedia, tetapi kita dapat menerapkan kemampuan penyimpanan dalam cache di lapisan arsitektur terpisah. Untuk melakukannya, kita harus mengulangi logika yang sama yang digunakan oleh ObjectDataSource. Kita akan mengeksplorasi cara bekerja secara terprogram dengan cache data dari dalam arsitektur dalam tutorial berikutnya.
Selamat Pemrograman!
Bacaan Lebih Lanjut
Untuk informasi selengkapnya tentang topik yang dibahas dalam tutorial ini, lihat sumber daya berikut:
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. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.