Maksimum Bağlantı Havuzu 100'de kapatıldı


27

SQL Server 2008 R2 SP1'i Windows Server 2008 kutusunda çalıştırıyorum. Aşağıdakileri yapan Visual Studio 2010'dan çalışan bir .NET komut dosyası var:

  • Veritabanına ulaşır
  • Değişiklik yapar
  • yineler

Yinelemesinin toplam sayısı 150, ancak 100 bağlantıda duruyor ve nedenini bulamıyorum. Senaryoyu sadece tek bir iş parçacığı kullanacak şekilde ayarlayabilirdim, ancak ileride başvurmak için daha faydalı olacağı için maksimum bağlantı ayarını nerede kaçırdığımı bilmeyi tercih ederim.

İşte şimdiye kadar kontrol ettiğim yer:

  • Visual Studio 2010'da SQL Bağlantı Dizesi (1000 olarak ayarlanmıştır)
  • SSMS Veri Tabanı örneği bağlantı özellikleri (0 [sonsuz] kullanıcı bağlantısı olarak ayarlanmıştır)
  • Server 2008 ile ilgili bazı bilgiler googled, 100'den fazla bağlantıyı kaldırabilecek gibi görünüyor
  • SP_WHO2Mantıksal bağlantılar hakkında daha fazla bilgi veren kodumla birlikte adım attığımda , bağlantı sayısının 52'de başladığını ve "Mantıksal Bağlantılara Ulaşıldı" hata kodunun 152 mantıksal bağlantıda olduğunu görün.
  • Kullanılacak bağlantı dizesini değiştirdi Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000

Nerede kontrol edeceğimi bilmiyorum, burada çok hareketli parçalarım olduğunu biliyorum ama bir yerlerde maksimum havuz ayarını kaçırdığımı hissediyorum.


1
Bağlantı dizini gönderebilir misin? Lütfen cevabımı gör. Bu sizin çözümünüz olmalıdır (bu değer bağlantı dizgisinde belirtilecektir. System.Data.SqlClientVarsayılan olarak 100'dür, bu nedenle bağlantı havuzunun bitkinliğini görürsünüz).
Thomas Stringer

Yanıtlar:


24

SQL Server, varsayılan olarak maksimum 32767 bağlantıya izin verir . Kullanılarak değiştirilebilir sp_configure. Bu ayar için geçerli yapılandırmanızı görüntülemek için aşağıdaki sorguyu kullanın:

select * from sys.configurations
where name ='user connections'

Varsayılan olarak, value_in_use0'a eşit bir maksimum 32767 görmeniz gerekir (varsayılan ayarları kullanın). Bu değiştirilmişse, SQL Server'ı bağlantıda açıklandığı gibi diğer değerleri kullanacak şekilde yeniden yapılandırabilirsiniz.

Uygulamanızın dışında daha fazla etkinlik olabileceğinden (veya uygulamanız düşündüğünüzden daha fazla bağlantı yapıyor) , gerçekte kaç bağlantı yapıldığını da incelemelisiniz . > Ya Mantıksal Bağlantıları - Sen Genel İstatistikler bakmak isteyecektir perfmon veya değerleri sorgulamak sys.dm_os_performance_counters: (cntr_value zaman değeri güncel noktasını gösterecektir)

select * from sys.dm_os_performance_counters
where counter_name ='User Connections'

Evet, kullanıcı bağlantılarını zaten kontrol ettim (ilk gittiğim şey bu ve hem UI'da hem de Microsoft'un belgelerinde bulmak en kolay olanıydı. Ayrıca, kodumu atladım ve SSMS aracılığıyla mantıksal bağlantıların sayısına dikkat ettim. . mantıksal bağlantıları hakkında Rölantide bilgi iyi bir miktar verir sp_who2 kullanarak, benim sunucu 51 bağlantıları vardır komut başarısız olduğunda, o yapı 100 daha fazla bağlantı vardır ben şimdi nerede ele verdik Yani en nasıl...
Sean Uzun

Sorumu attığım adımlarla biraz daha netleştirdim. SQL'de hiç bir ayar olmayabilir, bu yüzden Windows ve Visual Studio ayarlarına bakmaya başladım.
Sean Long,

1
Bunları kontrol ettiyseniz ve hala 100 bağlantıda başarısız oluyorsa, cevap veritabanı ayarlarının dışında kalıyor. Bilginize, bu 51 bağlantı tüm sistem süreçleridir (kendiniz için +1).
Mike Fal,

Sadece biraz kapanma sağlamak için, bu son yorum doğru olarak sonuçlandı. Bu 100 bağlantının neden oluşturulduğunu ve kodda bir sızıntı bulunduğunu daha yakından inceledim. Düzelttikten sonra iyi çalışıyor. Yukarıdaki bilgiler yine de hala gerçekten yararlıdır ve umarım başkaları da faydalı bulmaktadır.
Sean Long

25

Bağlantı dizginizde, belirtin max pool size=<your desired max pool size>. Başka bir deyişle, eğer maksimum havuz boyutunu 500 değerine değiştirmek istiyorsanız, bağlantı dizginiz buna benzeyebilir:

"data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500"

Açıkçası, diğer parametrelerinizle çok fazla şey varsayıyorum, ancak bu size nasıl devam edeceğiniz konusunda iyi bir fikir verecektir. Bağlantı havuzu oluşturma, istemci tarafı sağlayıcı uygulamasıdır. Bağlantı dizesi aracılığıyla bu maksimum havuz büyüklüğü ayarını belirtmesi gereken istemcidir.

Ayrıca, bağlantılarınızı doğru bir şekilde kapattığınızdan veya elden çıkardığınızdan emin olun, aksi takdirde bağlantıları bağlarsınız. Bunun gibi bir şey (C #):

string connectionString = "data source=your_server; initial catalog=your_db; trusted_connection=true; max pool size=500";

using (SqlConnection dbConn = new SqlConnection(connectionString))
{
    using (SqlCommand sqlCmd = new SqlCommand())
    {
        sqlCmd.Connection = dbConn;
        sqlCmd.CommandText = "select 1;";

        // ... so on and so forth
    }
}

using(C #) blok çağırır IDisposable.Dispose()tamamlandıktan sonra. Ayrıca uygulayabileceği SqlConnection.Dispose()veya SqlConnection.Close()içinde finallybir blok try/catch/finallybloğu.

Başvuru: SqlConnection.ConnectionString özelliğine ilişkin MSDN Belgeleri


İşte bağlantı dizesi, sorum da güncelleniyor. Data Source=PerfSQL02;Initial Catalog=Masked;Integrated Security=True;Max Pool Size=1000
Sean Long,

3
Bu her yerde bağlantı diziniz mi? Sormamın nedeni, farklı bağlantı dizelerinin farklı bağlantı havuzları olacağıdır.
Thomas Stringer

Bu çok, çok iyi bir soru. Şimdiye kadar 3 bağlantı şeridini kontrol ettim ama hepsi yüksek bir havuza zorluyorlar. Bakalım buna neden olabilecek başka bir dize bulabilecek miyim.
Sean Long

Yürütmede yalnızca hata ayıklama yaparsanız SqlConnection.ConnectionString, belirli bir işlem için çalışma zamanı değerinin ne olduğuna bakabilmelisiniz . Bu en kolay yol olurdu. Eğer max pool sizeorada değilse, o zaman 100 olur.
Thomas Stringer

1
Bu OP'ye doğru cevap verdiği için kabul edilen cevap olarak işaretlenmelidir. Hem istemci bağlantı dizgisi Max Pool Size parametresini hem de bağlantıları kapatma / elden çıkarma gerekliliğini belirtiyor.
Adam Caviness
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.