Mengembangkan kesadaran Pengumpulan Sambungan di 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 yang ada berikut sehingga pengumpulan yang sadar driver dapat diaktifkan:

Fungsi Fungsionalitas Yang Ditambahkan
SQLAllocHandle

SQLFreeHandle

SQLGetDiagField

SQLGetDiagRec
Mendukung jenis handel 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).

Catatan

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

ID Kumpulan

ID kumpulan adalah ID khusus driver panjang pointer untuk mewakili grup koneksi tertentu yang dapat digunakan secara bergantian. Mengingat sekumpulan 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 ada konflik dalam sumber ini, kebijakan resolusi khusus driver yang ada harus digunakan untuk kompatibilitas mundur.

Driver Manager akan menggunakan kumpulan yang berbeda untuk ID kumpulan yang berbeda. Semua koneksi dalam 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, Driver Manager akan tetap memasukkannya ke dalam kumpulan yang sama (Driver Manager tidak tahu apa-apa tentang atribut kunci khusus driver). Ini berarti bahwa driver perlu melaporkan ke Driver Manager bahwa koneksi dengan sekumpulan atribut kunci yang berbeda tidak dapat digunakan kembali di dalam Fungsi SQLRateConnection. Ini dapat mengurangi performa dan ini tidak disarankan.

Driver Manager 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 untuk lingkungan drivernya.

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 dalam 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 di driver dapat mengevaluasi koneksi yang ada dengan permintaan koneksi baru. Misalnya, fungsi peringkat driver 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 yang sadar driver, driver memerlukan informasi koneksi untuk menghitung ID Kumpulan. Driver juga memerlukan informasi koneksi untuk membandingkan permintaan koneksi baru dengan koneksi di kumpulan. Setiap kali tidak ada koneksi di kumpulan 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 di 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.

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

Handel induk dari handel ini berjenis SQL_HANDLE_ENV, yang berarti bahwa driver dapat memperoleh informasi lingkungan dari handel 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 handel akan dibebaskan sebelum membebaskan HENV terkait (ketika SQLDriverConnect atau SQLConnect mengembalikan 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 driver Manager dan SQLFreeHandle 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 memperbaiki algoritma ini berdasarkan implementasi Anda (jika tidak, tidak ada alasan untuk mengimplementasikan 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 diberi nama hCandidate. Jika salah satu kondisi berikut salah, hCandidate koneksi terkumpul tidak dapat digunakan kembali untuk hRequest (Manajer Driver akan menetapkan peringkat 0).

  • hCandidate dan hRequest keduanya berasal dari UNICODE API (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 mendaftar dan tidak mendaftar (lihat diskusi SQL_DTC_TRANSITION_COST di SQLConnect), menggunakan kembali hRequest tidak boleh memerlukan pendaftaran tambahan atau tidak terdaftar.

Tabel berikut ini memperlihatkan penetapan skor untuk skenario yang berbeda.

Perbandingan atribut koneksi antara koneksi terkumpul dan permintaan Tidak Ada Pendaftaran / tidak terdaftar Memerlukan Pendaftaran Ekstra / Tidak Terdaftar
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 Status

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

odbc_state_diagram Diagram Status

Lihat juga

Pengumpulan Sambungan Sadar Driver
Referensi Antarmuka Penyedia Layanan (SPI) ODBC