Bagikan melalui


Memahami jenis kursor

Unduh driver JDBC

Operasi dalam database relasional bertindak pada sekumpulan baris lengkap. Kumpulan baris yang dikembalikan oleh pernyataan SELECT terdiri dari semua baris yang memenuhi kondisi dalam klausa WHERE pernyataan. Kumpulan baris lengkap yang dikembalikan oleh pernyataan ini dikenal sebagai tataan hasil. Aplikasi tidak selalu dapat bekerja secara efektif dengan seluruh hasil yang ditetapkan sebagai unit. Aplikasi ini membutuhkan cara untuk bekerja dengan satu baris atau blok kecil baris pada satu waktu. Kursor adalah ekstensi untuk tataan hasil yang menyediakan mekanisme tersebut.

Kursor memperluas pemrosesan kumpulan hasil dengan melakukan item berikut:

  • Memperbolehkan penempatan pada baris tertentu dari tataan hasil.
  • Mengambil satu baris atau blok baris dari posisi saat ini dalam tataan hasil.
  • Mendukung modifikasi data pada baris pada posisi saat ini dalam tataan hasil.
  • Mendukung berbagai tingkat visibilitas terhadap perubahan yang dilakukan pada data database oleh pengguna lain yang disajikan dalam tataan hasil.

Catatan

Untuk deskripsi lengkap tentang jenis kursor SQL Server, lihat Jenis Kursor.

Spesifikasi JDBC menyediakan dukungan untuk kursor hanya maju dan dapat digulirkan yang sensitif atau tidak peka terhadap perubahan yang dibuat oleh pekerjaan lain, dan dapat dibaca-saja atau dapat diperbarui. Fungsionalitas ini disediakan oleh driver Microsoft JDBC untuk kelas SQL Server SQLServerResultSet.

Keterangan

Driver JDBC mendukung kumpulan hasil dan jenis kursor berikut bersama dengan opsi perilaku yang ditentukan.

Tipe Tataan Hasil (Kursor) Tipe Kursor SQL Server Karakteristik pilih Metode buffering respons
TYPE_FORWARD_ONLY (CONCUR_READ_ONLY) T/A Teruskan-saja, baca-saja langsung penuh

Aplikasi harus membuat satu (maju) melewati tataan hasil. Pass ini adalah perilaku default dan berperilaku sama dengan kursor TYPE_SS_DIRECT_FORWARD_ONLY. Driver membaca seluruh hasil yang diatur dari server ke dalam memori selama waktu eksekusi pernyataan.

Tipe Tataan Hasil (Kursor) Tipe Kursor SQL Server Karakteristik pilih Metode buffering respons
TYPE_FORWARD_ONLY (CONCUR_READ_ONLY) T/A Teruskan-saja, baca-saja langsung Adaptif

Aplikasi harus membuat satu (maju) melewati tataan hasil. Perilakunya sama dengan kursor TYPE_SS_DIRECT_FORWARD_ONLY. Driver membaca baris dari server saat aplikasi memintanya dan meminimalkan penggunaan memori sisi klien.

Tipe Tataan Hasil (Kursor) Tipe Kursor SQL Server Karakteristik pilih Metode buffering respons
TYPE_FORWARD_ONLY (CONCUR_READ_ONLY) Maju Cepat Teruskan-saja, baca-saja cursor T/A

Aplikasi harus membuat satu (maju) melewati hasil yang ditetapkan dengan menggunakan kursor server. Perilakunya sama dengan kursor TYPE_SS_SERVER_CURSOR_FORWARD_ONLY.

Baris diambil dari server dalam blok yang ditentukan oleh ukuran pengambilan.

Tipe Tataan Hasil (Kursor) Tipe Kursor SQL Server Karakteristik pilih Metode buffering respons
TYPE_FORWARD_ONLY (CONCUR_UPDATABLE) Dinamis (Hanya maju) Teruskan-saja, dapat diperbarui T/A T/A

Aplikasi harus membuat satu (maju) melewati tataan hasil untuk memperbarui satu atau beberapa baris.

Baris diambil dari server dalam blok yang ditentukan oleh ukuran pengambilan.

Secara default, ukuran pengambilan diperbaiki saat aplikasi memanggil metode setFetchSize dari objek SQLServerResultSet .

Catatan

Driver JDBC menyediakan fitur buffering adaptif yang memungkinkan Anda untuk mengambil hasil eksekusi pernyataan dari SQL Server karena aplikasi membutuhkannya, bukan sekaligus. Misalnya, jika aplikasi harus mengambil data besar yang terlalu besar agar pas sepenuhnya dalam memori aplikasi, buffering adaptif memungkinkan aplikasi klien untuk mengambil nilai seperti aliran. Perilaku default driver adalah "adaptif". Namun, untuk mendapatkan buffering adaptif untuk tataan hasil yang dapat diperbarui hanya maju, aplikasi harus secara eksplisit memanggil metode setResponseBuffering dari objek SQLServerStatement dengan memberikan nilai String "adaptif". Untuk contoh kode, lihat Memperbarui sampel data besar.

Tipe Tataan Hasil (Kursor) Tipe Kursor SQL Server Karakteristik pilih Metode buffering respons
TYPE_SCROLL_INSENSITIVE Statis Dapat digulir, tidak dapat diperbarui.

Pembaruan, penyisipan, dan penghapusan baris eksternal tidak terlihat.
T/A T/A

Aplikasi ini memerlukan rekam jepret database. Tataan hasil tidak dapat diperbarui. Hanya CONCUR_READ_ONLY yang didukung. Semua jenis konkurensi lainnya akan menyebabkan pengecualian ketika digunakan dengan jenis kursor ini.

Baris diambil dari server dalam blok yang ditentukan oleh ukuran pengambilan.

Tipe Tataan Hasil (Kursor) Tipe Kursor SQL Server Karakteristik pilih Metode buffering respons
TYPE_SCROLL_SENSITIVE (CONCUR_READ_ONLY) Set kunci Dapat digulir, baca-saja. Pembaruan baris eksternal terlihat, dan penghapusan muncul sebagai data yang hilang.

Sisipan baris eksternal tidak terlihat.
T/A T/A

Aplikasi harus melihat data yang diubah hanya untuk baris yang ada.

Baris diambil dari server dalam blok yang ditentukan oleh ukuran pengambilan.

Tipe Tataan Hasil (Kursor) Tipe Kursor SQL Server Karakteristik pilih Metode buffering respons
TYPE_SCROLL_SENSITIVE (CONCUR_UPDATABLE, CONCUR_SS_SCROLL_LOCKS, CONCUR_SS_OPTIMISTIC_CC, CONCUR_SS_OPTIMISTIC_CCVAL) Set kunci Dapat digulir, dapat diperbarui.

Pembaruan baris eksternal dan internal terlihat, dan penghapusan muncul sebagai data yang hilang; sisipan tidak terlihat.
T/A T/A

Aplikasi dapat mengubah data di baris yang ada dengan menggunakan objek ResultSet. Aplikasi juga harus dapat melihat perubahan pada baris yang dibuat oleh orang lain dari luar objek ResultSet.

Baris diambil dari server dalam blok yang ditentukan oleh ukuran pengambilan.

Tipe Tataan Hasil (Kursor) Tipe Kursor SQL Server Karakteristik pilih Metode buffering respons
TYPE_SS_DIRECT_FORWARD_ONLY T/A Teruskan-saja, baca-saja T/A penuh atau adaptif

Nilai bilangan bulat = 2003. Menyediakan kursor sisi klien baca-saja yang sepenuhnya di-buffer. Tidak ada kursor server yang dibuat.

Hanya CONCUR_READ_ONLY jenis konkurensi yang didukung. Semua jenis konkurensi lainnya menyebabkan pengecualian saat digunakan dengan jenis kursor ini.

Tipe Tataan Hasil (Kursor) Tipe Kursor SQL Server Karakteristik pilih Metode buffering respons
TYPE_SS_SERVER_CURSOR_FORWARD_ONLY Maju Cepat Teruskan saja T/A T/A

Nilai bilangan bulat = 2004. Cepat dan mengakses semua data menggunakan kursor server. Ini dapat diperbarui ketika digunakan dengan jenis konkurensi CONCUR_UPDATABLE.

Baris diambil dari server dalam blok yang ditentukan oleh ukuran pengambilan.

Untuk mendapatkan buffering adaptif untuk kasus ini, aplikasi harus secara eksplisit memanggil metode setResponseBuffering objek SQLServerStatement dengan memberikan nilai String "adaptif". Untuk contoh kode, lihat Memperbarui sampel data besar.

Tipe Tataan Hasil (Kursor) Tipe Kursor SQL Server Karakteristik pilih Metode buffering respons
TYPE_SS_SCROLL_STATIC Statis Pembaruan pengguna lain tidak tercermin. T/A T/A

Nilai bilangan bulat = 1004. Aplikasi memerlukan rekam jepret database. Opsi ini adalah sinonim khusus SQL Server untuk TYPE_SCROLL_INSENSITIVE JDBC dan memiliki perilaku pengaturan konkurensi yang sama.

Baris diambil dari server dalam blok yang ditentukan oleh ukuran pengambilan.

Tipe Tataan Hasil (Kursor) Tipe Kursor SQL Server Karakteristik pilih Metode buffering respons
TYPE_SS_SCROLL_KEYSET (CONCUR_READ_ONLY) Set kunci Dapat digulir, baca-saja. Pembaruan baris eksternal terlihat, dan penghapusan muncul sebagai data yang hilang.

Sisipan baris eksternal tidak terlihat.
T/A T/A

Nilai bilangan bulat = 1005. Aplikasi harus melihat data yang diubah hanya untuk baris yang ada. Opsi ini adalah sinonim khusus SQL Server untuk TYPE_SCROLL_SENSITIVE JDBC dan memiliki perilaku pengaturan konkurensi yang sama.

Baris diambil dari server dalam blok yang ditentukan oleh ukuran pengambilan.

Tipe Tataan Hasil (Kursor) Tipe Kursor SQL Server Karakteristik pilih Metode buffering respons
TYPE_SS_SCROLL_KEYSET (CONCUR_UPDATABLE, CONCUR_SS_SCROLL_LOCKS, CONCUR_SS_OPTIMISTIC_CC, CONCUR_SS_OPTIMISTIC_CCVAL) Set kunci Dapat digulir, dapat diperbarui.

Pembaruan baris eksternal dan internal terlihat, dan penghapusan muncul sebagai data yang hilang; sisipan tidak terlihat.
T/A T/A

Nilai bilangan bulat = 1005. Aplikasi harus mengubah data atau melihat data yang diubah untuk baris yang ada. Opsi ini adalah sinonim khusus SQL Server untuk TYPE_SCROLL_SENSITIVE JDBC dan memiliki perilaku pengaturan konkurensi yang sama.

Baris diambil dari server dalam blok yang ditentukan oleh ukuran pengambilan.

Tipe Tataan Hasil (Kursor) Tipe Kursor SQL Server Karakteristik pilih Metode Buffering respons
TYPE_SS_SCROLL_DYNAMIC (CONCUR_READ_ONLY) Dinamis Dapat digulir, baca-saja.

Pembaruan dan penyisipan baris eksternal terlihat, dan penghapusan muncul sebagai data sementara yang hilang dalam buffer pengambilan saat ini.
T/A T/A

Nilai bilangan bulat = 1006. Aplikasi harus melihat data yang diubah untuk baris yang ada, dan melihat baris yang disisipkan dan dihapus selama masa pakai kursor.

Baris diambil dari server dalam blok yang ditentukan oleh ukuran pengambilan.

Tipe Tataan Hasil (Kursor) Tipe Kursor SQL Server Karakteristik pilih Metode Buffering respons
TYPE_SS_SCROLL_DYNAMIC (CONCUR_UPDATABLE, CONCUR_SS_SCROLL_LOCKS, CONCUR_SS_OPTIMISTIC_CC, CONCUR_SS_OPTIMISTIC_CCVAL) Dinamis Dapat digulir, dapat diperbarui.

Pembaruan dan penyisipan baris eksternal dan internal terlihat, dan penghapusan muncul sebagai data sementara yang hilang dalam buffer pengambilan saat ini.
T/A T/A

Nilai bilangan bulat = 1006. Aplikasi dapat mengubah data untuk baris yang ada, atau menyisipkan atau menghapus baris dengan menggunakan objek ResultSet. Aplikasi juga harus dapat melihat perubahan, menyisipkan, dan menghapus yang dibuat oleh orang lain dari luar objek ResultSet.

Baris diambil dari server dalam blok yang ditentukan oleh ukuran pengambilan.

Penempatan kursor

Kursor TYPE_FORWARD_ONLY, TYPE_SS_DIRECT_FORWARD_ONLY, dan TYPE_SS_SERVER_CURSOR_FORWARD_ONLY hanya mendukung metode pemosisian berikutnya .

Kursor TYPE_SS_SCROLL_DYNAMIC tidak mendukung metode absolut dan getRow . Metode absolut dapat diperkirakan dengan kombinasi panggilan ke metode pertama dan relatif untuk kursor dinamis.

Metode getRow hanya didukung oleh kursor TYPE_FORWARD_ONLY, TYPE_SS_DIRECT_FORWARD_ONLY, TYPE_SS_SERVER_CURSOR_FORWARD_ONLY, TYPE_SS_SCROLL_KEYSET, dan TYPE_SS_SCROLL_STATIC. Metode getRow dengan semua jenis kursor hanya maju mengembalikan jumlah baris yang dibaca sejauh ini melalui kursor.

Catatan

Ketika aplikasi melakukan panggilan pemosisian kursor yang tidak didukung, atau panggilan yang tidak didukung ke metode getRow, pengecualian dilemparkan dengan pesan, "Operasi yang diminta tidak didukung dengan jenis kursor ini."

Hanya TYPE_SS_SCROLL_KEYSET dan kursor TYPE_SCROLL_SENSITIVE yang setara yang mengekspos baris yang dihapus. Jika kursor diposisikan pada baris yang dihapus, nilai kolom tidak tersedia, dan metode rowDeleted mengembalikan "true". Panggilan untuk mendapatkan<metode Jenis> melemparkan pengecualian dengan pesan, "Tidak dapat mendapatkan nilai dari baris yang dihapus". Baris yang dihapus tidak dapat diperbarui. Jika Anda mencoba memanggil metode Jenis> pembaruan<pada baris yang dihapus, pengecualian dilemparkan dengan pesan, "Baris yang dihapus tidak dapat diperbarui". Kursor TYPE_SS_SCROLL_DYNAMIC memiliki perilaku yang sama sampai kursor dipindahkan dari buffer pengambilan saat ini.

Kursor maju dan dinamis mengekspos baris yang dihapus dengan cara yang sama, tetapi hanya saat kursor tetap dapat diakses di buffer pengambilan. Untuk kursor forward, perilaku ini cukup mudah. Untuk kursor dinamis, lebih kompleks ketika ukuran pengambilan lebih besar dari 1. Aplikasi dapat memindahkan kursor ke depan dan ke belakang di dalam jendela yang ditentukan oleh buffer pengambilan, tetapi baris yang dihapus akan hilang ketika buffer pengambilan asli di mana diperbarui dibiarkan. Jika aplikasi tidak ingin melihat baris sementara yang dihapus dengan menggunakan kursor dinamis, relatif pengambilan (0) harus digunakan.

Jika nilai kunci baris kursor TYPE_SS_SCROLL_KEYSET atau TYPE_SCROLL_SENSITIVE diperbarui dengan kursor, baris mempertahankan posisi aslinya dalam kumpulan hasil, terlepas dari apakah baris yang diperbarui memenuhi kriteria pilihan kursor. Jika baris diperbarui di luar kursor, baris yang dihapus akan muncul pada posisi asli baris, tetapi baris akan muncul di kursor hanya jika baris lain dengan nilai kunci baru ada di kursor, tetapi sejak itu telah dihapus.

Untuk kursor dinamis, baris yang diperbarui akan mempertahankan posisinya dalam buffer pengambilan hingga jendela yang ditentukan oleh buffer pengambilan dibiarkan. Baris yang diperbarui nantinya mungkin muncul kembali pada posisi yang berbeda dalam tataan hasil, atau mungkin hilang sepenuhnya. Aplikasi yang harus menghindari inkonsistensi sementara dalam tataan hasil harus menggunakan ukuran pengambilan 1 (defaultnya adalah 8 baris dengan konkurensi CONCUR_SS_SCROLL_LOCKS dan 128 baris dengan konkurensi lainnya).

Konversi kursor

SQL Server terkadang dapat memilih untuk menerapkan jenis kursor selain yang diminta, yang disebut sebagai konversi kursor implisit (atau penurunan kursor).

Dengan SQL Server 2000 (8.x), saat Anda memperbarui data melalui kumpulan hasil ResultSet.TYPE_SCROLL_SENSITIVE dan ResultSet.CONCUR_UPDATABLE, pengecualian dilemparkan dengan pesan "Kursor BACA SAJA". Pengecualian ini terjadi karena SQL Server 2000 (8.x) telah melakukan konversi kursor implisit untuk kumpulan hasil tersebut dan tidak mengembalikan kursor yang dapat diperbarui yang telah diminta.

Untuk mengatasi masalah ini, Anda dapat melakukan salah satu solusi berikut:

Pembaruan kursor

Pembaruan di tempat didukung untuk kursor di mana jenis kursor dan pembaruan dukungan konkurensi. Jika kursor tidak diposisikan pada baris yang dapat diperbarui dalam kumpulan hasil (tidak ada panggilan metode Jenis> get<berhasil), panggilan ke metode Jenis> pembaruan<akan melemparkan pengecualian dengan pesan, "Tataan hasil tidak memiliki baris saat ini." Spesifikasi JDBC menyatakan bahwa pengecualian muncul ketika metode pembaruan dipanggil untuk kolom kursor yang CONCUR_READ_ONLY. Dalam situasi di mana baris tidak dapat diperbarui, seperti karena konflik konkurensi optimis seperti pembaruan atau penghapusan yang bersaing, pengecualian mungkin tidak muncul sampai insertRow, updateRow, atau deleteRow dipanggil.

Setelah panggilan untuk memperbarui<Jenis>, kolom yang terpengaruh tidak dapat diakses dengan mendapatkan<Jenis> hingga updateRow atau cancelRowUpdates telah dipanggil. Perilaku ini menghindari masalah di mana kolom diperbarui dengan menggunakan jenis yang berbeda dari jenis yang dikembalikan oleh server, dan panggilan getter berikutnya dapat memanggil konversi jenis sisi klien yang memberikan hasil yang tidak akurat. Panggilan untuk mendapatkan<Jenis> akan melemparkan pengecualian dengan pesan, "Kolom yang diperbarui tidak dapat diakses hingga updateRow() atau cancelRowUpdates() telah dipanggil."

Catatan

Jika metode updateRow dipanggil ketika tidak ada kolom yang diperbarui, driver JDBC akan memberikan pengecualian dengan pesan, "updateRow() yang dipanggil ketika tidak ada kolom yang diperbarui."

Setelah moveToInsertRow dipanggil, pengecualian akan dilemparkan jika metode apa pun selain metode get<Type>, update<Type>, insertRow, dan cursor positioning (termasuk moveToCurrentRow) dipanggil pada tataan hasil. Metode moveToInsertRow secara efektif menempatkan tataan hasil ke mode sisipkan, dan metode pemosisian kursor mengakhiri mode sisipkan. Panggilan pemosisian kursor relatif memindahkan kursor relatif terhadap posisi sebelum moveToInsertRow dipanggil. Setelah kursor memosisikan panggilan, posisi kursor tujuan akhirnya menjadi posisi kursor baru.

Jika panggilan pemosisian kursor yang dilakukan saat dalam mode sisipkan tidak berhasil, posisi kursor setelah panggilan gagal adalah posisi kursor asli sebelum moveToInsetRow dipanggil. Jika insertRow gagal, kursor tetap berada di baris sisipkan dan kursor tetap dalam mode sisipkan.

Kolom di baris sisipkan awalnya dalam status tidak diinisialisasi. Panggilan ke metode jenis> pembaruan<mengatur status kolom untuk diinisialisasi. Panggilan ke metode get<Type> untuk kolom yang tidak diinisialisasi melemparkan pengecualian. Panggilan ke metode insertRow mengembalikan semua kolom dalam baris sisipkan ke status tidak diinisialisasi.

Jika ada kolom yang tidak diinisialisasi saat metode insertRow dipanggil, nilai default untuk kolom akan disisipkan. Jika tidak ada nilai default tetapi kolom dapat diubah ke null, maka NULL akan disisipkan. Jika tidak ada nilai default dan kolom tidak dapat diubah ke null, server akan mengembalikan kesalahan dan pengecualian akan dilemparkan.

Catatan

Panggilan ke metode getRow mengembalikan 0 saat dalam mode sisipkan.

Driver JDBC tidak mendukung pembaruan atau penghapusan yang diposisikan. Menurut spesifikasi JDBC, metode setCursorName tidak berpengaruh dan metode getCursorName akan memberikan pengecualian jika dipanggil.

Kursor baca-saja dan statis tidak pernah dapat diperbarui.

SQL Server membatasi kursor server ke satu tataan hasil. Jika batch atau prosedur tersimpan berisi beberapa pernyataan, maka kursor klien baca-saja-saja harus digunakan.

Lihat juga

Mengelola tataan hasil dengan driver JDBC