компьютерный форум
Вернуться   Компьютерный форум > Программирование и вебстроительство > 1C (Все версии) > WEB расширение 1С 8.0


Ответ
 
LinkBack Опции темы Опции просмотра
Старый 14.09.2006, 02:50   #1
Пользователи
 
Регистрация: 14.09.2006
Сообщений: 5
По умолчанию

Вер-расширение 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-соединение?




Sania вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
14.09.2006, 02:50
Техник
реклама
По умолчанию

Старый 14.09.2006, 07:13   #2
Mad
Пользователи
 
Регистрация: 20.07.2006
Сообщений: 168
По умолчанию

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

Для проверки включи трассировку.
Также посмотри в сторону V8.ReleaseComObject.
Mad вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 15.09.2006, 01:25   #3
Пользователи
 
Регистрация: 14.09.2006
Сообщений: 5
По умолчанию

Спасибо большое. натолкнули на правильный путь. нужно было просто "if(!isOpen) ItemDS1.Connection.Close();" сделать до "ItemDS2.Read(PostuRef);". Долго голову ломал.
Sania вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 23.10.2006, 14:39   #4
Пользователи
 
Регистрация: 19.08.2006
Сообщений: 61
Thumbs down

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

Пишу

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

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

}
catch (Exception err)
{

connection.Close();

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

Но соединение остается висеть
подскажите плз что не так делаю
smoln вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 23.10.2006, 15:47   #5
Mad
Пользователи
 
Регистрация: 20.07.2006
Сообщений: 168
По умолчанию

0. Включи трассировку
1. V8.ReleaseComObject используй не в отношении коннекшена, а в отношении объектов, создаваемых/вызываемых при помощи этого коннекшена
2. connection.Close() оставь только в finally
3. Попробуй вложить всё в конструкцию using
4. Коннекшн всё равно может продолжать болтаться в пуле и ты его будешь видеть в консоли сервера предприятия до тех пор, пока не истечет таймаут. Для проверки можешь попробовать очистить пул соединений
Mad вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 27.10.2006, 14:47   #6
Пользователи
 
Регистрация: 19.08.2006
Сообщений: 61
По умолчанию

Цитата:
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);
}
}
smoln вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 22.11.2006, 13:50   #7
Пользователи
 
Регистрация: 16.05.2006
Сообщений: 40
По умолчанию

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

После:

connection.Close();

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

V8DbConnection.ClearPool();

Соединения убиваются наглухо. Проблема пропала и я давно забыл и думать про нее совсем. Может я конечно методологически что-то делаю неправильно, но больше мне ничего не помогло.
Sweex вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 22.11.2006, 15:21   #8
Mad
Пользователи
 
Регистрация: 20.07.2006
Сообщений: 168
По умолчанию

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

После:

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)
Mad вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 25.12.2006, 09:23   #9
Пользователи
 
Регистрация: 16.05.2006
Сообщений: 40
По умолчанию

Как это ни странно звучит прочитав все что ты написал, но абсолютно никаких проблем после ClearPool() я не наблюдаю, ни замедления, ни чего-то подобного, а соединения наглухо пропадают и что самое важное они вообще не висят, т.е. не мешают например обновить конфигурацию. Они пропадают сразу после обращения к базе, а работает все очень быстро. Всем советую
Sweex вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Старый 06.09.2007, 12:35   #10
Пользователи
 
Регистрация: 19.08.2006
Сообщений: 61
По умолчанию

Все очень просто, нужно внимательно освобождать все
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();
}
smoln вне форума  
Digg this Post!Bookmark Post in Technorati
Ответить с цитированием
Ответ


Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Вкл.



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


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