2

1400 以上のテーブルを持つデータベースに対してテンプレートを実行すると、次のエラーが発生します。サーバーは何百もの接続を示しています。これが一般的なテンプレート生成の問題なのか、それともこれらのテンプレートの問題なのかは誰にもわかりません。他の小さな DB は問題なく生成されます。

実行中の変換: 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 で。 c:\POS\POS.Win\Templates\SQLServer.ttinclude の GeneratedTextTransformation.GetCommand(String sql): c:\POS\POS.Win\Templates の Microsoft.VisualStudio.TextTemplating8D8967BD3E8719BDA6DD9945992440F1.GeneratedTextTransformation.LoadFKTables(String tableName) の 13 行目\SQLServer.ttinclude: Microsoft.VisualStudio.TextTemplating8D8967BD3E8719BDA6DD9945992440F1.GeneratedTextTransformation.LoadTables() の 179 行目 c:\POS\POS.Win\Templates\SQLServer.ttinclude:Microsoft.VisualStudio の 131 行目。c:\POS\POS.Win\Templates\ActiveRecord.tt:line 21 の TextTemplating8D8967BD3E8719BDA6DD9945992440F1.GeneratedTextTransformation.TransformText()

4

3 に答える 3

8

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 を超えるテーブルを持つ DB では、この問題が発生します。SubSonic.Core に触れずにこれを修正できたのは非常に素晴らしいことです。

今、Git を理解するのに時間を費やすことができれば、この修正を subsonic プロジェクトに投稿します。:-D

于 2009-11-18T20:30:45.417 に答える
1

1400 のテーブルで T4 を実行することは、おそらく最良のアイデアではないことを示唆しているかもしれません。それを考えると、T4 コード (SQLServer.tt 内) を調べて、テーブル (LoadTables 内) をロードする方法を確認し、必要に応じて接続を修正することができます。

1400 個のクラスが生成されました - 最終出力のファイル サイズを推測するのは楽しいでしょう...

于 2009-08-01T00:27:49.347 に答える
0

非常に大規模なデータベース (多数のテーブル、ビュー、および SP) で同じ問題が発生しました。Sql Server 2005 の web.config 接続文字列に以下を追加しました - Connect Timeout=60;

これはトリックを行うように見えました。

.tt および .ttinclude ファイルを掘り下げて、cmd.CommandTimeout も設定することもできます。

また、特定のテーブルに設定する const は次のとおりです。

const string TABLE_SQL=@"SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' and table_name = 'myTableA' or table_name = 'myTableB'

于 2009-11-05T21:40:34.693 に答える