2017-05-09 97 views
5

Bazı verileri Dapper kullanarak SQL Server'a yazmak için yazdım. Diğer çalışmalara devam etmeden önce bu yazının tamamlanmasını beklemek zorunda değilim, bu nedenle bu zaman uyumsuz hale getirmek için Task.Run() öğesini kullanmak istiyorum. I (kullanarak) varC#, Dapper, SQL Server ve Bağlantı Havuzları

sistemimin geri kalanında bu çağırmak için ifadeleri:

using (IDataAccess ida = new DAL()) 
     { 
      ida.WriteMessageToDB(id, routingKey, msgBody); 
     } 

otomatik using ifadesi koştu olduğunda dbConnection.State kontrol edin ve eğer basit bir düzeltme dener Benim DAL kapalı. Bu, herhangi bir uyumsuz/TPL seçim çağrıları için iyi çalışır.

Ancak, aynı anda bir yazım yükü attığımda, Task.Run() kodu, bazıları için bağlantı kapatılmış olarak düşüyordu - aslında kodun paralel doğasının devlet anlamına geldiğini düşünüyorum diğer görevler tarafından kapatılıyordu.

Bunu Connection.tate dosyasını Task.Run() kodunda açmak için bir kontrol yaparak 'düzelttim' ve bu sorunun 'çözülmüş' gibi görünüyor. böylece gibi: Bundan sonra SSMS gelen SELECT * FROM sys.dm_exec_connections çalıştırdığınızda

Task.Run(() => 
      { 
       if (dbConnection.State == ConnectionState.Closed) 
       { 
        dbConnection.Open(); 
       } 

       if (dbConnection.State == ConnectionState.Open) 
       { 
        *Dapper SQL String and Execute Commands* 
       } 
      }); 

, çok daha fazla bağlantı görmek. Beklenecek mi?

Şimdi anladığım kadarıyla:

  • Zarif otomatik bağlantı havuzu ile mücadele etmesi
  • SQL Server havuzlaması bağlantısı ile uğraşmaz?

Bu çözümde bir sorun var mı? Ya da bunu yapmanın daha iyi bir yolu? Bağlantı havuzlarını bariz nedenlerle ve mümkün olduğunca acısız olarak kullanmak isterim.

Şimdiden teşekkürler.

+5

İlk olarak, Dapper açık değilse bağlantıyı açar. İkincisi, Dapper sadece bağlantı havuzundan bağlantıları kullanacak olan ADO.Net'i kullanıyor. Son olarak Dapper, 'Task.Run' yerine kullanabileceğiniz uyumsuz yöntemlere sahiptir. – juharr

cevap

1

Teşekkürler Juharr - Cevabınızı yazdım.

başkalarına Başvuru için, ben beklemek üzere fonksiyon ve Zarif asenk yazma değişti:

private async Task WriteMessageToDB(Guid id, string tableName, string jsonString) 
    { 
      string sql = *Redacted* 
      await dbConnection.ExecuteScalarAsync<int>(sql, new { ID = id, Body = jsonString }); 
    } 

Sonra sonucunu izler arayan içinde yeni bir görev yarattı.

Bu, sürekli olarak yük altında çalışıyor ve aşırı yeni bağlantıların oluşturulmadığını göremiyor.