Неожиданная повторная инициализация переменных, объявленных в модуле DLL VB6 - PullRequest
0 голосов
/ 21 декабря 2009

У меня есть DLL-библиотека VB6, встроенная в некоторые страницы ASP. DLL попадает в базу данных Codebase - устаревший и устаревший механизм баз данных (диалект / вариация dBase ), о котором практически никто не слышал. Codebase требуется почти секунда, чтобы инициализировать новое соединение, что недопустимо медленно, и поэтому я создал пул соединений, управляемый классом VB. Единственный экземпляр этого класса создается в начале модуля VB, т. Е .:

Private m_codebaseManager As New CodebaseManager

Моя проблема в том, что периодически снова вызывается метод инициализации класса, что полностью разрушает мой класс пула, и я понятия не имею, почему. Завершение не срабатывает, и нет никаких признаков того, что происходит сбой, так почему же инициализация вызывается? Насколько я понимаю, данные в модулях, не относящихся к классу, сохраняются на протяжении всей жизни DLL. Это правильно, и если нет, то при каких условиях модуль «перезагружается»?

Ответы [ 3 ]

5 голосов
/ 21 декабря 2009

Я бы порекомендовал удалить "New" из объявления переменной. Объявление переменной «Как новой» приводит к тому, что она проверяется каждый раз, когда на нее ссылаются, и, если задано значение «Ничего», будет создан новый экземпляр вашего CodebaseManager.

Лучшим решением было бы объявить вашу переменную следующим образом:

Private m_codebaseManager As CodebaseManager

и затем явно установите его для нового экземпляра при запуске приложения:

Set m_codebaseManager = New CodebaseManager

Это означает, что вы можете быть уверены, что не будете создавать какие-либо непреднамеренные новые экземпляры CodebaseManager. Вероятно, тогда у вас все еще будет ошибка, но, по крайней мере, это будет ошибка «Объект или переменная блока не установлена», которую вы сможете легко исправить.

1 голос
/ 22 декабря 2009

Насколько я понимаю, данные в модулях, не относящихся к классу, сохраняются в течение всего времени жизни DLL. Это правильно, и если нет, то при каких условиях модуль «перезагружается»?

Вроде. Глобальное состояние (модуль public / private vars) зависит от конкретной квартиры и хранится в слотах TLS. VB6 поддерживает только многопоточность, поэтому каждый поток получает «свежую» копию глобального состояния. Поскольку среда ASP является многопоточной, каждый поток получает отдельный пул соединений с БД.

Если вам нужно реальное глобальное состояние, вы должны использовать объект Application для его хранения. Если вы поместите в них многопоточные многопоточные ASP-среды и ухудшите производительность, то вы можете поместить в них многопоточные ASP-объекты. Используйте объекты ADO или объекты Dictionary, или все, что вы уверены, является свободным потоком.

Кстати, вы можете позволить COM + сделать пул объектов / соединений для вас. Если поставщик OLEDB лучше, он также может выполнять пул соединений внутри себя (например, SQLOLEDB для MSSQL).

0 голосов
/ 21 декабря 2009

Но это DLL, а не exe-файл ActiveX, поэтому нет функции Main () и нигде нет строки 'Set m_codebaseManager = New CodebaseManager', кроме как в глобальной области видимости.

...