ODBC Sürücüsünde Connection-Pool Farkındalığı Geliştirme

Bu konuda, sürücünün bağlantı havuzu hizmetlerini nasıl sağlaması gerektiği hakkında bilgi içeren bir ODBC sürücüsü geliştirmenin ayrıntıları açıklanmaktadır.

Sürücüye Duyarlı Bağlantı Havuzunu Etkinleştirme

Bir sürücünün aşağıdaki ODBC Hizmet Sağlayıcısı Arabirimi (SPI) işlevlerini uygulaması gerekir:

  • SQLSetConnectAttrForDbcInfo

  • SQLSetConnectInfo

  • SQLSetDriverConnectInfo

  • SQLGetPoolID

  • SQLRateConnection

  • SQLPoolConnect

  • SQLCleanupConnectionPoolID

Daha fazla bilgi için bkz. ODBC Hizmet Sağlayıcısı Arabirimi (SPI) Başvurusu .

Sürücüye duyarlı havuzun etkinleştirilmesi için, bir sürücünün mevcut aşağıdaki işlevleri de uygulaması gerekir:

İşlev İşlevsellik Eklendi
Sqlallochandle

Sqlfreehandle

Sqlgetdiagfield

Sqlgetdiagrec
Yeni tanıtıcı türünü destekleyin: SQL_HANDLE_DBC_INFO_TOKEN (aşağıdaki açıklamaya bakın).
SQLSetConnectAttr Bağlantıyı sıfırlamak için yeni yalnızca ayarlanan bağlantı özniteliğini destekleyin: SQL_ATTR_DBC_INFO_TOKEN (aşağıdaki açıklamaya bakın).

Uyarı

SQLError ve SQLSetConnectOption gibi kullanım dışı işlevler, sürücü kullanan bağlantı havuzu için desteklenmez.

Havuz Kimliği

Havuz kimliği, birbirinin yerine kullanılabilecek belirli bir bağlantı grubunu temsil eden, işaretçi uzunluğunda ve sürücüye özgü bir kimliktir. Bir bağlantı bilgileri kümesi göz önüne alındığında, bir sürücünün ilgili havuz kimliğini hızla çıkarabilmesi gerekir.

Örneğin, havuz kimliği sunucu adını ve kimlik bilgisi bilgilerini kodlamalıdır. Ancak, bir sürücü bir bağlantıyı yeniden kullanabilir ve sonra veritabanını yeni bir bağlantı oluşturmaktan daha kısa sürede değiştirebileceğinden veritabanı adı gerekli değildir.

Sürücü, havuz kimliğini oluşturacak bir dizi anahtar özniteliği tanımlamalıdır. Bu anahtar özniteliklerin değeri bağlantı öznitelikleri, bağlantı dizesi ve DSN'den gelebilir. Bu kaynaklarda çakışma olması durumunda geriye dönük uyumluluk için mevcut, sürücüye özgü çözüm ilkesi kullanılmalıdır.

Sürücü Yöneticisi farklı havuz kimlikleri için farklı bir havuz kullanır. Aynı havuzdaki tüm bağlantılar yeniden kullanılabilir. Sürücü Yöneticisi hiçbir zaman farklı bir havuz kimliğine sahip bir bağlantıyı yeniden kullanmaz.

Bu nedenle sürücüler, tanımlanan anahtar özniteliklerinde aynı değere sahip her bağlantı grubu için benzersiz bir havuz kimliği atamalıdır. Sürücü, anahtar özniteliklerinde farklı değerlere sahip iki bağlantı için aynı havuz kimliğini kullanıyorsa, Sürücü Yöneticisi bunları yine aynı havuza koyar (Sürücü Yöneticisi sürücüye özgü anahtar öznitelikleri hakkında hiçbir şey bilmez). Bu, sürücünün Farklı bir anahtar öznitelik kümesine sahip bir bağlantının SQLRateConnection İşlevi içinde yeniden kullanılamadığını Driver Manager'a bildirmesi gerektiği anlamına gelir. Bu, performansı düşürebilir ve bu önerilmez.

Sürücü Yöneticisi, tüm bağlantı bilgileri eşleşse bile başka bir sürücü ortamından ayrılan bir bağlantıyı yeniden kullanmaz. Sürücü Yöneticisi, bağlantılar aynı havuz kimliğine sahip olsa bile farklı ortam için farklı bir havuz kullanır. Bu nedenle, havuz kimliği sürücü çevresine yereldir.

Sürücüden havuz kimliğini almaya yönelik işlev SQLGetPoolID İşlevi'dir.

Bağlantı Derecelendirmesi

Yeni bağlantı kurmakla karşılaştırıldığında, havuza alınan bir bağlantıdaki bazı bağlantı bilgilerini (VERITABANı gibi) sıfırlayarak daha iyi performans elde edebilirsiniz. Bu nedenle, veritabanı adının anahtar öznitelik kümenizde olmasını istemeyebilirsiniz. Aksi takdirde, her veritabanı için ayrı bir havuza sahip olabilirsiniz; bu, müşterilerin çeşitli farklı bağlantı dizelerini kullandığı orta katman uygulamalarında iyi olmayabilir.

Bazı öznitelik uyuşmazlığı olan bir bağlantıyı yeniden kullandığınızda, döndürülen bağlantının uygulama isteğiyle aynı olması için yeni uygulama isteğine göre eşleşmeyen öznitelikleri sıfırlamanız gerekir ( SQLSetConnectAttr İşlevi'nde SQL_ATTR_DBC_INFO_TOKEN özniteliğinin tartışmasına bakın). Ancak bu özniteliklerin sıfırlanması performansı düşürebilir. Örneğin, veritabanını sıfırlamak için sunucuya bir ağ çağrısı gerekir. Bu nedenle, varsa mükemmel bir şekilde eşleşen bir bağlantıyı yeniden kullanabilirsiniz.

Sürücüdeki derecelendirme işlevi, var olan bir bağlantıyı yeni bir bağlantı isteğiyle değerlendirebilir. Örneğin, sürücünün derecelendirme işlevi şunları belirleyebilir:

  • Mevcut bağlantı istekle mükemmel bir şekilde eşleşiyorsa.

  • Bağlantı zaman aşımı gibi, sunucuyla iletişimin sıfırlanması gerekmeyen yalnızca bazı önemsiz uyuşmazlıklar varsa.

  • Sıfırlanması için sunucuyla iletişim kurulmasını gerektiren ancak yine de yeni bir bağlantı kurmaktan daha iyi performansla sonuçlanan bazı eşleşmeyen öznitelikler varsa.

  • Eşleşmeyen bir özniteliğin sıfırlanması çok zaman alıyorsa (sürücünün geliştiricisi bu özniteliği havuz kimliğini oluşturmak için kullanılan anahtar öznitelik kümesine eklemeyi düşünebilir).

0 ile 100 arasında bir puan mümkündür, burada 0 yeniden kullanılmaz ve 100 mükemmel eşleşme anlamına gelir. SQLRateConnection , bir bağlantıyı derecelendirme işlevidir.

Yeni ODBC Tanıtıcısı - SQL_HANDLE_DBC_INFO_TOKEN

Sürücü farkındalıklı bağlantı havuzlamasını desteklemek için, sürücünün Havuz Kimliğini hesaplamak üzere bağlantı bilgilerine ihtiyacı vardır. Sürücü, yeni bağlantı isteklerini havuzdaki bağlantılarla karşılaştırmak için bağlantı bilgilerine de ihtiyaç duyar. Havuzda yeniden kullanılabilecek bir bağlantı olmadığında, sürücünün yeni bir bağlantı kurması ve bu nedenle bağlantı bilgilerini sağlaması gerekir.

Bağlantı bilgileri birden çok kaynaktan (bağlantı dizesi, bağlantı öznitelikleri ve DSN) gelebildiğinden, sürücünün bağlantı dizesini ayrıştırıp yukarıdaki işlev çağrısının her birinde bu kaynaklar arasındaki çakışmayı çözmesi gerekebilir.

Bu nedenle, yeni bir ODBC tanıtıcısı kullanıma sunulmuştur: SQL_HANDLE_DBC_INFO_TOKEN. SQL_HANDLE_DBC_INFO_TOKEN ile bir sürücünün bağlantı dizesini ayrıştırması ve bağlantı bilgilerindeki çakışmaları birden çok kez çözümlemesi gerekmez. Bu sürücüye özgü bir veri yapısı olduğundan, sürücü bağlantı bilgileri veya havuz kimliği gibi verileri depolayabilir.

Bu tanıtıcı yalnızca Sürücü Yöneticisi ile sürücü arasında bir arabirim olarak kullanılır. Bir uygulama bu tanıtıcıyı doğrudan tahsis edemez.

Bu tanıtıcının üst tutamacı SQL_HANDLE_ENV türündedir; yani sürücü, bağlantı bilgileri çözümlemesi sırasında HENV tutamacından ortam bilgilerini alabilir.

Sürücü Yöneticisi, yeni bir bağlantı isteği aldığında, sürücünün bağlantı havuzu tanımayı desteklediğini onayladıktan sonra bağlantı bilgilerini depolamak için SQL_HANDLE_DBC_INFO_TOKEN türünde bir tanıtıcı ayırır. Tanıtıcının kullanımını bitirdiğinizde (ancak SQLDriverConnect veya SQLConnect'ten SQL_STILL_EXECUTING dışında bazı dönüş kodları dönmeden önce), Driver Manager tanıtıcıyı serbest bırakacaktır. Bu nedenle, tanıtıcı SQLAllocHandle çağrısından sonra oluşturulur ve SQLFreeHandle çağrısından sonra yok edilir. Driver Manager, ilişkili HENV'sini boşaltmadan önce tanıtıcının serbest olacağını garanti eder ( SQLDriverConnect veya SQLConnect bir hata döndürdüğünde).

Sürücü, yeni tanıtıcı türünü SQL_HANDLE_DBC_INFO_TOKEN kabul etmek için aşağıdaki işlevleri değiştirmelidir:

  1. Sqlallochandle

  2. Sqlfreehandle

  3. Sqlgetdiagfield

  4. Sqlgetdiagrec

Driver Manager, birden çok iş parçacığının SQL_HANDLE_DBC_INFO_TOKEN işlecini aynı anda kullanmayacağını garanti eder. Bu nedenle, bu tanıtıcının eşitleme modeli sürücünün içinde çok basit olabilir. Sürücü Yöneticisi, SQL_HANDLE_DBC_INFO_TOKEN ayırmadan ve boşaltmadan önce ortam kilidi almaz.

Sürücü Yöneticisi'nin SQLAllocHandle ve SQLFreeHandle'ı bu yeni tanıtıcı türünü kabul etmeyecektir.

SQL_HANDLE_DBC_INFO_TOKEN kimlik bilgileri gibi gizli bilgiler içerebilir. Bu nedenle, bir sürücü hassas bilgileri içeren bellek arabelleğini (SecureZeroMemory kullanılarak) güvenli bir şekilde temizlemeli ve sonra bu tanıtıcıyı SQLFreeHandle ile serbest bırakmalıdır. Bir uygulamanın ortam tutamacı kapatıldığında, ilişkili tüm bağlantı havuzları da kapatılır.

Driver Manager Bağlantı Havuzu Derecelendirme Algoritması

Bu bölümde Driver Manager bağlantı havuzu için derecelendirme algoritması ele alınmaktadır. Sürücü geliştiricileri geriye dönük uyumluluk için aynı algoritmayı uygulayabilir. Bu algoritma en iyi algoritma olmayabilir. Bu algoritmayı uygulamanıza göre geliştirmeniz gerekir (aksi takdirde, bu özelliği uygulamak için bir neden yoktur).

Sürücü Yöneticisi, havuzdaki her bağlantı için 0 ile 100 arasında bir integral derecelendirmesi döndürür. 0, bağlantının yeniden kullanılamayacağı anlamına gelir ve 100 mükemmel eşleşme olduğunu gösterir. Bağlantı isteğinin hRequest olarak ve havuzdaki mevcut bağlantının hCandidate olarak adlandırıldığını varsayalım. Aşağıdaki koşullardan biri yanlışsa, hCandidate havuzuna alınan bağlantı hRequest için yeniden kullanılamaz (Sürücü Yöneticisi 0 derecelendirmesi atar).

  • hCandidate ve hRequest hem UNICODE API'sinden (SQLDriverConnectW gibi) hem de ANSI API'sinden (SQLDriverConnectA gibi) gelir. (UNICODE sürücüleri, ANSI API ve UNICODE API'si ile farklı davranışlar gösterebilir (bkz. bağlantı özniteliği SQL_ATTR_ANSI_APP).)

  • hCandidate ve hRequest aynı işlev tarafından oluşturulur; SQLDriverConnect veya SQLConnect.

  • hCandidate'ı açmak için kullanılan bağlantı dizesi, SQLDriverConnect kullanıldığında hRequest ile aynı olmalıdır.

  • hCandidate'ı açmak için kullanılan ServerName (veya DSN), kullanıcı adı ve parola, SQLConnect kullanıldığında hRequest'i açmak için kullanılanla aynı olmalıdır.

  • Mevcut thread'in güvenlik tanımlayıcısı (SID), hCandidate'ı açmak için kullanılan SID ile aynı olmalıdır.

  • Kaydolması ve listeden çıkarılması pahalı olan sürücü için ( bkz. SQLConnect'te SQL_DTC_TRANSITION_COST tartışması), hRequest'in yeniden kullanılmasının fazladan bir liste veya liste dışı bırakma gerektirmemesi gerekir.

Aşağıdaki tabloda farklı senaryolar için puan ataması gösterilmektedir.

Havuza alınan bağlantı ile istek arasındaki bağlantı öznitelikleri karşılaştırması Liste Yok / liste dışı bırakma Ek Kayıt Gerektirir / Kayıttan Çıkar
Katalog (SQL_ATTR_CURRENT_CATALOG) farklıdır 60 50
Bazı bağlantı öznitelikleri farklıdır, ancak katalog aynıdır 90 70
Tüm bağlantı öznitelikleri mükemmel eşleştirildi 100 80

Sıralı Diyagram

Bu sıralı diyagram, bu konuda açıklanan temel havuzlama mekanizmasını gösterir. Yalnızca SQLDriverConnect kullanımını gösterir, ancak SQLConnect örneği benzerdir.

Sıralı Diyagram

Durum Diyagramı

Bu durum diyagramı, bu konuda açıklanan bağlantı bilgisi belirteci nesnesini gösterir. Diyagramda yalnızca SQLDriverConnect gösterilir, ancak SQLConnect olayı benzerdir. Sürücü Yöneticisi'nin hataları istediği zaman işlemesi gerekebileceğinden, Sürücü Yöneticisi herhangi bir durum için SQLFreeHandle'ı çağırabilir.

Durum Diyagramı

Ayrıca Bkz.

Driver-Aware Bağlantı Havuzu
ODBC Hizmet Sağlayıcısı Arabirimi (SPI) Referansı