【问题标题】:SubSonic 3.0.0.3 t4 template generation on lage database runs out of connections大型数据库上的 SubSonic 3.0.0.3 t4 模板生成连接不足
【发布时间】:2009-07-31 18:32:15
【问题描述】:

在对包含 1400 多个表的数据库运行模板时,我收到以下错误。服务器显示数百个连接。有谁知道这是一般模板生成的问题,还是这些模板的具体问题。其他较小的数据库对我来说可以生成。

运行转换:System.InvalidOperationException:超时已过期。在从池中获取连接之前超时时间已过。这可能是因为所有池连接都在使用中并且已达到最大池大小。

在 System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 在 System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection,DbConnectionFactory connectionFactory) 在 System.Data.SqlClient.SqlConnection.Open() 在 Microsoft.VisualStudio.TextTemplating8D8967BD3E8719BDA6DD9945992440F1.GeneratedTextTransformation.GetCommand(String sql) 在 c:\POS\POS.Win\Templates\SQLServer.ttinclude:line 13 在 Microsoft.VisualStudio.TextTemplating8D8967BD3E8719BDA6DD9945992440F1.GeneratedTextTransformation.LoadFKTables(String tableName) 在 c:\POS\POS.Win\Templates\SQLServer.ttinclude:line 179 在 Microsoft.VisualStudio.TextTemplating8D8967BD3E8719BDA6DD9945992440F1.GeneratedTextTransformation.LoadTables() 在 c:\POS\POS.Win\Templates\SQLServer.ttinclude:line 131 在 Microsoft.VisualStudio.TextTemplating8D8967BD3E8719BDA6DD9945992440F1.GeneratedTextTransformation.TransformText() 在 c:\POS\POS.Win\Templates\ActiveRecord.tt:line 21

【问题讨论】:

    标签: subsonic subsonic3 connection-pooling


    【解决方案1】:

    我在使用 250 个表的数据库时遇到了这个问题。查看 SQLServer.ttinclude,我发现了这个:

    var cmd=GetCommand(sql);   
    cmd.Parameters.AddWithValue("@tableName",table);   
    var result=cmd.ExecuteScalar();  
    cmd.Dispose();  
    if(result!=null)  
        pk=result.ToString();  
    

    改成这样:

    using (var cmd=GetCommand(sql))  
    {  
            cmd.Parameters.AddWithValue("@tableName",table);  
            int x = 0;  
     if (table == "tbl_Address")  
      x++;  
     var result=cmd.ExecuteScalar();  
    
     if(result!=null)  
      pk=result.ToString();     
    
     cmd.Connection.Close();      
    } 
    

    连接没有关闭,并且池中的连接在 100 之后用完。任何超过 100 个表的数据库都会遇到这个问题。我可以在不触及 SubSonic.Core 的情况下解决此问题,这真是太棒了。

    现在,如果我能花时间弄清楚 Git,我会将这个修复发布回亚音速项目。 :-D

    【讨论】:

    • 只想要我需要的,太棒了:)
    • 这里的"if(table == "tbl_Address")有什么意义?
    • 嗯。我三年前发过这个。我想知道这是否只是我在那里的一些调试代码来了解我的方向。看起来重要的一点是关闭连接。
    【解决方案2】:

    好吧,我可能建议在 1400 个表上运行 T4 可能不是最好的主意。鉴于此 - 您可以探索 T4 代码(在 SQLServer.tt 中)以查看我们如何加载表(在 LoadTables 中)并根据需要调整连接。

    生成 1400 个类 - 猜测最终输出的文件大小会很有趣...

    【讨论】:

    • SubSonic 2.1 处理得很好。
    • 这是一个不同的 app_domain 和不同的代码。正如我所提到的 - 代码就在 T4 模板中 - 为您的 1400 个表进行优化 :)
    • 当然,您是对的,我非常感谢您的指导。
    【解决方案3】:

    我在使用非常大的数据库(大量表、视图和 SP)时遇到了同样的问题。我在 Sql Server 2005 的 web.config 连接字符串中添加了以下内容 - Connect Timeout=60;

    这似乎可以解决问题。

    您还可以挖掘 .tt 和 .ttinclude 文件并设置 cmd.CommandTimeout。

    另外,这里是为特定表设置的常量:

    常量字符串 TABLE_SQL=@"SELECT * 来自 INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' and table_name = 'myTableA' or table_name = 'myTableB'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多