SQL Server Bağlantı Havuzu (ADO.NET)SQL Server Connection Pooling (ADO.NET)

Bir veritabanı sunucusuna bağlanmak genellikle birkaç zaman alan adımdan oluşur.Connecting to a database server typically consists of several time-consuming steps. Yuva veya adlandırılmış kanal gibi bir fiziksel kanal oluşturulması gerekir, sunucu ile ilk el sıkışma gerçekleşmelidir, bağlantı dizesi bilgileri ayrıştırılmalıdır, bağlantının sunucu tarafından doğrulanması gerekir, bu, geçerli işlemde son listeye alındı ve bu şekilde devam eder.A physical channel such as a socket or a named pipe must be established, the initial handshake with the server must occur, the connection string information must be parsed, the connection must be authenticated by the server, checks must be run for enlisting in the current transaction, and so on.

Uygulamada çoğu uygulama, bağlantılar için yalnızca bir veya birkaç farklı yapılandırma kullanır.In practice, most applications use only one or a few different configurations for connections. Yani, uygulama yürütme sırasında birçok özdeş bağlantı tekrar tekrar açılıp kapatılacaktır.This means that during application execution, many identical connections will be repeatedly opened and closed. ADO.NET bağlantıları açma maliyetini en aza indirmek için, bağlantı havuzuadlı bir iyileştirme tekniği kullanır.To minimize the cost of opening connections, ADO.NET uses an optimization technique called connection pooling.

Bağlantı havuzu yeni bağlantıların kaç kez açılması gerektiğini azaltır.Connection pooling reduces the number of times that new connections must be opened. Havuzlayıcı fiziksel bağlantının sahipliğini tutar.The pooler maintains ownership of the physical connection. Belirli bir bağlantı yapılandırması için etkin bir etkin bağlantı kümesi tutarak bağlantıları yönetir.It manages connections by keeping alive a set of active connections for each given connection configuration. Kullanıcı Open bir bağlantı üzerinde her çağırdığında havuzlayıcı havuzda kullanılabilir bir bağlantı arar.Whenever a user calls Open on a connection, the pooler looks for an available connection in the pool. Havuza alınmış bir bağlantı varsa, yeni bir bağlantı açmak yerine bunu çağırana döndürür.If a pooled connection is available, it returns it to the caller instead of opening a new connection. Uygulama, bağlantıda çağrı yaparken Close , havuzlayıcı onu kapatmak yerine havuza alınmış etkin bağlantılar kümesine geri döndürür.When the application calls Close on the connection, the pooler returns it to the pooled set of active connections instead of closing it. Bağlantı havuza döndürüldüğünde, sonraki çağrıda yeniden kullanılmak üzere kullanılabilir Open .Once the connection is returned to the pool, it is ready to be reused on the next Open call.

Yalnızca aynı yapılandırmaya sahip bağlantılar havuza alınabilir.Only connections with the same configuration can be pooled. ADO.NET, her yapılandırma için bir tane olmak üzere birkaç havuzu aynı anda tutar.ADO.NET keeps several pools at the same time, one for each configuration. Bağlantılar, tümleşik güvenlik kullanıldığında bağlantı dizesine ve Windows kimliğine göre havuzlara ayrılır.Connections are separated into pools by connection string, and by Windows identity when integrated security is used. Bağlantılar Ayrıca, bir işlemde kayıtlı olup olmadıkları temel alınarak da havuza alınır.Connections are also pooled based on whether they are enlisted in a transaction. Kullanırken ChangePassword , SqlCredential örnek bağlantı havuzunu etkiler.When using ChangePassword, the SqlCredential instance affects the connection pool. Farklı örnekleri SqlCredential , Kullanıcı kimliği ve parola aynı olsa bile farklı bağlantı havuzları kullanacaktır.Different instances of SqlCredential will use different connection pools, even if the user ID and password are the same.

Havuzlama bağlantıları, uygulamanızın performansını ve ölçeklenebilirliğini önemli ölçüde geliştirebilir.Pooling connections can significantly enhance the performance and scalability of your application. Varsayılan olarak, ADO.NET ' de bağlantı havuzu etkindir.By default, connection pooling is enabled in ADO.NET. Açıkça devre dışı bırakılmadığınız sürece havuzlayıcı, uygulamanızda açılıp kapandıkça bağlantıları en iyi duruma getirir.Unless you explicitly disable it, the pooler optimizes the connections as they are opened and closed in your application. Ayrıca, bağlantı havuzu davranışlarını denetlemek için çeşitli bağlantı dizesi değiştiricileri sağlayabilirsiniz.You can also supply several connection string modifiers to control connection pooling behavior. Daha fazla bilgi için bu konunun devamındaki "bağlantı dizesi anahtar sözcükleriyle bağlantı havuzunu denetleme" bölümüne bakın.For more information, see "Controlling Connection Pooling with Connection String Keywords" later in this topic.

Not

Bağlantı havuzu etkinleştirildiğinde ve bir zaman aşımı hatası ya da başka bir oturum açma hatası oluşursa, bir özel durum oluşturulur ve sonraki bağlantı denemeleri sonraki beş saniye boyunca başarısız olur ve "engelleme dönemi".When connection pooling is enabled, and if a timeout error or other login error occurs, an exception will be thrown and subsequent connection attempts will fail for the next five seconds, the "blocking period". Uygulama engelleme süresi içinde bağlanmaya çalışırsa, ilk özel durum yeniden oluşturulur.If the application attempts to connect within the blocking period, the first exception will be thrown again. Bir engelleme süresi sona erdikten sonraki hatalar, önceki engelleme süresi kadar iki kez bir dakika kadar olan yeni bir engelleme dönemi oluşmasına neden olur.Subsequent failures after a blocking period ends will result in a new blocking periods that is twice as long as the previous blocking period, up to a maximum of one minute.

Havuz oluşturma ve atamaPool Creation and Assignment

Bir bağlantı ilk kez açıldığında, havuzu bağlantıdaki bağlantı dizesiyle ilişkilendiren tam bir eşleşen algoritmaya göre bir bağlantı havuzu oluşturulur.When a connection is first opened, a connection pool is created based on an exact matching algorithm that associates the pool with the connection string in the connection. Her bağlantı havuzu ayrı bir bağlantı dizesiyle ilişkilendirilir.Each connection pool is associated with a distinct connection string. Yeni bir bağlantı açıldığında, bağlantı dizesi var olan bir havuza tam eşleşme değilse yeni bir havuz oluşturulur.When a new connection is opened, if the connection string is not an exact match to an existing pool, a new pool is created. Bağlantılar işlem başına, her uygulama etki alanı, bağlantı dizesi başına ve tümleşik güvenlik kullanıldığında Windows kimliği başına havuza alınır.Connections are pooled per process, per application domain, per connection string and when integrated security is used, per Windows identity. Bağlantı dizeleri de tam eşleşme olmalıdır; aynı bağlantı için farklı bir sırada sağlanan anahtar sözcükler ayrı olarak havuza alınır.Connection strings must also be an exact match; keywords supplied in a different order for the same connection will be pooled separately.

Aşağıdaki C# örneğinde, üç yeni SqlConnection nesne oluşturulur, ancak bunları yönetmek için yalnızca iki bağlantı havuzu gerekir.In the following C# example, three new SqlConnection objects are created, but only two connection pools are required to manage them. Birinci ve ikinci bağlantı dizelerinin, için atanan değerle farklı olduğunu unutmayın Initial Catalog .Note that the first and second connection strings differ by the value assigned for Initial Catalog.

using (SqlConnection connection = new SqlConnection(  
  "Integrated Security=SSPI;Initial Catalog=Northwind"))  
    {  
        connection.Open();
        // Pool A is created.  
    }  
  
using (SqlConnection connection = new SqlConnection(  
  "Integrated Security=SSPI;Initial Catalog=pubs"))  
    {  
        connection.Open();
        // Pool B is created because the connection strings differ.  
    }  
  
using (SqlConnection connection = new SqlConnection(  
  "Integrated Security=SSPI;Initial Catalog=Northwind"))  
    {  
        connection.Open();
        // The connection string matches pool A.  
    }  

MinPoolSizeBağlantı dizesinde belirtilmemişse veya sıfır olarak belirtilmişse, havuzdaki bağlantılar bir süre etkinlik dışı kaldıktan sonra kapatılacaktır.If MinPoolSize is either not specified in the connection string or is specified as zero, the connections in the pool will be closed after a period of inactivity. Ancak, belirtilen değer MinPoolSize sıfırdan büyükse bağlantı havuzu, AppDomain kaldırılana ve işlem sona erene kadar yok edilmez.However, if the specified MinPoolSize is greater than zero, the connection pool is not destroyed until the AppDomain is unloaded and the process ends. Etkin olmayan veya boş havuzların bakımı en düşük sistem yükünü içerir.Maintenance of inactive or empty pools involves minimal system overhead.

Not

Havuz, yük devretme gibi önemli bir hata oluştuğunda otomatik olarak temizlenir.The pool is automatically cleared when a fatal error occurs, such as a failover.

Bağlantı eklemeAdding Connections

Her benzersiz bağlantı dizesi için bir bağlantı havuzu oluşturulur.A connection pool is created for each unique connection string. Bir havuz oluşturulduğunda, en düşük havuz boyutu gereksiniminin karşılanması için birden fazla bağlantı nesnesi oluşturulur ve havuza eklenir.When a pool is created, multiple connection objects are created and added to the pool so that the minimum pool size requirement is satisfied. Bağlantılar, belirtilen en büyük havuz boyutuna kadar (varsayılan olarak 100), havuza gerektiği şekilde eklenir.Connections are added to the pool as needed, up to the maximum pool size specified (100 is the default). Bağlantılar, kapalı veya atılmış olmaları durumunda havuza geri yayımlanır.Connections are released back into the pool when they are closed or disposed.

Bir SqlConnection nesne istendiğinde, kullanılabilir bir bağlantı varsa havuzdan alınır.When a SqlConnection object is requested, it is obtained from the pool if a usable connection is available. Kullanılabilir olması için bir bağlantının kullanılmamış olması, eşleşen bir işlem bağlamına sahip olması veya herhangi bir işlem bağlamı ile ilişkilendirilmemiş olması ve sunucuya geçerli bir bağlantısı olması gerekir.To be usable, a connection must be unused, have a matching transaction context or be unassociated with any transaction context, and have a valid link to the server.

Bağlantı havuzlayıcı, havuza geri yayımlandıklarında bağlantıları yeniden bulmaya göre bağlantı isteklerini karşılar.The connection pooler satisfies requests for connections by reallocating connections as they are released back into the pool. En büyük havuz boyutuna ulaşılmışsa ve kullanılabilir bir bağlantı yoksa, istek sıraya alınır.If the maximum pool size has been reached and no usable connection is available, the request is queued. Havuzlayıcı daha sonra zaman aşımına ulaşılana kadar tüm bağlantıları geri almaya çalışır (varsayılan değer 15 saniyedir).The pooler then tries to reclaim any connections until the time-out is reached (the default is 15 seconds). Bağlantı zaman aşımına uğramadan havuzlayıcı isteği karşılayamaz, bir özel durum oluşturulur.If the pooler cannot satisfy the request before the connection times out, an exception is thrown.

Dikkat

Bağlantının havuza döndürülabilmesi için, kullanmayı bitirdiğinizde bağlantıyı her zaman kapatmanızı öneririz.We strongly recommend that you always close the connection when you are finished using it so that the connection will be returned to the pool. Bunu, nesnesinin ya da yöntemlerinden birini ya da Close Dispose Connection C# içindeki bir deyimin içindeki tüm bağlantıları using ya da Using Visual Basic bir ifadesini kullanarak yapabilirsiniz.You can do this using either the Close or Dispose methods of the Connection object, or by opening all connections inside a using statement in C#, or a Using statement in Visual Basic. Açıkça kapatılmayan bağlantılar, havuza eklenmeyebilir veya havuza döndürülemez.Connections that are not explicitly closed might not be added or returned to the pool. Daha fazla bilgi için bkz. using deyimleri veya nasıl yapılır: Visual Basic Için sistem kaynağını atma .For more information, see using Statement or How to: Dispose of a System Resource for Visual Basic.

Not

Close Dispose Sınıfınızın yönteminde bir, veya Connection ya da başka bir DataReader yönetilen nesneyi Finalize çağırmayın.Do not call Close or Dispose on a Connection, a DataReader, or any other managed object in the Finalize method of your class. Sonlandırıcıda yalnızca, sınıfınızın doğrudan sahip olduğu yönetilmeyen kaynakları serbest bırakın.In a finalizer, only release unmanaged resources that your class owns directly. Sınıfınız hiçbir yönetilmeyen kaynağa sahip değilse, Finalize sınıf tanımınıza bir yöntem eklemeyin.If your class does not own any unmanaged resources, do not include a Finalize method in your class definition. Daha fazla bilgi için bkz. çöp toplama.For more information, see Garbage Collection.

Açma ve kapatma bağlantılarıyla ilişkili olaylar hakkında daha fazla bilgi için, SQL Server belgelerinde oturum açma olay sınıfını denetleme ve oturum kapatma olayı sınıfını denetleme bölümüne bakın.For more info about the events associated with opening and closing connections, see Audit Login Event Class and Audit Logout Event Class in the SQL Server documentation.

Bağlantılar kaldırılıyorRemoving Connections

Bağlantı havuzlayıcı yaklaşık 4-8 dakika boyunca boşta kaldıktan sonra havuzdan bir bağlantıyı kaldırır veya havuzlayıcı sunucuyla bağlantının bozulmuş olduğunu algılarsa.The connection pooler removes a connection from the pool after it has been idle for approximately 4-8 minutes, or if the pooler detects that the connection with the server has been severed. Bir bağlantı kurulan bağlantının yalnızca sunucuyla iletişim kurmaya çalıştıktan sonra algılanabileceğini unutmayın.Note that a severed connection can be detected only after attempting to communicate with the server. Artık sunucuya bağlı olmayan bir bağlantı bulunursa, geçersiz olarak işaretlenir.If a connection is found that is no longer connected to the server, it is marked as invalid. Geçersiz bağlantılar, bağlantı havuzundan yalnızca kapalı veya geri kazanılanlar sırasında kaldırılır.Invalid connections are removed from the connection pool only when they are closed or reclaimed.

Kaybolan bir sunucuya bağlantı varsa, bağlantı havuzlayıcı bağlantıyı algılamamış ve geçersiz olarak işaretlediği halde bu bağlantı havuzdan çizilebilirler.If a connection exists to a server that has disappeared, this connection can be drawn from the pool even if the connection pooler has not detected the severed connection and marked it as invalid. Bu durum, bağlantının hala geçerli olduğunu denetleme yükünün, sunucu üzerinde başka bir gidiş dönüş olmasına neden olarak bir Havuzluğa sahip olmanın avantajlarından ortadan kaldırılmasına neden olur.This is the case because the overhead of checking that the connection is still valid would eliminate the benefits of having a pooler by causing another round trip to the server to occur. Bu gerçekleştiğinde, bağlantıyı ilk kez kullanma denemesi bağlantının bozulmuş olduğunu algılar ve bir özel durum oluşturulur.When this occurs, the first attempt to use the connection will detect that the connection has been severed, and an exception is thrown.

Havuz temizleniyorClearing the Pool

ADO.NET 2,0, havuzu temizlemek için iki yeni yöntem sunmuştur: ClearAllPools ve ClearPool .ADO.NET 2.0 introduced two new methods to clear the pool: ClearAllPools and ClearPool. ClearAllPoolsbelirli bir sağlayıcı için bağlantı havuzlarını temizler ve ClearPool belirli bir bağlantıyla ilişkili bağlantı havuzunu temizler.ClearAllPools clears the connection pools for a given provider, and ClearPool clears the connection pool that is associated with a specific connection. Çağrı sırasında kullanılan bağlantılar varsa, bunlar uygun şekilde işaretlenir.If there are connections being used at the time of the call, they are marked appropriately. Kapatıldığında, havuza döndürülmek yerine atılır.When they are closed, they are discarded instead of being returned to the pool.

İşlem DesteğiTransaction Support

Bağlantılar havuzdan çizilir ve işlem bağlamına göre atanır.Connections are drawn from the pool and assigned based on transaction context. Enlist=falseBağlantı dizesinde belirtilmedikçe, bağlantı havuzu bağlantının bağlamda kayıtlı olduğundan emin olur Current .Unless Enlist=false is specified in the connection string, the connection pool makes sure that the connection is enlisted in the Current context. Bir bağlantı kapatılıp, kayıtlı bir işlemle havuza döndürüldüğünde System.Transactions , bu bağlantı havuzu için bir sonraki isteğin, varsa aynı işlemle aynı bağlantıyı döndürmesi için bu şekilde ayarlanır System.Transactions .When a connection is closed and returned to the pool with an enlisted System.Transactions transaction, it is set aside in such a way that the next request for that connection pool with the same System.Transactions transaction will return the same connection if it is available. Bu tür bir istek verildiyse ve havuza alınmış bağlantı yoksa, havuzun işlem temelli olmayan kısmından bir bağlantı çizilir ve listeye kaydedilir.If such a request is issued, and there are no pooled connections available, a connection is drawn from the non-transacted part of the pool and enlisted. Havuzun herhangi bir alanında hiçbir bağlantı yoksa, yeni bir bağlantı oluşturulur ve listeye kaydedilir.If no connections are available in either area of the pool, a new connection is created and enlisted.

Bir bağlantı kapatıldığında, havuza ve işlem bağlamına göre uygun alt bölüme geri gönderilir.When a connection is closed, it is released back into the pool and into the appropriate subdivision based on its transaction context. Bu nedenle, dağıtılmış bir işlem hala beklense de bir hata oluşturmadan bağlantıyı kapatabilirsiniz.Therefore, you can close the connection without generating an error, even though a distributed transaction is still pending. Bu, dağıtılmış işlemi daha sonra yürütmeniz veya iptal etmenizi sağlar.This allows you to commit or abort the distributed transaction later.

Bağlantı havuzu bağlantı dizesi anahtar sözcükleriyle denetleniyorControlling Connection Pooling with Connection String Keywords

ConnectionStringNesnesinin özelliği, SqlConnection bağlantı havuzu mantığının davranışını ayarlamak için kullanılabilen bağlantı dizesi anahtar/değer çiftlerini destekler.The ConnectionString property of the SqlConnection object supports connection string key/value pairs that can be used to adjust the behavior of the connection pooling logic. Daha fazla bilgi için bkz. ConnectionString.For more information, see ConnectionString.

Havuz parçalanmasıPool Fragmentation

Havuz parçalanması, uygulamanın, işlem bitene kadar serbest bırakılmamış çok sayıda havuz oluşturbildiği birçok Web uygulamasında yaygın bir sorundur.Pool fragmentation is a common problem in many Web applications where the application can create a large number of pools that are not freed until the process exits. Bu, bellek açma ve tüketme gibi çok sayıda bağlantı bırakır ve bu da performansı düşük bir performansla sonuçlanır.This leaves a large number of connections open and consuming memory, which results in poor performance.

Tümleşik güvenlik nedeniyle havuz parçalanmasıPool Fragmentation Due to Integrated Security

Bağlantılar bağlantı dizesine ve kullanıcı kimliğine göre havuza alınır.Connections are pooled according to the connection string plus the user identity. Bu nedenle, Web sitesinde ve tümleşik güvenlik oturumunda temel kimlik doğrulaması veya Windows kimlik doğrulaması kullanıyorsanız, Kullanıcı başına bir havuz alırsınız.Therefore, if you use Basic authentication or Windows Authentication on the Web site and an integrated security login, you get one pool per user. Bu, tek bir kullanıcı için sonraki veritabanı isteklerinin performansını artırsa da, bu kullanıcı diğer kullanıcılar tarafından yapılan bağlantılardan yararlanamaz.Although this improves the performance of subsequent database requests for a single user, that user cannot take advantage of connections made by other users. Ayrıca veritabanı sunucusuna Kullanıcı başına en az bir bağlantıya neden olur.It also results in at least one connection per user to the database server. Bu, geliştiricilerin güvenlik ve denetim gereksinimlerine göre karşılaştırmasını gerektiren belirli bir Web uygulaması mimarisinin yan etkisidir.This is a side effect of a particular Web application architecture that developers must weigh against security and auditing requirements.

Birçok veritabanı nedeniyle havuz parçalanmasıPool Fragmentation Due to Many Databases

Birçok Internet hizmet sağlayıcısı tek bir sunucuda birçok Web sitesini barındırır.Many Internet service providers host several Web sites on a single server. Bir form kimlik doğrulaması oturum açma bilgilerini doğrulamak ve bu kullanıcı veya Kullanıcı grubu için belirli bir veritabanına bağlantı açmak için tek bir veritabanı kullanabilirler.They may use a single database to confirm a Forms authentication login and then open a connection to a specific database for that user or group of users. Kimlik doğrulama veritabanına olan bağlantı havuza alınmış ve herkes tarafından kullanılır.The connection to the authentication database is pooled and used by everyone. Ancak, her bir veritabanına yönelik bağlantı sayısını artıran ayrı bir bağlantı havuzu vardır.However, there is a separate pool of connections to each database, which increase the number of connections to the server.

Bu, Uygulama tasarımının de yan etkıdır.This is also a side-effect of the application design. SQL Server bağlandığınızda güvenliği tehlikeye atmadan bu yan etkilerden kaçınmak için görece basit bir yol vardır.There is a relatively simple way to avoid this side effect without compromising security when you connect to SQL Server. Her Kullanıcı veya grup için ayrı bir veritabanına bağlanmak yerine, sunucuda aynı veritabanına bağlanın ve ardından Transact-SQL USE ifadesini çalıştırıp istenen veritabanına geçin.Instead of connecting to a separate database for each user or group, connect to the same database on the server and then execute the Transact-SQL USE statement to change to the desired database. Aşağıdaki kod parçası, veritabanına bir ilk bağlantı oluşturulmasını master ve sonra dize değişkeninde belirtilen istenen veritabanına geçmeyi gösterir databaseName .The following code fragment demonstrates creating an initial connection to the master database and then switching to the desired database specified in the databaseName string variable.

' Assumes that command is a valid SqlCommand object and that  
' connectionString connects to master.  
    command.Text = "USE DatabaseName"  
Using connection As New SqlConnection(connectionString)  
    connection.Open()  
    command.ExecuteNonQuery()  
End Using  
// Assumes that command is a SqlCommand object and that  
// connectionString connects to master.  
command.Text = "USE DatabaseName";  
using (SqlConnection connection = new SqlConnection(  
  connectionString))  
  {  
    connection.Open();  
    command.ExecuteNonQuery();  
  }  

Uygulama rolleri ve bağlantı havuzuApplication Roles and Connection Pooling

Bir SQL Server uygulama rolü sp_setapprole sistem saklı yordamı çağırarak etkinleştirildikten sonra, bu bağlantının güvenlik bağlamı sıfırlanamaz.After a SQL Server application role has been activated by calling the sp_setapprole system stored procedure, the security context of that connection cannot be reset. Ancak, Havuzlama etkinse bağlantı havuza döndürülür ve havuza alınmış bağlantı yeniden kullanıldığında bir hata oluşur.However, if pooling is enabled, the connection is returned to the pool, and an error occurs when the pooled connection is reused. Daha fazla bilgi için bkz. Bilgi Bankası makalesi, "OLE DB kaynak havuzlama Ile SQL uygulama rolü hataları".For more information, see the Knowledge Base article, "SQL application role errors with OLE DB resource pooling."

Uygulama rolü alternatifleriApplication Role Alternatives

Uygulama rolleri yerine kullanabileceğiniz güvenlik mekanizmalarının avantajlarından yararlanmanızı öneririz.We recommend that you take advantage of security mechanisms that you can use instead of application roles. Daha fazla bilgi için bkz. SQL Server uygulama rolleri oluşturma.For more information, see Creating Application Roles in SQL Server.

Ayrıca bkz.See also