Компьютерный форум

Компьютерный форум (/)
-   WEB расширение 1С 8.0 (http://windowsforum.ru/f76/)
-   -   Множество COM-соединений (http://windowsforum.ru/t8279/)

Sania 14.09.2006 02:50

Вер-расширение 8.0.5.3. Такая проблема. есть список документов, при клике на документ открывается форма документа, имеющая 2 V8ObjectDataSource 1 - это сам документ, 2 - это некий связанный с первым документ, который необходимо редактировать на одной форме с первым. у второго снят признак InitializeByRequest, инициализируется програмно. примерно вот так:

Цитата:

private void ItemDS1_OnRead(object source, System.EventArgs e)
{
bool isOpen = ItemDS1.State == ConnectionState.Open;
if(!isOpen) ItemDS1.Connection.Open();
using(ComObject doc = (ComObject)ItemDS1.GetObject())
{
ObjectRef Ob2Ref = (ObjectRef)(V8.Call(ItemDS1.Connection, doc, "НайтиДокумент2"));
if(!Ob2Ref.IsEmpty())
ItemDS2.Read(PostuRef);
ItemDS2.SetDataToForm();
}
if(!isOpen) ItemDS1.Connection.Close();
}
Так вот, после того как выполняется "ItemDS2.Read(PostuRef)" рождается второе Com-соединение. Открываем другой документ - еще Com-соединение, и так далее. Почему не используется имеющееся Com-соединение?

Mad 14.09.2006 07:13

У меня такая ситуация возникала, когда я пытался закрыть и диспозить коннекшн, который имел невысвобожденные комобъекты.

Для проверки включи трассировку.
Также посмотри в сторону V8.ReleaseComObject.

Sania 15.09.2006 01:25

Спасибо большое. натолкнули на правильный путь. нужно было просто "if(!isOpen) ItemDS1.Connection.Close();" сделать до "ItemDS2.Read(PostuRef);". Долго голову ломал.

smoln 23.10.2006 14:39

Хочу удалить Com-соединение

Пишу

V8DbConnection connection = new V8DbConnection(V8Metadata.GetDatabase(ibAlias));
connection.Open();
try
{

// делаю и получаю то,что мне нада

}
catch (Exception err)
{

connection.Close();

}
finally
{
connection.Close();
V8.ReleaseComObject(connection.Connection);
}

Но соединение остается висеть
подскажите плз что не так делаю

Mad 23.10.2006 15:47

0. Включи трассировку
1. V8.ReleaseComObject используй не в отношении коннекшена, а в отношении объектов, создаваемых/вызываемых при помощи этого коннекшена
2. connection.Close() оставь только в finally
3. Попробуй вложить всё в конструкцию using
4. Коннекшн всё равно может продолжать болтаться в пуле и ты его будешь видеть в консоли сервера предприятия до тех пор, пока не истечет таймаут. Для проверки можешь попробовать очистить пул соединений

smoln 27.10.2006 14:47

Цитата:

0. Включи трассировку
1. V8.ReleaseComObject используй не в отношении коннекшена, а в отношении объектов, создаваемых/вызываемых при помощи этого коннекшена
2. connection.Close() оставь только в finally
3. Попробуй вложить всё в конструкцию using
4. Коннекшн всё равно может продолжать болтаться в пуле и ты его будешь видеть в консоли сервера предприятия до тех пор, пока не истечет таймаут. Для проверки можешь попробовать очистить пул соединений
Написал такой код все равно не обрывает

using(V8DbConnection connection = new V8DbConnection(V8Metadata.GetDatabase(ibAlias)))
{
connection.User = (string)Application["WebAdmin"];
connection.Password = (string)Application["WebAdminPsw"];
SetFocus("pwd");

connection.Open();
try
{
DropDownList1.Items.Clear();
object Priemwiki = (object)_1C.V8.Data.V8.Call(connection,connection. Connection, "ФильтрацияПользователей");
decimal CountP = (decimal)_1C.V8.Data.V8.Call(connection, (ComObject)Priemwiki, "Количество", new object[] { });
for (int j = 0; j < CountP; j++)
{
string UserName = (string)_1C.V8.Data.V8.Call(connection, (ComObject)Priemwiki, "Получить", new object[] { j });
DropDownList1.Items.Add(new ListItem(UserName ));

}
V8.ReleaseComObject(Priemwiki);

}
catch (Exception err1)
{

connection.Close();

}
finally
{
V8.TraceComObject.Start();
if (V8.TraceComObject.Count >0)
{
// что здесь делать?
}
V8.TraceComObject.Stop();

connection.Close();

V8.ReleaseComObject(connection);
}
}

Sweex 22.11.2006 13:50

Я долго тоже парился с этими соединениями. В итоге проблему удалось устранить вот каким способом:

После:

connection.Close();

я вставляю всегда:

V8DbConnection.ClearPool();

Соединения убиваются наглухо. Проблема пропала и я давно забыл и думать про нее совсем. Может я конечно методологически что-то делаю неправильно, но больше мне ничего не помогло.

Mad 22.11.2006 15:21

Цитата:

Я долго тоже парился с этими соединениями. В итоге проблему удалось устранить вот каким способом:

После:

connection.Close();

я вставляю всегда:

V8DbConnection.ClearPool();

Соединения убиваются наглухо. Проблема пропала и я давно забыл и думать про нее совсем. Может я конечно методологически что-то делаю неправильно, но больше мне ничего не помогло.
Не совсем правильно.

После connection.close() твой коннекшн, если нет невысвобожденных объектов, попадает в пул соединений. В результате, при следующем обращении пользователя к той же базе, не создается новый коннекшн, а вытаскивается старый из пула. На этом экономится время. Порой существенное. Если тебя напрягает количество соединений в пуле (они ведь тоже жрут лицензии) балуйся параметрами PoolCapacity и PoolTimeout в Web.config. В результате для активных пользователей их коннекшены будут оперативно подтягиваться, а редкий гость должен будет подождать.

V8DbConnection.ClearPool() убивает пул намертво (если не ошибаюсь, то не только того приложения, из которого вызвана данная функция, но всех, запущенных на вэб-узле). И без того нешустрое вэбрасширение после такой операции будет вынуждено каждый раз(!) открывать соединение (читай тянуть и компилить конфу). Не уверен, что это хорошо.

В данной же ветке описана ситуация, когда коннекшн не может быть закрыт корректно. И он не закрывается и не попадает в пул. В результате при следующих обращениях того же пользователя он, коннекшн, не используется, а создается новый. Такая беда возникает в случаях, когда посредством данного коннекшена из 1С вытаскивается некоторый ComObject и не высвобождается до закрытия коннекшена. Для вылавливания таких ситуаций и используется Трассировка высвобождения Com-объектов (1С:Предприятие 8.0 Web-расширение 1.1 Руководство по установке и использованию, Москва, 2005, номер издания 80.010.01, стр. 209)

Sweex 25.12.2006 09:23

Как это ни странно звучит прочитав все что ты написал, но абсолютно никаких проблем после ClearPool() я не наблюдаю, ни замедления, ни чего-то подобного, а соединения наглухо пропадают и что самое важное они вообще не висят, т.е. не мешают например обновить конфигурацию. Они пропадают сразу после обращения к базе, а работает все очень быстро. Всем советую

smoln 06.09.2007 12:35

Все очень просто, нужно внимательно освобождать все
Com-объекты

Пример:


try
{
if(ItemDataSource.Connection.State == System.Data.ConnectionState.Closed)
ItemDataSource.Connection.Open();
object Arr = (object)_1C.V8.Data.V8.Call(ItemDataSource.Connect ion,ItemDataSource.Connection. Connection,"ПоискТовараВСправочникеЦен", arrPar);
Label7.Text = (string)_1C.V8.Data.V8.Get(ItemDataSource.Connecti on, (ComObject)Arr, "Единица");


// те самые освобождающие строки!
ComObject TekObject = (ComObject)Arr;
TekObject.Dispose();

}
catch(Exception err)
{
ItemDataSource.Connection.Close();
}
finally
{
ItemDataSource.Connection.Close();
}


Текущее время: 02:33. Часовой пояс GMT.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot
Content Relevant URLs by vBSEO 3.5.0 RC2