2009-11-12 81 views
0

我使用LINQ从亚音速3这样的:次声波不关闭连接

for(int x; x < 100; x++) { 
    var v = (from c in db.categories 
      where c.parent == 10 
      select c); 

    if (v.Count() > 0) return null; 

    category[] c = v.ToArray(); 
} 

出于某种原因亚音速不关闭连接...所以上面的循环用完了几运行后的SQL连接池或MySQL只是拒绝允许更多的连接......我已经尝试了这两个与SS 3.0.3和SVN,我不断收到这些错误。

我得到一组结果后应该如何关闭连接?

谢谢

+0

即使我不能回答你的问题,谢谢你给我展示SubSonic :)我想我找到了解决问题所需的解决方案。 – Femaref 2009-11-12 20:19:04

回答

3

问题 - 相信与否 - 不是亚音速。这是$ * $ & $ MySQL驱动程序。当你做这样的查询时,我们明确地关闭了连接,但是我已经看到MySQL驱动程序完全忽略了闭包,转而采用一些真正蹩脚的优化尝试。

我不知道该告诉你什么 - 我很遗憾地说。

+0

我还有另一个原因来切换MySQL ... 感谢您的帮助,但。 – 2009-11-13 15:11:55

3

似乎有一些MySQL .NET库的问题。几天前,他们解决了与释放连接有关的6.2.2中的一些问题。 但是,SubSonic也存在问题。我用MySQL的LINQ模板来生成我的类。每当FirstOrDefault()或First()(其他类似的函数可能有相同的问题)。

对于查询如:

var db = new MyDb("CONNECTIONSTRING_NAME"); 

var userExt = (from pe in db.PhoneExtensions 
       where 
        pe.FirstName.ToLower() == firstName.ToLower() && 
        pe.LastName.ToLower() == lastName.ToLower() 
       select pe.Extension).FirstOrDefault(); 

这将导致要被执行的查询,并且读者将不被布置。

问题出在Project的T方法中的Linq.Structure.DbQueryProvider中。

while (reader.Read()) 
{ 
    yield return fnProjector(reader); 
} 
reader.Dispose(); 

当使用FirstOrDefault()和其他类似的方法时,Dispose()永远不会被调用。

一个简单的修正:

try 
{ 
    while (reader.Read()) 
    { 
     yield return fnProjector(reader); 
    } 
} 
finally 
{ 
    reader.Dispose(); 
} 

简单快速的测试显示的问题:

private class DbDataReader : System.IDisposable 
{ 
    #region IDisposable Members 

    public void Dispose() { } 

    #endregion 
} 
private class DbQueryProvider 
{ 
    private DbDataReader _reader; 

    public bool IsReaderDisposed { get { return _reader == null; } } 

    public DbQueryProvider() 
    { 
     _reader = new DbDataReader(); 
    } 

    public IEnumerable<int> Project(int numResults) 
    { 
     int i = 0; 
     while (i < numResults) 
     { 
      yield return i++; 
     } 
     _reader.Dispose(); 
     _reader = null; 
    } 

    public IEnumerable<int> ProjectWithFinally(int numResults) 
    { 
     int i = 0; 
     try 
     { 
      while (i < numResults) 
      { 
       yield return i++; 
      } 
     } 
     finally 
     { 
      _reader.Dispose(); 
      _reader = null; 
     } 
    } 

} 

[Test] 
public void YieldReturn_Returns_TrueForIsReaderDisposed() 
{ 
    const int numResults = 1; 

    var qp1 = new DbQueryProvider(); 
    var q1 = qp1.Project(numResults); 
    Assert.IsInstanceOf(typeof(int), q1.First()); 

    var qp2 = new DbQueryProvider(); 
    var q2 = qp2.Project(numResults); 
    Assert.IsInstanceOf(typeof(int), q2.FirstOrDefault()); 

    var qp3 = new DbQueryProvider(); 
    var q3 = qp3.Project(numResults); 
    Assert.IsInstanceOf(typeof(int), q3.Single()); 

    var qp4 = new DbQueryProvider(); 
    var q4 = qp4.Project(numResults); 
    Assert.IsInstanceOf(typeof(int), q4.SingleOrDefault()); 

    Assert.IsTrue(qp1.IsReaderDisposed); 
    Assert.IsTrue(qp2.IsReaderDisposed); 
    Assert.IsTrue(qp3.IsReaderDisposed); 
    Assert.IsTrue(qp4.IsReaderDisposed); 
} 

[Test] 
public void YieldReturnFinally_Returns_TrueForIsReaderDisposed() 
{ 
    const int numResults = 1; 

    var qp1 = new DbQueryProvider(); 
    var q1 = qp1.ProjectWithFinally(numResults); 
    Assert.IsInstanceOf(typeof(int), q1.First()); 

    var qp2 = new DbQueryProvider(); 
    var q2 = qp2.ProjectWithFinally(numResults); 
    Assert.IsInstanceOf(typeof(int), q2.FirstOrDefault()); 

    var qp3 = new DbQueryProvider(); 
    var q3 = qp3.ProjectWithFinally(numResults); 
    Assert.IsInstanceOf(typeof(int), q3.Single()); 

    var qp4 = new DbQueryProvider(); 
    var q4 = qp4.ProjectWithFinally(numResults); 
    Assert.IsInstanceOf(typeof(int), q4.SingleOrDefault()); 

    Assert.IsTrue(qp1.IsReaderDisposed); 
    Assert.IsTrue(qp2.IsReaderDisposed); 
    Assert.IsTrue(qp3.IsReaderDisposed); 
    Assert.IsTrue(qp4.IsReaderDisposed); 
} 

YieldReturnFinally_Returns_TrueForIsReaderDisposed通过,但YieldReturn_Returns_TrueForIsReaderDisposed失败。

我已经测试了这个项目,我正在研究哪个项目即将投入生产,这似乎没有任何问题。测试连接池的最大大小为5,并且没有连接池问题(每次执行1个查询时,从未在我的开发机器上耗尽连接)。 我还发现与类型更改和赋值有关的Extensions.Database中的一些问题。

我在github上分支了项目,承诺了我的修改并做了一个pull请求,希望能够找到合适的人。