2009-07-31 16 views
2

1400+テーブルを持つデータベースに対してテンプレートを実行すると、次のエラーが発生します。サーバーは何百もの接続を表示します。これが一般的なテンプレート生成の問題であるか、これらのテンプレート固有の問題であるかは誰にも分かりません。他の小さなDBは私のために大丈夫です。SubSonic 3.0.0.3 t4 lageデータベースのテンプレート生成で接続が切れた

実行中の変換:System.InvalidOperationException:タイムアウトが切れています。プールから接続を取得する前にタイムアウト期間が経過しています。これは、プールされたすべての接続が使用中で、プールの最大サイズに達したために発生した可能性があります。 System.Data.ProviderBase.DbConnectionClosed.OpenConnection System.Data.SqlClient.SqlConnection.Openで(たDbConnection outerConnection、DbConnectionFactoryはconnectionFactory) () でSystem.Data.ProviderBase.DbConnectionFactory.GetConnection(たDbConnection owningConnection) で

\ POS \ POS.Win \テンプレート\ SQLServer.ttinclude:CでMicrosoft.VisualStudio.TextTemplating8D8967BD3E8719BDA6DD9945992440F1.GeneratedTextTransformation.GetCommand(文字列のSQL)において線CでMicrosoft.VisualStudio.TextTemplating8D8967BD3E8719BDA6DD9945992440F1.GeneratedTextTransformation.LoadFKTables(文字列tableNameの)で13 。 \ POS \ POS.Win \ Templates \ SQLServer.ttinclude:行179 、Microsoft.VisualStudio.TextTemplating8D8967BD3E8719BDA6DD9945992440F1.Genera CにおけるtedTextTransformation.LoadTables():\ POS \ POS.Win \テンプレート\ SQLServer.ttinclude:ライン131 Microsoft.VisualStudio.TextTemplating8D8967BD3E8719BDA6DD9945992440F1.GeneratedTextTransformation.TransformTextでは、()はC:\ POS \ POS.Win \テンプレート\のActiveRecord。 tt:line 21

答えて

1

まあ、私は、1400テーブルでT4を動かすことはおそらく最良の方法ではないことを示唆しているかもしれません。それを考えると、T4コードを(SQLServer.ttの)T4コードでspelunkして、テーブルをLoadTableにロードし、必要に応じて接続を調べることができます。生成された

1400クラス - 最終的な出力のファイルサイズを推測するために楽しいだろう...

+0

SubSonic 2.1はそれをうまく処理しました。 – jcomet

+0

異なるapp_domainと異なるコードです。私が言及したように、コードはT4テンプレートの中にあります。あなたの1400テーブルを最適化してください:) –

+0

もちろん、あなたは正しいと思います。本当にありがとうございます。 – jcomet

0

私は非常に大規模なデータベース(テーブルのたくさんの、ビュー、およびSPS)と、これと同じ問題を抱えていました。私はSql Server 2005のために私のweb.config接続文字列に以下を追加しました - Connect Timeout = 60;

これはやっているようです。

また、.ttと.ttincludeファイルを調べて、cmd.CommandTimeoutを設定することもできます。 「@

のconst文字列TABLE_SQL =がINFORMATION_SCHEMA.TABLES TABLE_TYPE = 'ベーステーブル' とTABLE_NAME = 'myTableA' またはTABLE_NAME = * FROM を選択します。また、

は、ここでは、特定のテーブルに対して設定するのconstです。

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

はこれにそれを変更:「myTableB」

8

は、私は250テーブルデータベースでこの正確な問題を抱えていたSQLServer.ttincludeチャンスをうかがっ、私はこれを見つけた

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を理解するのに時間を費やすことができたら、この修正を亜音速プロジェクトに投稿します。:-D

+0

ちょうど私が必要なawesomeness :) –

+0

非常に有用な、感謝! – Jemes

+0

ここで "if(table ==" tbl_Address ")の意義は何ですか? –

関連する問題