Bagikan melalui


Mengembangkan Pemahaman Connection-Pool dalam Driver ODBC

Topik ini membahas detail pengembangan driver ODBC yang berisi informasi tentang bagaimana driver harus menyediakan layanan pengumpulan koneksi.

Mengaktifkan Kumpulan Koneksi Driver-Aware

Driver harus menerapkan fungsi Antarmuka Penyedia Layanan (SPI) ODBC berikut:

  • SQLSetConnectAttrForDbcInfo

  • SQLSetConnectInfo

  • SQLSetDriverConnectInfo

  • SQLGetPoolID

  • SQLRateConnection

  • SQLPoolConnect

  • SQLCleanupConnectionPoolID

Lihat Referensi Antarmuka Penyedia Layanan (SPI) ODBC untuk informasi selengkapnya.

Driver juga harus menerapkan fungsi-fungsi berikut yang sudah ada sehingga pengumpulan yang memperhatikan driver dapat diaktifkan.

Function Fungsionalitas yang Ditambahkan
SQLAllocHandle

SQLFreeHandle

SQLGetDiagField

SQLGetDiagRec
Mendukung jenis handle baru: SQL_HANDLE_DBC_INFO_TOKEN (lihat deskripsi di bawah).
SQLSetConnectAttr Mendukung atribut koneksi set-only baru: SQL_ATTR_DBC_INFO_TOKEN untuk mengatur ulang koneksi (lihat deskripsi di bawah).

Nota

Fungsi yang tidak digunakan lagi seperti SQLError dan SQLSetConnectOption tidak didukung untuk pengumpulan koneksi sadar driver.

ID Kumpulan

ID kumpulan adalah ID khusus driver panjang pointer untuk mewakili grup koneksi tertentu yang dapat digunakan secara bergantian. Mengingat serangkaian informasi koneksi, driver harus dapat dengan cepat menyimpulkan ID kumpulan yang sesuai.

Misalnya, ID kumpulan harus mengodekan nama server dan informasi kredensial. Namun, nama database tidak diperlukan karena driver mungkin dapat menggunakan kembali koneksi lalu mengubah database dalam waktu yang lebih singkat daripada membuat koneksi baru.

Driver harus menentukan sekumpulan atribut kunci, yang akan terdiri dari ID kumpulan. Nilai atribut kunci ini dapat berasal dari atribut koneksi, string koneksi, dan DSN. Jika terjadi konflik dalam sumber-sumber ini, kebijakan resolusi yang ada khusus untuk driver harus digunakan guna memastikan kompatibilitas ke belakang.

Manajer Driver akan menggunakan kumpulan yang berbeda untuk setiap ID kumpulan. Semua koneksi di kumpulan yang sama dapat digunakan kembali. Driver Manager tidak akan pernah menggunakan kembali koneksi dengan ID kumpulan yang berbeda.

Oleh karena itu driver harus menetapkan ID kumpulan unik untuk setiap grup koneksi dengan nilai yang sama dalam atribut kunci yang ditentukan. Jika driver menggunakan ID kumpulan yang sama untuk dua koneksi dengan nilai yang berbeda dalam atribut kuncinya, Manajer Driver akan tetap memasukkannya ke dalam kumpulan yang sama (Manajer Driver tidak tahu apa-apa tentang atribut kunci khusus driver). Ini berarti bahwa driver perlu melaporkan ke Manajer Driver bahwa koneksi dengan serangkaian atribut kunci yang berbeda tidak dapat digunakan kembali di dalam Fungsi SQLRateConnection. Ini dapat mengurangi performa dan ini tidak disarankan.

Manajer Driver tidak akan menggunakan kembali koneksi yang dialokasikan dari lingkungan driver lain meskipun semua informasi koneksi cocok. Driver Manager akan menggunakan kumpulan yang berbeda untuk lingkungan yang berbeda, bahkan ketika koneksi memiliki ID kumpulan yang sama. Oleh karena itu, ID kumpulan bersifat lokal dalam lingkungan driver-nya.

Fungsi untuk mendapatkan ID kumpulan dari driver adalah Fungsi SQLGetPoolID.

Peringkat Koneksi

Dibandingkan dengan membuat koneksi baru, Anda bisa mendapatkan performa yang lebih baik dengan mengatur ulang beberapa informasi koneksi (seperti DATABASE) dalam koneksi terkumpul. Jadi, Anda mungkin tidak ingin nama database berada di sekumpulan atribut kunci Anda. Jika tidak, Anda dapat memiliki kumpulan terpisah untuk setiap database, yang mungkin tidak baik dalam aplikasi tingkat menengah, di mana pelanggan menggunakan berbagai string koneksi yang berbeda.

Setiap kali Anda menggunakan kembali koneksi yang memiliki beberapa ketidakcocokan atribut, Anda harus mengatur ulang atribut yang tidak cocok berdasarkan permintaan aplikasi baru, sehingga koneksi yang dikembalikan identik dengan permintaan aplikasi (lihat diskusi atribut SQL_ATTR_DBC_INFO_TOKEN di Fungsi SQLSetConnectAttr). Namun, mengatur ulang atribut tersebut dapat mengurangi performa. Misalnya, mengatur ulang database memerlukan panggilan jaringan ke server. Oleh karena itu, gunakan kembali koneksi yang sangat cocok, jika tersedia.

Fungsi peringkat pada driver dapat mengevaluasi koneksi yang ada dengan permintaan koneksi baru. Misalnya, fungsi peringkat pengemudi dapat menentukan:

  • Jika koneksi yang ada sangat cocok dengan permintaan.

  • Jika hanya ada beberapa ketidakcocokan yang tidak signifikan, seperti batas waktu koneksi, yang tidak memerlukan komunikasi dengan server untuk mengatur ulang.

  • Jika ada beberapa atribut yang tidak cocok yang memerlukan komunikasi dengan server untuk direset tetapi masih akan menghasilkan performa yang lebih baik daripada membuat koneksi baru.

  • Jika ketidakcocokan terjadi untuk atribut yang sangat memakan waktu untuk mengatur ulang (pengembang driver dapat mempertimbangkan untuk menambahkan atribut ini ke dalam set atribut kunci, yang digunakan untuk menghasilkan ID kumpulan).

Skor antara 0 dan 100 dimungkinkan, di mana 0 berarti tidak digunakan kembali dan 100 berarti cocok dengan sempurna. SQLRateConnection adalah fungsi untuk memberi peringkat koneksi.

Handel ODBC Baru - SQL_HANDLE_DBC_INFO_TOKEN

Untuk mendukung pengumpulan koneksi sadar driver, driver memerlukan informasi koneksi untuk menghitung ID Kumpulan. Driver juga memerlukan informasi koneksi untuk membandingkan permintaan koneksi baru dengan koneksi di kumpulan. Ketika tidak ada koneksi dalam pool yang dapat digunakan kembali, driver harus membuat koneksi baru, sehingga memerlukan informasi koneksi.

Karena informasi koneksi dapat berasal dari beberapa sumber (string koneksi, atribut koneksi, dan DSN), driver mungkin perlu mengurai string koneksi dan mengatasi konflik antara sumber-sumber ini dalam setiap panggilan fungsi di atas.

Oleh karena itu, handel ODBC baru diperkenalkan: SQL_HANDLE_DBC_INFO_TOKEN. Dengan SQL_HANDLE_DBC_INFO_TOKEN, driver tidak perlu mengurai string koneksi dan mengatasi konflik dalam informasi koneksi lebih dari sekali. Karena ini adalah struktur data khusus driver, driver dapat menyimpan data seperti informasi koneksi atau ID kumpulan.

Handle ini hanya digunakan sebagai antarmuka antara Driver Manager dan driver. Aplikasi tidak dapat mengalokasikan handle ini secara langsung.

Handle induk dari handle ini bertipe SQL_HANDLE_ENV, yang berarti bahwa driver dapat memperoleh informasi lingkungan dari handle HENV selama resolusi informasi koneksi.

Setiap kali menerima permintaan koneksi baru, Driver Manager akan mengalokasikan handel jenis SQL_HANDLE_DBC_INFO_TOKEN untuk menyimpan informasi koneksi, setelah mengonfirmasi bahwa driver mendukung kesadaran kumpulan koneksi. Setelah selesai menggunakan handel (tetapi sebelum mengembalikan beberapa kode pengembalian selain SQL_STILL_EXECUTING dari SQLDriverConnect atau SQLConnect), Manajer Driver akan membebaskan handel. Oleh karena itu, handel dibuat setelah panggilan SQLAllocHandle, dan dihancurkan setelah panggilan SQLFreeHandle. Manajer Driver menjamin handle akan dibebaskan sebelum membebaskan HENV terkait (ketika SQLDriverConnect atau SQLConnect menghasilkan kesalahan).

Driver harus mengubah fungsi berikut untuk menerima jenis handel baru SQL_HANDLE_DBC_INFO_TOKEN:

  1. SQLAllocHandle

  2. SQLFreeHandle

  3. SQLGetDiagField

  4. SQLGetDiagRec

Driver Manager menjamin bahwa beberapa utas tidak akan menggunakan handel SQL_HANDLE_DBC_INFO_TOKEN yang sama secara bersamaan. Oleh karena itu, model sinkronisasi handel ini bisa sangat sederhana di dalam driver. Driver Manager tidak akan mengambil kunci lingkungan sebelum mengalokasikan dan membebaskan SQL_HANDLE_DBC_INFO_TOKEN.

SQLAllocHandle dan SQLFreeHandle Manajer Driver tidak akan menerima jenis handel baru ini.

SQL_HANDLE_DBC_INFO_TOKEN mungkin berisi informasi rahasia seperti kredensial. Oleh karena itu, driver harus menghapus buffer memori dengan aman (menggunakan SecureZeroMemory) yang berisi informasi sensitif sebelum melepaskan handel ini dengan SQLFreeHandle. Setiap kali handel lingkungan aplikasi ditutup, semua kumpulan koneksi terkait akan ditutup.

Algoritma Peringkat Kumpulan Koneksi Manajer Driver

Bagian ini membahas algoritma peringkat untuk pengumpulan koneksi Driver Manager. Pengembang driver dapat menerapkan algoritma yang sama untuk kompatibilitas mundur. Algoritma ini mungkin bukan yang terbaik. Anda harus menyempurnakan algoritma ini berdasarkan implementasi Anda (jika tidak, tidak ada alasan untuk menerapkan fitur ini).

Driver Manager akan mengembalikan peringkat integral dari 0 hingga 100 untuk setiap koneksi dari kumpulan. 0 berarti koneksi tidak dapat digunakan kembali dan 100 menunjukkan kecocokan yang sempurna. Asumsikan permintaan koneksi diberi nama hRequest dan koneksi yang ada dari kumpulan dinamai sebagai hCandidate. Jika salah satu dari kondisi berikut tidak terpenuhi, koneksi hCandidate yang digabungkan tidak dapat digunakan kembali untuk hRequest (Manajer Driver akan menetapkan peringkat 0).

  • hCandidate dan hRequest keduanya berasal dari API UNICODE (seperti SQLDriverConnectW) atau ANSI API (seperti SQLDriverConnectA). (Driver UNICODE dapat melakukan perilaku yang berbeda mengingat API ANSI dan API UNICODE (lihat atribut koneksi SQL_ATTR_ANSI_APP).)

  • hCandidate dan hRequest dibuat oleh fungsi yang sama; baik SQLDriverConnect atau SQLConnect.

  • String koneksi yang digunakan untuk membuka hCandidate harus sama dengan hRequest, ketika SQLDriverConnect digunakan.

  • ServerName (atau DSN), nama pengguna, dan kata sandi yang digunakan untuk membuka hCandidate harus sama dengan yang digunakan untuk membuka hRequest saat SQLConnect digunakan.

  • Pengidentifikasi keamanan (SID) dari utas saat ini harus sama dengan SID yang digunakan untuk membuka hCandidate.

  • Untuk driver yang mahal untuk mendaftarkan dan membatalkan daftar (lihat diskusi SQL_DTC_TRANSITION_COST di SQLConnect), menggunakan kembali hRequest tidak boleh memerlukan pendaftaran atau pembatalan pendaftaran tambahan.

Tabel berikut ini memperlihatkan penetapan skor untuk skenario yang berbeda.

Perbandingan pada atribut koneksi antara koneksi terkumpul dan permintaan Tidak Ada Pendaftaran / tidak ada pendaftaran Memerlukan Pendaftaran Tambahan / Pembatalan Pendaftaran
Katalog (SQL_ATTR_CURRENT_CATALOG) berbeda 60 50
Beberapa atribut koneksi berbeda, tetapi katalognya sama 90 70
Semua atribut koneksi cocok dengan sempurna 100 80

Diagram Urutan

Diagram urutan ini menunjukkan mekanisme pengumpulan dasar yang dijelaskan dalam topik ini. Ini hanya menunjukkan penggunaan SQLDriverConnect tetapi kasus SQLConnect serupa.

Diagram Urutan

Diagram Keadaan

Diagram status ini memperlihatkan objek token info koneksi, yang dijelaskan dalam topik ini. Diagram hanya memperlihatkan SQLDriverConnect tetapi kasus SQLConnect serupa. Karena Driver Manager mungkin perlu menangani kesalahan kapan saja, Manajer Driver dapat memanggil SQLFreeHandle untuk status apa pun.

Diagram Status

Lihat Juga

Pengumpulan Koneksi yang Memahami Driver
Referensi Antarmuka Penyedia Layanan (SPI) ODBC