[an error occurred while processing this directive] IT • archiv :: Print

IT • archiv


[an error occurred while processing this directive]

[an error occurred while processing this directive]

Оптимизация загрузки классов

[an error occurred while processing this directive](none) [an error occurred while processing this directive](none)[an error occurred while processing this directive] ::
[an error occurred while processing this directive](none)
[an error occurred while processing this directive]([an error occurred while processing this directive] Максим Парыгин [an error occurred while processing this directive])

[an error occurred while processing this directive](none)
PDF versionPDF версия

В этой статье вы познакомитесь с оптимизацией загрузки классов с помощью базы данных.

По умолчанию JRE загружает классы посредством специальных классов — загрузчиков (classloaders). Происходит это следующим образом. У загрузчика класса запрашивается (например, посредством метода loadClass) экземпляр класса Class для необходимого класса. Загрузчик ищет класс в jar файлах, указанных в командной строке, и в файловой системе. Если необходимый файл с расширением .class будет найден — загрузчик вернет созданный по файлу экземпляр оболочки класса (Экземпляр Class), если нет — выбросит исключение.

Теперь займемся подсчетами. Каждый jar файл требует распаковки (если сжат). Время уходит на поиск файла, на его извлечение. Тут же выявляется еще один эффект. Поиск происходит последовательно в jar, в том порядке который был задан с командной строки. В командной строке их может быть порядка одного — двух десятков. Еще более тяжелая ситуация возникает когда приходится производить поиск в файловой системе — тут поиск может зятянуться на десятые доли секунды.

Простейшим выходом может оказаться использование базы данных — такой же подход используется Oracle для загрузки классов. В простейшем случае необходимо создать таблицу в базе данных. Таблица должна иметь поле наименования (полного имени класса включая пакеты) — индексированного и уникального поля, и поле blob для хранения непосредственно байт-кода. Нам еще понадобится новый classloader умеющий работать с нашей базой. В случае использования базы как носителя классов загрузка происходит следующим образом. При запросе класса происходит обращение к базе данных. База данных производит поиск в индексе необходимого имени. Выбирается байтовый массив, из которого и формируется облочка класса. В большинстве случаев поиск в одной таблице будет произведен гораздо быстрей множества поисков в файлах и файловой системе. В довесок ко всему база байт-кода может использоваться несколькими клиентами — что может, например, применяться для централизованного управления версиями приложения.

Теперь практика

Заключение

Наш загрузчик обладает несколькими очевидными недостатками. Самый существенный — для загрузки каждого класса создается отдельное соединение с базой. Можно использовать постоянное соединение или использовать пул соединений с базой данных (при использовании пула не забудьте сделать метод loadClass асинхронным — если Вы будете использовать многопоточную загрузку классов). Также можно инициализировать параметры соединения с базой в конструкторе загрузчика. Еще одним существенным недостатком является явная загрузка — вместо неявной через статические методы класса Class. Для этого придется переделать загрузчик, чтобы он в случае ненахождения класса пытался загрузить класс следующим загрузчиком. Также, в командной строке нужно будет указать опцию -Djava.system.class.loader=sqlClassLoader чтобы JVM использовала ваш загрузчик первым. Помимо этого придется справиться с ситуацией рекурсивного вызова драйвера самого себя, когда драйверу при инициализации понадобятся определенные классы. И последнее — наш загрузчик не загружает двоичные ресурсы — добавить эту возможность не составит никакого труда.

Ресурсы

[an error occurred while processing this directive]
[an error occurred while processing this directive](none)
< Вернуться на caйт :: Copyright © 1999 — 2010, IT • archiv.