2012-07-02 17 views
5
Ben zaman sonra aşağıdaki sorun süresini yüz ve bunu düzeltmek için nasıl bilmiyorum

.. talep sıkça

Sık sık Aşağıdaki hatalar olsun ve ben restart the IIS veya republish zorunda

geçici sorunu çözmek için zaman aşımına uğradı :

Error Message:Request timed out. 
Error Message:ERROR [08S01] [Informix .NET provider]Communication link failure. 
Error Message:Thread was being aborted. 

Ben yapmayı deneyin:

<httpRuntime executionTimeout="600" /> 

ama hala aynı sorunları !!



Stack Trace: 
    at System.Web.HttpContext.InvokeCancellableCallback(WaitCallback callback, Object state) 
    at System.Web.UI.Page.AsyncPageBeginProcessRequest(HttpContext context, AsyncCallback callback, Object extraData) 
    at ASP.appmaster_aspx.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object data) 
    at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 
    at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 
Benim PageLoad:

protected void Page_Load(object sender, EventArgs e) 
     { 


      if (Session["emp_num"] != null && !string.IsNullOrEmpty(Session["emp_num"].ToString())) 
      { 
       try 
       { 

        string user_setting = Personalization_DAL.CheckWidgetSettings(int.Parse(Session["emp_num"].ToString())); 

        if (!string.IsNullOrEmpty(user_setting)) 
        { 
         user_flag = int.Parse(user_setting); 
        } 

        GetLinkedApp = DB_Connection_s.DB_Connection.GetLinkedAppUser(int.Parse(Session["emp_num"].ToString())); 
        if (!Page.IsPostBack) 
        { 
         //Profile 
         GetProfile(); 

         if (Session["emp_app"] != null && !string.IsNullOrEmpty(Session["emp_app"].ToString())) 
         { 
          BindAvailableSystems(Session["emp_app"].ToString()); 
         } 

         BindMainSystems(); 

         if (GetLinkedApp > 0) 
         { 
          rlv_available_sys.Visible = true; 
          h5_app.Visible = true; 
          lbtn_addApp.Visible = false; 
          h4_app.Visible = false; 
          intro.Visible = true; 

         } 
         else 
         { 
          rlv_available_sys.Visible = false; 
          h5_app.Visible = false; 
          lbtn_addApp.Visible = true; 
          h4_app.Visible = true; 
          intro.Visible = false; 
         } 
         //Applications 
         if (rlv_available_sys.Visible == true) 
         { 
          Session["emp_app"] = GetLinkedApp; 
          BindAvailableSystems(Session["emp_app"].ToString()); 
          if (user_flag > 0) 
          { 
           Get_UserApplicationSystems(1, 1, GetLinkedApp.ToString()); 
          } 
          else 
          { 
           Get_UserApplicationSystems(user_flag, 1, GetLinkedApp.ToString()); 
          } 

         } 
         //services 
         Get_MainSystems(user_flag); 
         if (GetLinkedApp > 0) 
         { 
          GetServiceInformation(); 
         } 
         string[] statistics = TrackUser(); 
         base.TraceActivity("Enter the portal", "https://" + Request.Url.Authority + "/AppMaster.aspx", statistics[0], statistics[1], statistics[2]); 
        } 

        TraceSystemsMode(); 
       } 
       catch (Exception ee) 
       { 
        string message = ee.Message; 
       } 

      } 
      else 
      { 
       Response.Redirect("LoginPage.aspx", false); 
      } 
     } 

Benim jenerik işleyicisi:

public void ProcessRequest(HttpContext context) 
     { 
      try 
      { 
       using(Stream photo_stream = Photo_DAL.RetrievePhoto(int.Parse(context.Session["emp_num"].ToString()))) 
       { 
       byte[] photo_bytes = Photo_DAL.StreamToByteArray(photo_stream); 
       if (photo_bytes == null) 
       { 
        photo_bytes = File.ReadAllBytes(Path.Combine(context.Server.MapPath("~/images/PortalImages/"), "user.png")); 
       } 
       //context.Response.ContentType = "image/png"; 
       context.Response.BinaryWrite(photo_bytes); 
       } 
      } 
      catch (Exception ee) 
      { 
      } 

     } 
+1

plz şimdi 3 parça 1) elde veri 2 kodunuzu kırmaya .. Sadece veri getirmek ve veri eklemek ve jenerik işleyicisi üzerinden bir görüntü elde etmek için DB bağlanmak isteği – Zia

+0

yaptıklarınızla operasyonu tamam –

+1

anlatmak) veri ekleme ve 3) görüntü işleyici ve hangisinin zaman ayırdığını bulmak için birer birer devre dışı bırakarak çalıştırın. – Zia

cevap

9

Bu, söz konusu pasajdan söz konusu pasajdan göremediğimiz çok fazla başvurulan kod bulunduğundan spekülasyon.

Veritabanı bağlantılarınızı (DB_Connection_s) bir kaç nedenden ötürü düzgün bir şekilde kullanamadığınızı varsayacağım.

A) aracılığıyla Sabit Bana göre

I get the following errors frequently , and i had to restart the IIS or 
    republish to fix the problem temporary` 

sıfırlamak, bu yeniden başlatın veya yeniden yayınlamak zaman tüm güncel bağlantıları bırakılır çünkü yukarı veritabanına bağlantıları her kullandığınızı gösterir.

B) Hayır berrak bertaraf Kodunuzda

, sen ancak bir şekilde blok içine alınmış değildir ve büyük olasılıkla sert statik sınıf veya yöntemi (olduğu anlamına gelir örneği değil, DB_Connection_s referans Bu referans için hiçbir kod ile söylemek).

Öneri

her zaman düzgün veritabanı bağlantıları elden emin olun. NEDEN İHTİYACINIZ .Dispose(), bitince bunları çağırdı. Bu genellikle, içeriği koruyan ve IDisposable'u uygulayarak ve tüm çağrılarınızı o sınıf için bir kullanma deyimiyle sarmalayarak sınıfı alarak başarılır. Bir kullanma ifadesi otomatik olarak Dispose yöntemini çağırır. IDisposable'u uygulamamayı tercih ederseniz, sorgu tamamlandıktan sonra doğrudan bağlantı üzerinde .Dispose() numaralı telefonu arayarak, veritabanı bağlantınızı açık bir şekilde (önerilmemektedir) kullanabilirsiniz. Yeni eklenen yorumlara yanıt olarak

Düzenleme:

@just_name - yorumlarda burada kod bakıldığında, bir sorun olabileceğini geliyor bana. Bağlantınızı atmak için ~DBConnection()'a güvenmek, yalnızca .Close() numaralı telefonu aramak ve bir akışı kapatmamak bana göre göze çarpan şeydir.

i) finalizers bunu denir tam olarak ne zaman emin olamaz çünkü riskli olabilir bağlantının elden çıkarmak için bir finalizer kullanarak uzun bir süre

alabilir. "Sonatçının çöp toplama işlemi sırasında gerçekleştirdiği tam zaman tanımsızdır." - MSDN Object.Finalize. Bu, herhangi bir bağlantının bertaraf edilmesinden önce çok fazla kaynağa sahip olması durumunda sistemin çok uzun bir süre beklemesine neden olabilir. Eğer bir bağlantıda .Close() arayarak teknik açıdan güvenli olmasına rağmen

imha edilmez

ii) yakın olan otel, üretimde sorunlara neden olabilir. Bunun nedeni, bağlantının kapanmasıdır, ancak olay işleyicileri kalacaktır ve bazen de tembel yükleme söz konusuysa veya dinamik proxy'ler varsa, bu olay işleyicileri bağlantının kopyalarını tutabilir.

iii) Kullanım imha

a) bağlantısının bertaraf açıkça

daima açıkça çöp toplayıcı bunu yapmak için beklemeyin, bağlantınızın atın.Bunu elden çıkarmanın en iyi yolu, DBConnection sınıfınıza erişirken bir using(){} bloğunu kullanmak olacaktır. Bunu yapmak için birkaç değişiklik yapabilirsiniz:

IDisposable uygulamak için DbConnection tanımla yap Bu Böyle bir yeni DbConnection olanak sağlayacak

public class DBConnection : IDisposable 
{ 
    //other methods already in here 
    public void Dispose() 
    { 
    //Close_Connection(); Call this if you want, but you MUST call 
    //.Dispose on your connections 
    connection.Dispose(); 
    } 
} 

bir şekilde blok halinde kullanılabilir böylece:

using(var DB_Connection_s = new DBConnection()) 
{ 
//todo: interact with database connection 
} 

Kullanılan blok, son } numaralı telefona ulaşıldığında otomatik olarak .Dispose() numaralı telefonu arayacak ve bağlantıyı garantili olarak atacaktır. Dahası, bu, veritabanı erişimi ile ilgili herhangi bir kuyruğa sahip olsaydı sorguyu artıran ve hız talep edebilen veri tabanı ile daha küçük işlem sürelerinin oluşmasını sağlar. Kullandığınız blok uygulamasını beğenmezseniz

sonra en azından, sen yakın kullandıkları her yerde .Close().Dispose() değiştirmek ve hemen sonra çağrılan değil .Dispose() yol açar yürütme hiçbir olası yolu olmadığından emin olun veritabanı erişimi tamamlandı. yönetilmeyen kaynakları

üzerinde

b) Kullanım .Dispose() daima yönetilmeyen kaynakları üzerinde .Dispose() kullanın. Bunu yapmanın birkaç yolu vardır, ancak en iyi uygulama yolu using(){} bloğudur. Bunu, özellikle kodunuzda ele alınması gereken bir akışla tek bir yerde uygulayabileceğinizi farkettim.

Bu kodun kusurlu parçalarından biri:

IfxDataReader ifxDataReaders = DB_Connection.DBCmd.ExecuteReader(); 
if (ifxDataReaders.Read()) { 
item = (int)ifxDataReaders["emp_num"]; 
} 
ifxDataReaders.Close(); 

Bununla ilgili bir kaç alır. İlk olarak, yukarıda tartışılan .Close()'u arıyorsunuz. İkincisi, bu bir try bloğunda olduğu için, ifxDataReaders'ın bir istisna ataması mümkündür ve program, okuyucuyu hiç kapatmadan veya imha etmeden çalışmaya devam edecektir. Bu birçok soruna neden olabilir.

Yapmanız gereken, yönetilmeyen kaynaklarınız için .Dispose'un her zaman olduğundan emin olmanızdır. Bunu bir blok kullanarak yapabilirsiniz (ki bu da her zaman .Dispose()'u arar).

using(IfxDataReader ifxDataReaders = DB_Connection.DBCmd.ExecuteReader()) 
{ 
if (ifxDataReaders.Read()) { 
    item = (int)ifxDataReaders["emp_num"]; 
} 
} 
+0

' DB_Connection_s' db işlemleri ismiyle karıştırmak için kullanılan sınıf değil, isim biraz karışık olsa da .bağlantıları sondaki deyiminde ya da db katmanımdaki işlemin sonunda kapatılıyor. Bu yeterli değil? –

+0

i kod kullanıcı resmi (jenerik işleyicisi) getirmek ilgilidir eklemek –

+0

Örnek i bağlantıyı nasıl ele için:. –

2

Error Message:Request timed out'a ait olmadığını biliyorum, ancak Error Message:Thread was being aborted. ile bir bağlantı olabilir. Yani, herhangi bir kod örneğimiz olmadığı için, bir Try-Catch bloğu içinde yapıldığında bunun bir Response.Redirect("aPage.aspx") sorun olabileceğini düşünmesine izin verdiğinizi düşünüyorum. senin durum buysa burada gösterildiği gibi

, Response.Redirect yöntemin EndResponse parametresine bir "Yanlış" eklemeyi deneyin:

try { 
    // [... SOME CODE ...] 
    Response.Redirect("aPage.aspx", False) 
} catch (Exception e) { 
    // [... YOUR CATCH ...] 
} 
+0

aynı sorun :( –

2

Yani yukarı olarak yalıtmak tek tek parçaları çalıştırmak düşündüren Zia yorumunu zaman aşımı. Informix bağlantısında bir hata olabilir mi?

Veritabanı sorgularında iki zaman aşımı var, bağlantı zaman aşımı ve komut zaman aşımı. Bunlardan hiçbiri, executionTimeout değerini kullanmaz. Informix sağlayıcısı kullanmayı denemedim, ancak sunucu meşgulse veya komut nesnesi uzun bir SQL sorgusu için beklemek için bağlantı nesnesindeki zaman aşımlarını artırdım. Ana soru, neden bu kadar uzun sürüyor edilir http://publib.boulder.ibm.com/infocenter/idshelp/v115/index.jsp?topic=%2Fcom.ibm.net_cc.doc%2Fcom.ibm.swg.im.dbclient.adonet.ref.doc%2Fdoc%2FDB2ConnectionClassConnectionTimeoutProperty.htm

+0

Bağlantı dizisinde Connection Lifetime = 30; 'öğesini ayarlıyorum ve bu süreyi artırdım ama boşuna –

2

İşte

... ınformix bağlantı nesnede ConnectionTimeout ayarı bağlantısıdır? Neden bir sayfaya yapılan isabet 30 saniyeden fazla sürüyor? Gerçekten böyle yavaş bir siteyle yaşayabiliyor musun?

Performansı nasıl düşüreceğinizi görmeliyiz, böylece istek 30 saniye içinde tamamlanır.

Kodu paylaşabilir misiniz? Tıkanıklığın kod üzerinde nerede olduğunu görelim.

+0

kod koydum: 'page_load()'. Kontrol edermisiniz lütfen? –

İlgili konular