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
Strategi penyimpanan cache yang paling sederhana adalah memungkinkan data cache kedaluwarsa setelah periode waktu tertentu. Tetapi pendekatan sederhana ini berarti bahwa data yang di-cache tidak mempertahankan hubungan dengan sumber data yang mendasarnya, yang mengakibatkan data kedaluwarsa yang disimpan terlalu lama atau data saat ini yang kedaluwarsa terlalu cepat. Pendekatan yang lebih baik adalah menggunakan kelas SqlCacheDependency sehingga data tetap di-cache hingga data yang mendasarinya telah dimodifikasi dalam database SQL. Tutorial ini menunjukkan caranya.
Pendahuluan
Teknik penyimpanan sementara yang diperiksa dalam Data Penembolokan dengan ObjectDataSource dan Data Penembolokan dalam Arsitektur menggunakan kedaluwarsa berbasis waktu untuk membuang data dari cache setelah periode yang ditentukan. Pendekatan ini adalah cara paling sederhana untuk menyeimbangkan peningkatan kinerja caching terhadap ketidakmutakhiran data. Dengan memilih kedaluwarsa waktu x detik, pengembang halaman mengakui untuk menikmati manfaat performa caching hanya selama x detik, tetapi dapat merasa tenang bahwa datanya tidak akan pernah usang lebih lama daripada maksimum x detik. Tentu saja, untuk data statis, x dapat diperluas hingga masa pakai aplikasi web, seperti yang diperiksa dalam tutorial Caching Data at Application Startup .
Saat menyimpan sementara data dari basis data, kedaluwarsa berbasis waktu sering kali dipilih karena kemudahan penggunaannya, tetapi sering kali merupakan solusi yang tidak memadai. Idealnya, data akan tetap di-cache hingga data yang mendasar diubah di dalam database; baru kemudian cache akan dikeluarkan. Pendekatan ini memaksimalkan manfaat performa cache dan meminimalkan durasi data basi. Namun, untuk menikmati manfaat ini harus ada beberapa sistem di tempat yang mengetahui kapan data database yang mendasar telah dimodifikasi dan mengeluarkan item yang sesuai dari cache. Sebelum ASP.NET 2.0, pengembang halaman bertanggung jawab untuk menerapkan sistem ini.
ASP.NET 2.0 menyediakan SqlCacheDependency kelas dan infrastruktur yang diperlukan untuk menentukan kapan perubahan telah terjadi dalam database sehingga item cache yang sesuai dapat dikeluarkan. Ada dua teknik untuk menentukan kapan data yang mendasar telah berubah: pemberitahuan dan polling. Setelah membahas perbedaan antara pemberitahuan dan polling, kami akan membuat infrastruktur yang diperlukan untuk mendukung polling dan kemudian menjelajahi cara menggunakan SqlCacheDependency kelas dalam skenario deklaratif dan terprogram.
Memahami Pemberitahuan dan Jajak Pendapat
Ada dua teknik yang dapat digunakan untuk menentukan kapan data dalam database telah dimodifikasi: pemberitahuan dan polling. Dengan pemberitahuan, database secara otomatis memberitahu runtime ASP.NET ketika hasil kueri tertentu telah diubah sejak kueri terakhir kali dijalankan, sehingga item cache yang terkait dengan kueri dihapus dari cache. Dengan polling, server database mempertahankan informasi tentang kapan tabel tertentu terakhir kali diperbarui. Runtime ASP.NET secara berkala melakukan polling database untuk memeriksa tabel apa yang telah berubah sejak dimasukkan ke dalam cache. Tabel yang datanya telah diubah memiliki item cache terkait yang diusir.
Opsi pemberitahuan memerlukan lebih sedikit penyiapan daripada polling dan lebih terperinci karena melacak perubahan pada tingkat kueri daripada di tingkat tabel. Sayangnya, pemberitahuan hanya tersedia dalam edisi lengkap Microsoft SQL Server 2005 (yaitu, edisi non-Ekspres). Namun, opsi polling dapat digunakan untuk semua versi Microsoft SQL Server dari 7.0 hingga 2005. Karena tutorial ini menggunakan edisi Ekspres SQL Server 2005, kami akan fokus pada penyiapan dan penggunaan opsi polling. Lihat bagian Bacaan Lebih Lanjut di akhir tutorial ini untuk sumber daya lebih lanjut tentang kemampuan pemberitahuan SQL Server 2005.
Dengan polling, database harus dikonfigurasi untuk menyertakan tabel bernama AspNet_SqlCacheTablesForChangeNotification yang memiliki tiga kolom - tableName, notificationCreated, dan changeId. Tabel ini berisi baris untuk setiap tabel yang memiliki data yang mungkin perlu digunakan dalam dependensi cache SQL di aplikasi web. Kolom tableName menentukan nama tabel sambil notificationCreated menunjukkan tanggal dan waktu baris ditambahkan ke tabel. Kolom changeId berjenis int dan memiliki nilai awal 0. Nilainya meningkat dengan setiap modifikasi pada tabel.
Selain AspNet_SqlCacheTablesForChangeNotification tabel, database juga perlu menyertakan pemicu pada setiap tabel yang mungkin muncul dalam dependensi cache SQL. Pemicu ini dijalankan setiap kali baris disisipkan, diperbarui, atau dihapus dan meningkatkan nilai tabel changeId dalam AspNet_SqlCacheTablesForChangeNotification.
Komponen runtime ASP.NET melacak changeId saat ini untuk tabel ketika melakukan caching data menggunakan objek SqlCacheDependency. Database diperiksa secara berkala dan objek apa pun SqlCacheDependency yang changeId berbeda dari nilai dalam database dikeluarkan karena nilai yang berbeda changeId menunjukkan bahwa telah ada perubahan pada tabel sejak data di-cache.
Langkah Pertama: Menjelajahi Program Baris Perintah
Dengan pendekatan polling, database harus disiapkan untuk berisi infrastruktur yang dijelaskan di atas: tabel yang telah ditentukan sebelumnya (AspNet_SqlCacheTablesForChangeNotification), beberapa prosedur tersimpan, dan pemicu pada setiap tabel yang dapat digunakan dalam dependensi cache SQL di aplikasi web. Tabel, prosedur tersimpan, dan pemicu ini dapat dibuat melalui program aspnet_regsql.exebaris perintah , yang ditemukan di $WINDOWS$\Microsoft.NET\Framework\version folder . Untuk membuat AspNet_SqlCacheTablesForChangeNotification tabel dan prosedur tersimpan terkait, jalankan yang berikut ini dari baris perintah:
/* For SQL Server authentication... */
aspnet_regsql.exe -S server -U user -P password -d database -ed
/* For Windows Authentication... */
aspnet_regsql.exe -S server -E -d database -ed
Nota
Untuk menjalankan perintah ini, login database yang ditentukan harus berada dalam peran db_securityadmin dan db_ddladmin.
Misalnya, untuk menambahkan infrastruktur untuk polling ke database Microsoft SQL Server yang dinamai pubs di server database bernama ScottsServer menggunakan Autentikasi Windows, navigasikan ke direktori yang sesuai dan, dari baris perintah, masukkan:
aspnet_regsql.exe -S ScottsServer -E -d pubs -ed
Setelah infrastruktur tingkat database ditambahkan, kita perlu menambahkan pemicu ke tabel yang akan digunakan dalam dependensi cache SQL. Gunakan program baris perintah aspnet_regsql.exe lagi, tetapi tentukan nama tabel menggunakan sakelar -t dan alih-alih menggunakan sakelar -ed, gunakan -et, seperti:
/* For SQL Server authentication... */
aspnet_regsql.exe -S <i>server</i>
-U <i>user</i> -P <i>password</i> -d <i>database</i> -t <i>tableName</i> -et
/* For Windows Authentication... */
aspnet_regsql.exe -S <i>server</i>
-E -d <i>database</i> -t <i>tableName</i> -et
Untuk menambahkan pemicu ke tabel authors dan titles pada database pubs pada ScottsServer, gunakan:
aspnet_regsql.exe -S ScottsServer -E -d pubs -t authors -et
aspnet_regsql.exe -S ScottsServer -E -d pubs -t titles -et
Untuk tutorial ini, tambahkan pemicu ke tabel Products, Categories, dan Suppliers. Kita akan melihat sintaks baris perintah tertentu di Langkah 3.
Langkah 2: Mereferensikan Database Edisi Ekspres Microsoft SQL Server 2005 diApp_Data
Program aspnet_regsql.exe baris perintah memerlukan database dan nama server untuk menambahkan infrastruktur polling yang diperlukan. Tetapi apa nama database dan server untuk database Microsoft SQL Server 2005 Express yang berada di App_Data folder? Daripada harus menemukan apa nama database dan server, saya telah menemukan bahwa pendekatan paling sederhana adalah melampirkan database ke localhost\SQLExpress instans database dan mengganti nama data menggunakan SQL Server Management Studio. Jika Anda memiliki salah satu versi lengkap SQL Server 2005 yang terinstal di komputer Anda, maka Anda mungkin sudah menginstal SQL Server Management Studio di komputer Anda. Jika Anda hanya memiliki edisi Ekspres, Anda dapat mengunduh Microsoft SQL Server Management Studio Express Edition gratis.
Mulailah dengan menutup Visual Studio. Selanjutnya, buka SQL Server Management Studio dan pilih untuk menyambungkan ke localhost\SQLExpress server menggunakan Autentikasi Windows.
Gambar 1: Lampirkan ke localhost\SQLExpress Server
Setelah menyambungkan ke server, Management Studio akan menampilkan server dan memiliki subfolder untuk database, keamanan, dan sebagainya. Klik kanan pada folder Database dan pilih opsi Lampirkan. Ini akan memunculkan kotak dialog Lampirkan Database (lihat Gambar 2). Klik tombol Tambahkan dan pilih NORTHWND.MDF folder database di folder aplikasi App_Data web Anda.
Gambar 2: Lampirkan NORTHWND.MDF Database dari App_Data Folder (Klik untuk melihat gambar ukuran penuh)
Ini akan menambahkan database ke folder Database. Nama database mungkin merupakan jalur lengkap ke file database atau jalur lengkap yang ditambahkan dengan GUID. Untuk menghindari harus mengetikkan nama database panjang ini saat menggunakan alat baris perintah aspnet_regsql.exe, ganti nama database menjadi nama yang lebih ramah manusia dengan mengklik kanan pada database yang baru saja dilampirkan dan memilih Ganti Nama. Saya telah mengganti nama database saya menjadi DataTutorials .
Gambar 3: Ubah Nama Database Terlampir Menjadi Nama yang Lebih Human-Friendly
Langkah 3: Menambahkan Infrastruktur Polling ke Database Northwind
Sekarang setelah kita melampirkan NORTHWND.MDF database dari App_Data folder, kita siap untuk menambahkan infrastruktur polling. Dengan asumsi Bahwa Anda telah mengganti nama database menjadi DataTutorials, jalankan empat perintah berikut:
aspnet_regsql.exe -S localhost\SQLExpress -E -d DataTutorials -ed
aspnet_regsql.exe -S localhost\SQLExpress -E -d DataTutorials -t Products -et
aspnet_regsql.exe -S localhost\SQLExpress -E -d DataTutorials -t Categories -et
aspnet_regsql.exe -S localhost\SQLExpress -E -d DataTutorials -t Suppliers -et
Setelah menjalankan keempat perintah ini, klik kanan pada nama database di Management Studio, buka submenu Tugas, dan pilih Lepaskan. Kemudian tutup Management Studio dan buka kembali Visual Studio.
Setelah Visual Studio dibuka kembali, telusuri database melalui Penjelajah Server. Perhatikan tabel baru (AspNet_SqlCacheTablesForChangeNotification), prosedur tersimpan baru, dan pemicu pada tabel Products, Categories, dan Suppliers.
Gambar 4: Database Sekarang Mencakup Infrastruktur Polling yang Diperlukan
Langkah 4: Mengonfigurasi Layanan Polling
Setelah membuat tabel, pemicu, dan prosedur tersimpan yang diperlukan dalam database, langkah terakhir adalah mengonfigurasi layanan polling, yang dilakukan dengan Web.config menentukan database yang akan digunakan dan frekuensi polling dalam milidetik. Kode markup berikut melakukan polling database Northwind setiap detik.
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="NORTHWNDConnectionString" connectionString=
"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\NORTHWND.MDF;
Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient"/>
</connectionStrings>
<system.web>
...
<!-- Configure the polling service used for SQL cache dependencies -->
<caching>
<sqlCacheDependency enabled="true" pollTime="1000" >
<databases>
<add name="NorthwindDB"
connectionStringName="NORTHWNDConnectionString" />
</databases>
</sqlCacheDependency>
</caching>
</system.web>
</configuration>
Nilai name dalam <add> elemen ( NorthwindDB ) mengaitkan nama yang dapat dibaca manusia dengan database tertentu. Saat mengelola dependensi cache SQL, kita perlu merujuk pada nama database yang ditentukan di sini serta pada tabel yang menjadi dasar data yang di-cache. Kita akan melihat cara menggunakan SqlCacheDependency kelas untuk mengaitkan dependensi cache SQL secara terprogram dengan data cache di Langkah 6.
Setelah dependensi cache SQL ditetapkan, sistem polling akan terhubung ke database yang ditentukan dalam elemen <databases> setiap pollTime milidetik dan menjalankan prosedur tersimpan AspNet_SqlCachePollingStoredProcedure. Prosedur tersimpan ini - yang ditambahkan kembali di Langkah 3 menggunakan command line tool aspnet_regsql.exe - mengembalikan nilai tableName dan changeId untuk setiap rekaman di AspNet_SqlCacheTablesForChangeNotification. Dependensi cache SQL yang kedaluarsa dikeluarkan dari cache.
Pengaturan pollTime ini memperkenalkan kompromi antara kinerja dan keusangan data. Nilai kecil pollTime meningkatkan jumlah permintaan ke database, tetapi lebih cepat mengeluarkan data basi dari cache. Nilai yang lebih besar pollTime mengurangi jumlah permintaan database, tetapi meningkatkan penundaan antara ketika data backend berubah dan ketika item cache terkait dikeluarkan. Untungnya, permintaan database menjalankan prosedur tersimpan sederhana yang mengembalikan hanya beberapa baris dari tabel sederhana dan ringan. Tetapi lakukan eksperimen dengan nilai yang berbeda pollTime untuk menemukan keseimbangan ideal antara akses database dan keusangan data untuk aplikasi Anda. Nilai terkecil yang pollTime diizinkan adalah 500.
Nota
Contoh di atas menyediakan satu pollTime nilai dalam <sqlCacheDependency> elemen , tetapi Anda dapat secara opsional menentukan pollTime nilai dalam <add> elemen . Ini berguna jika Anda memiliki beberapa database yang ditentukan dan ingin menyesuaikan frekuensi polling per database.
Langkah 5: Bekerja secara Deklaratif dengan Dependensi Cache SQL
Di Langkah 1 hingga 4 kami melihat cara menyiapkan infrastruktur database yang diperlukan dan mengonfigurasi sistem polling. Dengan adanya infrastruktur ini, kita sekarang dapat menambahkan item ke cache data dengan dependensi cache SQL terkait, baik secara terprogram maupun secara deklaratif. Dalam langkah ini kita akan memeriksa cara bekerja secara deklaratif dengan dependensi cache SQL. Di Langkah 6 kita akan melihat pendekatan terprogram.
Tutorial Caching Data dengan ObjectDataSource menjelajahi kemampuan penembolokan deklaratif ObjectDataSource. Hanya dengan mengatur EnableCaching properti ke true dan CacheDuration properti ke interval waktu tertentu, ObjectDataSource akan secara otomatis menyimpan data yang dikembalikan dari objek dasarnya untuk interval yang ditentukan. ObjectDataSource juga dapat menggunakan satu atau beberapa dependensi cache SQL.
Untuk menunjukkan penggunaan dependensi cache SQL secara deklaratif, buka halaman SqlCacheDependencies.aspx di folder Caching dan seret GridView dari Toolbox ke Desain. Atur GridView ke IDProductsDeclarative dan, dari tag pintarnya, pilih untuk mengikatnya ke ObjectDataSource baru bernama ProductsDataSourceDeclarative.
Gambar 5: Buat ObjectDataSource Baru Bernama ProductsDataSourceDeclarative (Klik untuk melihat gambar ukuran penuh)
Konfigurasikan ObjectDataSource untuk menggunakan ProductsBLL kelas dan atur daftar drop-down di tab SELECT ke GetProducts(). Di tab PEMBARUAN, pilih overloading UpdateProduct dengan tiga parameter input - productName, unitPrice, dan productID. Atur daftar drop-down ke (Tidak Ada) di tab INSERT dan DELETE.
Gambar 6: Gunakan UpdateProduct Overload dengan Tiga Parameter Input (Klik untuk melihat gambar ukuran penuh)
Gambar 7: Atur Daftar Drop-Down ke (Tidak Ada) untuk Tab INSERT dan DELETE (Klik untuk melihat gambar ukuran penuh)
Setelah menyelesaikan wizard Konfigurasi Sumber Data, Visual Studio akan membuat BoundFields dan CheckBoxFields di GridView untuk setiap bidang data. Hapus semua bidang tetapi ProductName, , CategoryNamedan UnitPrice, dan format bidang ini sesuai keinginan Anda. Dari tag pintar GridView, centang kotak aktifkan Halaman, Aktifkan Pengurutan, dan Aktifkan Pengeditan. Visual Studio akan mengatur properti ObjectDataSource ke OldValuesParameterFormatStringoriginal_{0}. Agar fitur edit GridView berfungsi dengan baik, hapus properti ini sepenuhnya dari sintaks deklaratif atau atur kembali ke nilai defaultnya, {0}.
Terakhir, tambahkan kontrol Web Label di atas GridView dan atur propertinya ID ke ODSEvents dan propertinya EnableViewState ke false. Setelah membuat perubahan ini, markup deklaratif halaman Anda akan terlihat mirip dengan yang berikut ini. Perhatikan bahwa saya telah membuat sejumlah kustomisasi estetika ke bidang GridView yang tidak perlu menunjukkan fungsionalitas dependensi cache SQL.
<asp:Label ID="ODSEvents" runat="server" EnableViewState="False" />
<asp:GridView ID="ProductsDeclarative" runat="server"
AutoGenerateColumns="False" DataKeyNames="ProductID"
DataSourceID="ProductsDataSourceDeclarative"
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:RequiredFieldValidator ID="RequiredFieldValidator1"
ControlToValidate="ProductName" Display="Dynamic"
ErrorMessage="You must provide a name for the product."
SetFocusOnError="True"
runat="server">*</asp:RequiredFieldValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server"
Text='<%# Bind("ProductName") %>' />
</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" runat="server"
ControlToValidate="UnitPrice"
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" Display="Dynamic"
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="ProductsDataSourceDeclarative" runat="server"
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>
Selanjutnya, buat penanganan aktivitas untuk peristiwa ObjectDataSource dan Selecting di dalamnya tambahkan kode berikut:
protected void ProductsDataSourceDeclarative_Selecting
(object sender, ObjectDataSourceSelectingEventArgs e)
{
ODSEvents.Text = "-- Selecting event fired";
}
Ingat bahwa peristiwa ObjectDataSource Selecting hanya diaktifkan saat mengambil data dari objek yang mendasarinya. Jika ObjectDataSource mengakses data dari cache miliknya sendiri, kejadian ini tidak terjadi.
Sekarang, kunjungi halaman ini melalui browser. Karena kami belum menerapkan penembolokan apa pun, setiap kali Anda menggeser halaman, mengurutkan, atau mengedit kisi, halaman akan menampilkan teks, 'Acara memilih diaktifkan,' seperti yang ditunjukkan oleh Gambar 8.
Gambar 8: Peristiwa ObjectDataSource Selecting Terpicu Setiap Kali GridView Diubah Halaman, Diedit, atau Diurutkan (Klik untuk melihat gambar ukuran penuh)
Seperti yang kita lihat di Caching Data dengan tutorial ObjectDataSource , mengatur EnableCaching properti untuk true menyebabkan ObjectDataSource menyimpan datanya selama durasi yang ditentukan oleh propertinya CacheDuration . ObjectDataSource juga memiliki SqlCacheDependency properti, yang menambahkan satu atau beberapa dependensi cache SQL ke data yang di-cache menggunakan pola :
databaseName1:tableName1;databaseName2:tableName2;...
Di mana databaseName adalah nama database seperti yang ditentukan dalam name atribut <add> elemen di Web.config, dan tableName adalah nama tabel database. Misalnya, untuk membuat ObjectDataSource yang menyimpan data tanpa batas waktu berdasarkan dependensi cache SQL terhadap tabel Northwind s Products , atur properti ObjectDataSource EnableCaching ke true dan propertinya SqlCacheDependency ke NorthwindDB:Products .
Nota
Anda dapat menggunakan dependensi cache SQL dan kedaluwarsa berbasis waktu dengan mengatur EnableCaching ke true, CacheDuration ke interval waktu, dan SqlCacheDependency ke nama database dan tabel. ObjectDataSource akan mengeluarkan datanya ketika kedaluwarsa berbasis waktu tercapai atau ketika sistem polling mencatat bahwa data database yang mendasar telah berubah, mana pun yang terjadi terlebih dahulu.
GridView dalam SqlCacheDependencies.aspx menampilkan data dari dua tabel - Products dan Categories (bidang produk CategoryName diambil melalui JOIN pada Categories). Oleh karena itu, kami ingin menentukan dua dependensi cache SQL: NorthwindDB:Products; NorthwindDB:Categories .
Gambar 9: Konfigurasikan ObjectDataSource untuk Mendukung Caching Menggunakan Dependensi Cache SQL pada Products dan Categories (Klik untuk melihat gambar ukuran penuh)
Setelah mengonfigurasi ObjectDataSource untuk mendukung penyimpanan sementara, kunjungi kembali halaman melalui browser. Sekali lagi, teks 'Selecting event fired' seharusnya muncul pada kunjungan halaman pertama, tetapi harus menghilang saat penggantian halaman, pengurutan, atau mengklik tombol Edit atau Batalkan. Ini karena setelah data dimuat ke dalam cache ObjectDataSource, data tersebut tetap ada sampai Products tabel atau Categories dimodifikasi atau data diperbarui melalui GridView.
Setelah menelusuri kisi dan mencatat kurangnya teks 'peristiwa Pemilihan diaktifkan', buka jendela browser baru dan navigasikan ke tutorial Dasar di bagian Pengeditan, Penyisipan, dan Penghapusan (~/EditInsertDelete/Basics.aspx). Perbarui nama atau harga produk. Kemudian, dari jendela browser pertama, lihat halaman data yang berbeda, mengurutkan grid, atau mengklik tombol Edit pada baris. Kali ini, 'Kejadian Memilih yang diaktifkan' harus muncul lagi, karena data database yang terletak di bawah telah dimodifikasi (lihat Gambar 10). Jika teks tidak muncul, tunggu beberapa saat dan coba lagi. Ingatlah bahwa layanan polling sedang memeriksa perubahan pada Products tabel setiap pollTime milidetik, sehingga ada penundaan antara ketika data yang mendasar diperbarui dan ketika data yang di-cache dikeluarkan.
Gambar 10: Memodifikasi Tabel Produk Menghapus Data Cache Produk (Klik untuk melihat gambar ukuran penuh)
Langkah 6: Bekerja secara Terprogram denganSqlCacheDependencyKelas
Tutorial Penembolokan Data dalam Arsitektur melihat manfaat menggunakan Lapisan Penembolokan terpisah dalam arsitektur dibandingkan dengan mengkoplorasi penembolokan dengan ObjectDataSource dengan erat. Dalam tutorial itu kita membuat ProductsCL kelas untuk menunjukkan bekerja secara terprogram dengan cache data. Untuk menggunakan dependensi cache SQL di Lapisan Penembolokan, gunakan kelas SqlCacheDependency.
Dengan sistem polling, SqlCacheDependency objek harus dikaitkan dengan database dan pasangan tabel tertentu. Kode berikut, misalnya, membuat SqlCacheDependency objek berdasarkan tabel database Products Northwind:
Caching.SqlCacheDependency productsTableDependency =
new Caching.SqlCacheDependency("NorthwindDB", "Products");
Dua parameter input ke SqlCacheDependency konstruktor adalah nama database dan tabel. Seperti properti ObjectDataSource s SqlCacheDependency , nama database yang digunakan sama dengan nilai yang ditentukan dalam name atribut <add> elemen di Web.config. Nama tabel adalah nama sebenarnya dari tabel database.
Untuk mengaitkan SqlCacheDependency dengan item yang ditambahkan ke cache data, gunakan salah satu metode overload Insert yang menerima dependensi. Kode berikut menambahkan nilai ke cache data untuk durasi yang tidak terbatas, tetapi mengaitkannya dengan SqlCacheDependency pada Products tabel. Singkatnya, nilai akan tetap berada di cache sampai dikeluarkan karena kendala memori atau karena sistem polling telah mendeteksi bahwa Products tabel telah berubah sejak di-cache.
Caching.SqlCacheDependency productsTableDependency =
new Caching.SqlCacheDependency("NorthwindDB", "Products");
Cache.Insert(key,
value,
productsTableDependency,
System.Web.Caching.Cache.NoAbsoluteExpiration,
System.Web.Caching.Cache.NoSlidingExpiration);
Kelas ProductsCL Lapisan Penembolokan saat ini menyimpan data dari tabel Products dengan kedaluwarsa berbasis waktu selama 60 detik. Mari kita perbarui kelas ini sehingga menggunakan dependensi cache SQL sebagai gantinya. Metode ProductsCL kelas, AddCacheItem yang bertanggung jawab untuk menambahkan data ke cache, saat ini berisi kode berikut:
private void AddCacheItem(string rawKey, object value)
{
System.Web.Caching.Cache DataCache = HttpRuntime.Cache;
// Make sure MasterCacheKeyArray[0] is in the cache
DataCache[MasterCacheKeyArray[0]] = DateTime.Now;
// Add a CacheDependency
Caching.CacheDependency dependency =
new Caching.CacheDependency(null, MasterCacheKeyArray);
DataCache.Insert(GetCacheKey(rawKey), value, dependency,
DateTime.Now.AddSeconds(CacheDuration),
System.Web.Caching.Cache.NoSlidingExpiration);
}
Perbarui kode ini untuk menggunakan SqlCacheDependency objek alih-alih MasterCacheKeyArray dependensi cache:
private void AddCacheItem(string rawKey, object value)
{
System.Web.Caching.Cache DataCache = HttpRuntime.Cache;
// Add the SqlCacheDependency objects for Products
Caching.SqlCacheDependency productsTableDependency =
new Caching.SqlCacheDependency("NorthwindDB", "Products");
// Add the item to the data cache using productsTableDependency
DataCache.Insert(GetCacheKey(rawKey), value, productsTableDependency,
Caching.Cache.NoAbsoluteExpiration, Caching.Cache.NoSlidingExpiration);
}
Untuk menguji fungsionalitas ini, tambahkan GridView ke halaman di bawah GridView yang ada ProductsDeclarative . Atur GridView ID baru ini ke ProductsProgrammatic dan, melalui tag pintarnya, ikat ke ObjectDataSource baru bernama ProductsDataSourceProgrammatic. Konfigurasikan ObjectDataSource untuk menggunakan ProductsCL kelas , mengatur daftar drop-down di tab SELECT dan UPDATE ke GetProducts dan UpdateProduct, masing-masing.
Gambar 11: Mengonfigurasi ObjectDataSource untuk Menggunakan ProductsCL Kelas (Klik untuk melihat gambar ukuran penuh)
Gambar 12: Pilih GetProducts Metode dari Tab SELECT s Drop-Down List (Klik untuk melihat gambar ukuran penuh)
Gambar 13: Pilih Metode UpdateProduct dari Tab UPDATE s Drop-Down List (Klik untuk melihat gambar ukuran penuh)
Setelah menyelesaikan wizard Konfigurasi Sumber Data, Visual Studio akan membuat BoundFields dan CheckBoxFields di GridView untuk setiap bidang data. Seperti gridView pertama yang ditambahkan ke halaman ini, hapus semua bidang tetapi ProductName, , CategoryNamedan UnitPrice, dan format bidang ini sesuai keinginan Anda. Dari tag pintar GridView, centang kotak aktifkan Halaman, Aktifkan Pengurutan, dan Aktifkan Pengeditan. Seperti halnya ProductsDataSourceDeclarative ObjectDataSource, Visual Studio akan mengatur ProductsDataSourceProgrammatic properti ObjectDataSource ke OldValuesParameterFormatStringoriginal_{0}. Agar fitur edit GridView berfungsi dengan baik, atur kembali properti ini ke {0} (atau hapus penetapan properti dari sintaks deklaratif sama sekali).
Setelah menyelesaikan tugas-tugas ini, markup deklaratif GridView dan ObjectDataSource yang dihasilkan akan terlihat seperti berikut ini:
<asp:GridView ID="ProductsProgrammatic" runat="server"
AutoGenerateColumns="False" DataKeyNames="ProductID"
DataSourceID="ProductsDataSourceProgrammatic" 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:RequiredFieldValidator ID="RequiredFieldValidator1"
ControlToValidate="ProductName" Display="Dynamic"
ErrorMessage="You must provide a name for the product."
SetFocusOnError="True"
runat="server">*</asp:RequiredFieldValidator>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="Label2" runat="server"
Text='<%# Bind("ProductName") %>' />
</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" runat="server"
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" 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="ProductsDataSourceProgrammatic" runat="server"
OldValuesParameterFormatString="{0}" SelectMethod="GetProducts"
TypeName="ProductsCL" UpdateMethod="UpdateProduct">
<UpdateParameters>
<asp:Parameter Name="productName" Type="String" />
<asp:Parameter Name="unitPrice" Type="Decimal" />
<asp:Parameter Name="productID" Type="Int32" />
</UpdateParameters>
</asp:ObjectDataSource>
Untuk menguji ketergantungan cache SQL di Lapisan Penembolokan, atur titik henti di metode kelas ProductCLAddCacheItem, kemudian mulai debugging. Ketika Anda pertama kali mengunjungi SqlCacheDependencies.aspx, titik henti harus dipukul karena data diminta untuk pertama kalinya dan ditempatkan ke dalam cache. Selanjutnya, pindah ke halaman lain di GridView atau urutkan salah satu kolom. Ini menyebabkan GridView mengkueri ulang datanya, tetapi data harus ditemukan di cache karena Products tabel database belum dimodifikasi. Jika data berulang kali tidak ditemukan di cache, pastikan ada cukup memori yang tersedia di komputer Anda dan coba lagi.
Setelah melewati beberapa halaman di GridView, buka jendela browser kedua dan navigasi ke tutorial Dasar di bagian Pengeditan, Penyisipan, dan Penghapusan (~/EditInsertDelete/Basics.aspx). Perbarui rekaman dari tabel Produk lalu, dari jendela browser pertama, lihat halaman baru atau klik salah satu header pengurutan.
Dalam skenario ini Anda akan melihat salah satu dari dua hal: titik henti akan aktif, menunjukkan bahwa data yang di-cache dikeluarkan karena perubahan database; atau, titik henti tidak akan aktif, yang berarti sekarang SqlCacheDependencies.aspx menampilkan data kedaluwarsa. Jika titik henti tidak tercapai, kemungkinan karena layanan polling belum dijalankan sejak data diubah. Ingatlah bahwa layanan polling sedang memeriksa perubahan pada Products tabel setiap pollTime milidetik, sehingga ada penundaan antara ketika data yang mendasar diperbarui dan ketika data yang di-cache dikeluarkan.
Nota
Penundaan ini lebih mungkin muncul saat mengedit salah satu produk melalui GridView di SqlCacheDependencies.aspx. Dalam tutorial Penembolokan Data dalam Arsitektur, kami menambahkan MasterCacheKeyArray dependensi cache untuk memastikan bahwa data yang diedit melalui ProductsCL kelas UpdateProduct metode dikeluarkan dari cache. Namun, kami mengganti dependensi cache ini saat memodifikasi AddCacheItem metode sebelumnya dalam langkah ini dan oleh karena itu ProductsCL kelas akan terus menampilkan data yang di-cache sampai sistem polling mencatat perubahan pada Products tabel. Kita akan melihat cara memperkenalkan kembali MasterCacheKeyArray dependensi cache di Langkah 7.
Langkah 7: Mengaitkan Beberapa Dependensi dengan Item Singgahan
Ingat bahwa MasterCacheKeyArray dependensi cache digunakan untuk memastikan bahwa semua data terkait produk dikeluarkan dari cache ketika satu item yang terkait di dalamnya diperbarui. Misalnya, metode cache GetProductsByCategoryID(categoryID) instans ProductsDataTables untuk setiap nilai categoryID unik. Jika salah satu objek ini dikeluarkan, MasterCacheKeyArray dependensi cache memastikan bahwa yang lain juga dihapus. Tanpa dependensi cache ini, ketika data yang di-cache dimodifikasi, kemungkinan ada bahwa data produk cache lainnya mungkin kedaluarsa. Akibatnya, penting bagi kita untuk mempertahankan MasterCacheKeyArray dependensi cache saat menggunakan dependensi cache SQL. Namun, metode s Insert cache data hanya memungkinkan satu objek dependensi.
Selain itu, ketika bekerja dengan dependensi cache SQL, kita mungkin perlu mengaitkan beberapa tabel database sebagai dependensi. Misalnya, ProductsDataTable yang di-cache dalam kelas ProductsCL berisi kategori dan nama pemasok untuk setiap produk, namun metode AddCacheItem hanya bergantung pada Products. Dalam situasi ini, jika pengguna memperbarui nama kategori atau pemasok, data produk yang di-cache akan tetap berada di cache dan kedaluarsa. Oleh karena itu, kami ingin membuat data produk yang di-cache bergantung pada tidak hanya Products tabel, tetapi juga pada Categories tabel dan Suppliers .
Kelas AggregateCacheDependency menyediakan sarana untuk mengaitkan beberapa dependensi dengan item cache. Mulailah dengan membuat AggregateCacheDependency instans. Selanjutnya, tambahkan set dependensi dengan metode AggregateCacheDependencyAdd tersebut. Saat menyisipkan item ke dalam cache data setelahnya, berikan instans AggregateCacheDependency. Ketika salahAggregateCacheDependency satu dependensi instans berubah, item yang di-cache akan dikeluarkan.
Berikut ini menunjukkan kode yang diperbarui untuk kelas ProductsCL metode s AddCacheItem. Metode ini membuat MasterCacheKeyArray dependensi cache bersama dengan SqlCacheDependency objek untuk tabel Products, Categories, dan Suppliers. Ini semua digabungkan menjadi satu AggregateCacheDependency objek bernama aggregateDependencies, yang kemudian diteruskan ke dalam metode Insert.
private void AddCacheItem(string rawKey, object value)
{
System.Web.Caching.Cache DataCache = HttpRuntime.Cache;
// Make sure MasterCacheKeyArray[0] is in the cache and create a depedency
DataCache[MasterCacheKeyArray[0]] = DateTime.Now;
Caching.CacheDependency masterCacheKeyDependency =
new Caching.CacheDependency(null, MasterCacheKeyArray);
// Add the SqlCacheDependency objects for Products, Categories, and Suppliers
Caching.SqlCacheDependency productsTableDependency =
new Caching.SqlCacheDependency("NorthwindDB", "Products");
Caching.SqlCacheDependency categoriesTableDependency =
new Caching.SqlCacheDependency("NorthwindDB", "Categories");
Caching.SqlCacheDependency suppliersTableDependency =
new Caching.SqlCacheDependency("NorthwindDB", "Suppliers");
// Create an AggregateCacheDependency
Caching.AggregateCacheDependency aggregateDependencies =
new Caching.AggregateCacheDependency();
aggregateDependencies.Add(masterCacheKeyDependency, productsTableDependency,
categoriesTableDependency, suppliersTableDependency);
DataCache.Insert(GetCacheKey(rawKey), value, aggregateDependencies,
Caching.Cache.NoAbsoluteExpiration, Caching.Cache.NoSlidingExpiration);
}
Uji kode baru ini. Sekarang perubahan pada Productstabel , Categories, atau Suppliers menyebabkan data yang di-cache dikeluarkan. Selain itu, metode ProductsCL dari kelas UpdateProduct, yang dipanggil saat mengedit produk melalui GridView, menghapus dependensi cache MasterCacheKeyArray, yang menyebabkan cache ProductsDataTable dihapus dan data diambil ulang pada permintaan berikutnya.
Nota
Dependensi cache SQL juga dapat digunakan dengan cache output. Untuk demonstrasi fungsionalitas ini, lihat: Menggunakan ASP.NET Output Caching dengan SQL Server.
Ringkasan
Saat data database disimpan dalam cache, data idealnya akan tetap berada di cache hingga dimodifikasi dalam database. Dengan ASP.NET 2.0, dependensi cache SQL dapat dibuat dan digunakan dalam skenario deklaratif dan terprogram. Salah satu tantangan dengan pendekatan ini adalah dalam menemukan kapan data telah dimodifikasi. Versi lengkap Microsoft SQL Server 2005 menyediakan kemampuan pemberitahuan yang dapat memperingatkan aplikasi saat hasil kueri telah berubah. Untuk SQL Server Edisi Ekspres 2005 dan versi SQL Server yang lebih lama, sistem polling harus digunakan sebagai gantinya. Untungnya, menyiapkan infrastruktur polling yang diperlukan cukup mudah.
Selamat Pemrograman!
Bacaan Lebih Lanjut
Untuk informasi selengkapnya tentang topik yang dibahas dalam tutorial ini, lihat sumber daya berikut:
- Menggunakan Pemberitahuan Kueri di Microsoft SQL Server 2005
- Membuat Pemberitahuan Kueri
-
Caching di ASP.NET dengan
SqlCacheDependencyKelas -
Alat Pendaftaran SQL Server ASP.NET (
aspnet_regsql.exe) -
Ringkasan tentang
SqlCacheDependency
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 Marko Rangel, Teresa Murphy, dan Hilton Giesenow. Tertarik untuk meninjau artikel MSDN saya yang akan datang? Jika demikian, hubungi saya di mitchell@4GuysFromRolla.com.