При создании шаблона SubSonic 3.0.0.3 t4 в базе данных lage заканчиваются соединения - PullRequest
2 голосов
/ 31 июля 2009

При запуске шаблонов для базы данных с таблицами более 1400 я получаю следующую ошибку. Сервер показывает сотни соединений. Кто-нибудь знает, если это проблема с генерацией шаблонов вообще или с этими шаблонами конкретно. Другие, меньшие БД генерируют нормально для меня.

Выполнение преобразования: System.InvalidOperationException: Истекло время ожидания. Время ожидания истекло до получения соединения из пула. Это могло произойти из-за того, что все пулы подключений использовались и был достигнут максимальный размер пула.

в System.Data.ProviderBase.DbConnectionFactory.GetConnection (DbConnection owningConnection) в System.Data.ProviderBase.DbConnectionClosed.OpenConnection (DbConnection externalConnection, DbConnectionFactory connectionFactory) в System.Data.SqlClient.SqlConnection.Open () в Microsoft.VisualStudio.TextTemplating8D8967BD3E8719BDA6DD9945992440F1.GeneratedTextTransformation.GetCommand (String sql) в c: \ POS \ POS.Win \ Templates \ SQLServer.ttinclude: строка 13 в Microsoft.VisualStudio.TextTemplating8D8967BD3E8719BDA6DD9945992440F1.GeneratedTextTransformation.LoadFKTables (String tableName) в c: \ POS \ POS.Win \ Templates \ SQLServer.ttinclude: строка 179 в Microsoft.VisualStudio.TextTemplating8D8967BD3E8719BDA6DD9945992440F1.GeneratedTextTransformation.LoadTables () в c: \ POS \ POS.Win \ Templates \ SQLServer.ttinclude: строка 131 в Microsoft.VisualStudio.TextTemplating8D8967BD3E8719BDA6DD9945992440F1.GeneratedTextTransformation.TransformText () в c: \ POS \ POS.Win \ Templates \ ActiveRecord.tt: строка 21

Ответы [ 3 ]

8 голосов
/ 18 ноября 2009

У меня была именно эта проблема с базой данных на 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

1 голос
/ 01 августа 2009

Что ж, я могу предположить, что запуск T4 на 1400 столах, вероятно, не лучшая идея. Учитывая это - вы можете написать код T4 (в SQLServer.tt), чтобы увидеть, как мы загружаем таблицы (в LoadTables) и корректируем соединения по мере необходимости.

1400 сгенерированных классов - было бы интересно угадать размер файла конечного вывода ...

0 голосов
/ 06 ноября 2009

У меня была такая же проблема с очень большой базой данных (много таблиц, представлений и SP). Я добавил следующее в строку подключения web.config для Sql Server 2005: время ожидания подключения = 60;

Кажется, это сработало.

Вы также можете копать файлы .tt и .ttinclude и также устанавливать cmd.CommandTimeout.

Кроме того, вот константа для конкретных таблиц:

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

...