【问题标题】:How does Subsonic handle connections?Subsonic 如何处理连接?
【发布时间】:2009-08-11 13:26:45
【问题描述】:

在 Nhibernate 中,您通过在 BeginRequest 期间创建会话来启动会话并在 结束请求

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();
        };
    }
}

Subsonic 中的等价物是什么?

据我了解,Nhibernate 将在 endrequest 时关闭所有连接。

原因:在解决 Subsonic 项目中的一些遗留代码时遇到很多 MySQL 超时,这表明代码没有关闭连接

MySql.Data.MySqlClient.MySqlException: 连接错误:超时。这 超时时间之前过去 从池中获取连接。 这可能是因为所有 池连接正在使用中并且最大 已达到池大小。生成:星期二, 格林威治标准时间 2009 年 8 月 11 日 05:26:05 System.Web.HttpUnhandledException: 类型异常 'System.Web.HttpUnhandledException' 被抛出。 ---> MySql.Data.MySqlClient.MySqlException: 连接错误:超时。 超时时间过去之前 从池中获取连接。 这可能是因为所有 池连接正在使用中并且最大 已达到池大小。在 MySql.Data.MySqlClient.MySqlPool.GetConnection() 在 MySql.Data.MySqlClient.MySqlConnection.Open() 在 SubSonic.MySqlDataProvider.CreateConnection(字符串 新连接字符串)在 SubSonic.MySqlDataProvider.CreateConnection() 在 SubSonic.AutomaticConnectionScope..ctor(DataProvider 提供者)在 SubSonic.MySqlDataProvider.GetReader(QueryCommand qry) 在 SubSonic.DataService.GetReader(查询命令 cmd) 在 SubSonic.ReadOnlyRecord`1.LoadByParam(字符串 列名,对象参数值)

我的连接字符串如下

<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>

【问题讨论】:

    标签: .net subsonic


    【解决方案1】:

    除非您专门用“SharedDbConnectionScope”包装您的东西,否则它总是一次性的。我以前见过这种情况——特别是在 Windows 上测试 MySQL 时——问题是 MySQL 驱动程序有问题并且没有关闭连接。

    我能够通过创建一个控制台应用程序和一个基本阅读器然后循环它来重现这一点 - bam。连接池错误。

    答案不多,我知道,但你能做什么。

    【讨论】:

    • Rob,我不明白这部分 =“除非你专门用“SharedDbConnectionScope”包装你的东西,否则它总是一次性的。“。我该怎么做呢?。你能给我举个例子吗?
    • 所以如果我不想打开和关闭很多连接,我必须使用这个 SharedDbConnectionScope?这似乎很重要!如果我不关心事务,你知道我是否还需要 TransactionScope?
    【解决方案2】:

    在错误地使用 SubSonic 之前,我也遇到过同样的错误。我们有一段 Javascript 每隔 2 分钟左右对服务器进行一次 ping 操作,以保持我们的会话处于活动状态,当它 ping 服务器时,调用了使用 DataReader 的 Membership。无论如何,长话短说,我们并没有关闭阅读器,即使只有少数用户,小小的保持活动脚本也会慢慢吞噬我们所有 160 个允许的连接。您可能想检查您是否以这种方式使用 SubSonic(从查询中返回 IDataReader,然后不处理它们)

    【讨论】:

      猜你喜欢
      • 2012-12-12
      • 1970-01-01
      • 2016-06-18
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多