2009-08-11 8 views
3

In Nhibernate starten Sie eine Sitzung, indem sie es während einer Beginrequest und in der Nähe bei EndrequestWie funktioniert Subsonic Verbindungen?

public class Global: System.Web.HttpApplication 
{ 
    public static ISessionFactory SessionFactory = CreateSessionFactory(); 

    protected static ISessionFactory CreateSessionFactory() 
    { 
     return new Configuration() 
      .Configure(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "hibernate.cfg.xml")) 
      .BuildSessionFactory(); 
    } 

    public static ISession CurrentSession 
    { 
     get{ return (ISession)HttpContext.Current.Items["current.session"]; } 
     set { HttpContext.Current.Items["current.session"] = value; } 
    } 

    protected void Global() 
    { 
     BeginRequest += delegate 
     { 
      CurrentSession = SessionFactory.OpenSession(); 
     }; 
     EndRequest += delegate 
     { 
      if(CurrentSession != null) 
       CurrentSession.Dispose(); 
     }; 
    } 
} 

Was ist das Äquivalent in Subsonic zu schaffen?

So wie ich es verstehe, wird Nhibernate alle Verbindungen bei endrequest schließen.

Grund: Während Mühe einige Legacy-Code in einem Subsonic Projekt Schießen ich viele MySQL erhalten Timeouts was darauf hindeutet, dass der Code nicht die Verbindungen

endet

MySql.Data.MySqlClient.MySqlException : Fehler beim Verbinden: Timeout abgelaufen. Die Timeout-Zeit ist vor verstrichen, um eine Verbindung vom Pool zu erhalten. Dies ist möglicherweise aufgetreten, weil alle gepoolten Verbindungen verwendet wurden und die Poolgröße erreicht wurde. Generiert: Di 11. August 2009 05.26.05 GMT System.Web.HttpUnhandledException: Ausnahme vom Typ 'System.Web.HttpUnhandledException' wurde geworfen. ---> MySql.Data.MySqlClient.MySqlException: Fehler beim Verbinden: Timeout abgelaufen. Das Zeitlimit ist vor abgelaufen, um eine Verbindung vom Pool zu erhalten. Dies ist möglicherweise aufgetreten, weil alle gepoolten Verbindungen verwendet wurden und die Poolgröße erreicht wurde. bei MySql.Data.MySqlClient.MySqlPool.GetConnection() bei MySql.Data.MySqlClient.MySqlConnection.Open() bei SubSonic.MySqlDataProvider.CreateConnection (String newConnectionString) bei SubSonic.MySqlDataProvider.CreateConnection() bei SubSonic.AutomaticConnectionScope..ctor (DataProvider- Provider) bei SubSonic.MySqlDataProvider.GetReader (QueryCommand qry) bei SubSonic.DataService.GetReader (QueryCommand cmd) bei SubSonic.ReadOnlyRecord`1.LoadByParam (String column , Objekt paramValue)

Meine Verbindungszeichenfolge ist wie folgt

<connectionStrings> 
    <add name="xx" connectionString="Data Source=xx.net; Port=3306; Database=db; UID=dbuid; PWD=xx;Pooling=true;Max Pool Size=12;Min Pool Size=2;Connection Lifetime=60" /> 
    </connectionStrings> 

Antwort

5

Es ist immer ein einmaliger Schuss, wenn Sie speziell Ihr Material mit einem „SharedDbConnectionScope“ wickeln. Ich habe das schon einmal gesehen - speziell beim Testen von MySQL unter Windows - und das Problem ist, dass der MySQL-Treiber fehlerhaft ist und Verbindungen nicht abbricht.

Ich war in der Lage, dies zu reproduzieren, indem ich eine Konsolen-App und ein Grundleser dann Looping über es - Bam. ConnectionPool Fehler.

Nicht viel von einer Antwort, ich weiß, aber was können Sie tun.

+0

Rob, ich habe diesen Teil nicht verstanden = "Es ist immer ein einmaliger Versuch, es sei denn du Umhüllen Sie Ihre Sachen speziell mit einem "SharedDbConnectionScope". ". Wie mache ich das?. Kannst du mich auf ein Beispiel hinweisen? –

+0

Schauen Sie hier http://subsonicproject.com/docs/3.0_Transactions –

+0

Also wenn ich nicht viele Verbindungen öffnen und schließen möchte, muss ich dieses SharedDbConnectionScope verwenden? Das scheint ziemlich wichtig zu sein !! Weißt du, ob ich noch ein TransactionScope brauche, wenn mir Transaktionen egal sind? – Rory

4

Ich habe die gleiche Art von Fehler zuvor mit Subsonic incorrectly verwendet. Wir hatten ein Stück Javascript, das den Server alle 2 Minuten anpingelte, nur um unsere Sitzung am Leben zu erhalten und als es den Server anpingelte, wurde ein Anruf zu unserer Mitgliedschaft gemacht, der einen DataReader verwendete.Lange Rede, kurzer Sinn: Wir haben den Leser nicht geschlossen und das kleine Keep-Alive-Skript würde langsam alle unsere 160 erlaubten Verbindungen auffressen, selbst mit nur einer Handvoll Usern. Vielleicht möchten Sie überprüfen, ob Sie SubSonic auf diese Weise verwenden (IDataReader aus Abfragen zurückgeben und dann nicht entsorgen)