Subsonic 亚音速ActiveRecord-添加大量记录时连接挂起

Subsonic 亚音速ActiveRecord-添加大量记录时连接挂起,subsonic,subsonic3,Subsonic,Subsonic3,当我使用亚音速ActiveRecord和SQLServer快速添加大量新记录时,我遇到了一个熟悉的超时SqlException 超时已过期。超时时间 在获得 来自池的连接。今年五月 已发生,因为所有 连接正在使用,最大池数 尺寸已达到 我通过以下简单的代码块成功地复制了这个问题: for (int i = 0; i < 1000; i++) { var address = new Address(); address.City = "TEST

当我使用亚音速ActiveRecord和SQLServer快速添加大量新记录时,我遇到了一个熟悉的超时SqlException

超时已过期。超时时间 在获得 来自池的连接。今年五月 已发生,因为所有 连接正在使用,最大池数 尺寸已达到

我通过以下简单的代码块成功地复制了这个问题:

    for (int i = 0; i < 1000; i++)
    {
        var address = new Address();
        address.City = "TEST";
        address.Save();
    }
for(int i=0;i<1000;i++)
{
var address=新地址();
地址:City=“TEST”;
address.Save();
}
代码将添加记录,直到它达到100(最大池大小,可能不是巧合),在这一点上它会失败,出现上述异常。在此之后,连接将保持5-10分钟左右,在此期间,所有使用数据库的尝试都会出现上述异常

有趣的是,我发现在VS(针对完全相同的数据库实例的相同代码库)中的本地计算机上运行此代码可以成功地添加所有1000条记录。也许这里和我的主机之间的延迟只是使数据库调用的速度减慢了很多


考虑到它在本地工作,我想这不是直接的亚音速问题,但是,我是否犯了一些错误,或者我是否可以更改代码或配置来处理连续添加大量记录时出现的快速打开和关闭连接的问题?

我在AR和SimpleRepo上运行了性能测试,该测试循环了100000条记录,并且非常困难-连接问题实际上是第一站当进行性能调优时

这就是说,我们在预发行版中确实遇到了一个问题,一个阅读器没有打开:)。我几个月前就修好了,所以你能确认你有最新的吗


另外-是的,延迟可能很奇怪。我不知道细节,但看起来就是这样。

我在使用MySQL时也遇到了同样的问题。实例化一个新的活动记录对象,然后调用save导致一个从未关闭的连接被打开

找到了一个似乎有效的修复(感谢kamsar)显然问题是由于未关闭的阅读器造成的

将第197行更改为 SubSonicRepository.cs(3.0.0.3)至 “使用(DbDataReader rdr= provider.ExecuteReader(查询))“(以及 用合适的包装材料包装材料 范围约为218)似乎有 帮我解决了

所以代码最终看起来像这样,没有更多的连接泄漏

            //var rdr = provider.ExecuteReader(query);
            using (System.Data.Common.DbDataReader rdr = provider.ExecuteReader(query))
            {
                if (rdr.Read())
                    result = rdr[0];
                // repopulate primary key column with newly generated ID
                if (result != null && result != DBNull.Value)
                {

                    try
                    {
                        var tbl = provider.FindOrCreateTable(typeof(T));
                        var prop = item.GetType().GetProperty(tbl.PrimaryKey.Name);
                        var settable = result.ChangeTypeTo(prop.PropertyType);
                        prop.SetValue(item, settable, null);

                    }
                    catch (Exception x)
                    {
                        //swallow it - I don't like this per se but this is a convenience and we
                        //don't want to throw the whole thing just because we can't auto-set the value
                    }
                }
            }

InnerSphere有正确的答案。我不能投赞成票,因为我没有代表分数,也不知道如何简单地回复/评论他的帖子

唯一需要添加的是,如果您从GitHub中提取代码,那么该修复程序已经包含在内


编译并使用从主干代码创建的DLL后没有问题。

我必须在获得结果后立即添加
rdr.Close()
,即:

if (rdr.Read())
  result = rdr[0];

rdr.Close();

谢谢你的发帖,我真的没想到你的AR有问题。我用的是3.0.0.3。必须与托管提供程序或ASP.NET配置有关。更奇怪的是:100次添加后,即使在2个浏览器窗口中同时加载运行添加的页面,也会成功地重复完成。使用101时,它每次都会失败,并无限期地锁定所有连接。在每次添加后延迟以模拟延迟并降低连接/断开连接的速度并没有帮助。运行.Find()命令代替.Add()命令也有同样的效果。在AR之外再运行一个数据点,在主机上这样做不会失败:(创建一个新的sqlconnection,新的sqlcommand,打开conn,以文本命令的形式运行insert cmd,处理cmd,关闭conn)在循环内部似乎可以达到无限计数。可能是AR如何释放/处理与主机配置冲突的连接/命令?