How does Subsonic handle connections?
- by Quintin Par
In Nhibernate you start a session by creating it during a BeginRequest and close at
EndRequest
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();
};
}
}
What’s the equivalent in Subsonic?
The way I understand, Nhibernate will close all the connections at endrequest.
Reason: While trouble shooting some legacy code in a Subsonic project I get a lot of MySQL timeouts,suggesting that the code is not closing the connections
MySql.Data.MySqlClient.MySqlException:
error connecting: Timeout expired. The
timeout period elapsed prior to
obtaining a connection from the pool.
This may have occurred because all
pooled connections were in use and max
pool size was reached. Generated: Tue,
11 Aug 2009 05:26:05 GMT
System.Web.HttpUnhandledException:
Exception of type
'System.Web.HttpUnhandledException'
was thrown. ---
MySql.Data.MySqlClient.MySqlException:
error connecting: Timeout expired.
The timeout period elapsed prior to
obtaining a connection from the pool.
This may have occurred because all
pooled connections were in use and max
pool size was reached. at
MySql.Data.MySqlClient.MySqlPool.GetConnection()
at
MySql.Data.MySqlClient.MySqlConnection.Open()
at
SubSonic.MySqlDataProvider.CreateConnection(String
newConnectionString) at
SubSonic.MySqlDataProvider.CreateConnection()
at
SubSonic.AutomaticConnectionScope..ctor(DataProvider
provider) at
SubSonic.MySqlDataProvider.GetReader(QueryCommand
qry) at
SubSonic.DataService.GetReader(QueryCommand
cmd) at
SubSonic.ReadOnlyRecord`1.LoadByParam(String
columnName, Object paramValue)
My connection string is as follows
<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>