2015-12-16 2 views
0

Я работаю с программой java, где мне нужно вызвать родную библиотеку, чтобы вызвать другую DLL, которая, в свою очередь, свяжется с какой-либо службой Remote Amailus (служба, связанная с авиакомпанией). Заявление о проблемах: jni dll создает сеанс каждый раз, когда он связывается с удаленной службой, и закрывает сеанс после завершения намеченной задачи. Его очень похоже на подход jdbc, в котором не задействован пул соединений. Теперь кажется, что сеанс фактически не закрывается должным образом, и на конце сервера он в конечном итоге приводит к максимальному исключению сеанса и отказу от любых последующих запросов на соединение. Похоже, что существует некоторая проблема на конце соединения с удаленными службами dll, потому что из кода Java соединение должным образом закрывается, вызывая собственный вызов. Обходное решение: Перезапуск приложения исправляет эту проблему, поскольку он заставляет все открытые соединения закрываться. У нас пока нет доступа к изменению dll, поэтому мы думаем, что если бы у нас был такой же вкус перезапуска jvm, но мы фактически не перезапустили jvm, а повторно подключили (разгрузили и перезагрузили) dll. Здесь мы думаем, что если мы сможем отключить dll, вся память, выделенная для dll, будет очищена и, следовательно, заставит закрыть/собрать открытые сеансы на сервере. Вопрос: Можем ли мы действительно выгрузить, а затем перезагрузить dll без перезапуска jvm?Разгрузка и перезагрузка dll без перезагрузки jvm

Пожалуйста, помогите нам.

Заранее спасибо.

Krgds, Debojit

ответ

0

Вы можете выгрузить его. Однако, вероятно, это небезопасно.

Предполагая, что вы работаете на платформе Windows, не зная деталей DLL, невозможно безопасно выгрузить библиотеку. За документацию для the FreeLibrary function:

Соблюдайте осторожность при вызове FreeLibrary с ручкой возвращенного GetModuleHandle. Функция GetModuleHandle не увеличивает счетчик ссылок , поэтому передача этого дескриптора в FreeLibrary может привести к преждевременному выгрузке модуля.

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

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

Вам необходимо решить эту проблему - не просто попробовать и посмотреть, работают ли они.