В моем настольном приложении новые базы данных открываются довольно часто. Я использую Hibernate
/JPA
как ОРМ. Проблема в том, что создание EntityManagerFactory
происходит довольно медленно, примерно на 5-6 секунд на быстрой машине. Я знаю, что EntityManagerFactory
должен быть тяжеловесным, но это слишком медленно для настольного приложения, где пользователь ожидает, что новая база данных будет быстро открыта.Hibernate быстрее Создание EntityManagerFactory
Могу ли я отключить некоторые EntityManagerFactory функции, чтобы получить экземпляр быстрее? Или можно лениво создать некоторую часть EntityManagerFactory, чтобы ускорить разбивку?
Могу ли я каким-то образом создать объект EntityManagerFactory до зная адрес базы данных? Я был бы рад отключить все проверки , чтобы это было возможно.
Посредством этого можно ли использовать EntityManagerFactory для последующего использования?
Любая другая идея, как создать EntityManagerFactory быстрее?
Обновления с большим количеством информации и JProfiler профилирования
настольного приложения может открыть сохраненные файлы. Формат файла документа приложения составляет 1 базу данных SQLite + и некоторые двоичные данные в ZIP-файле. При открытии документа ZIP извлекается, а db открывается с помощью Hibernate. Все базы данных имеют одну и ту же схему, но разные данные.
Кажется, что при первом открытии файла он занимает значительно больше времени, чем в следующие моменты времени. Я профилировал первый и второй пробег с JProfiler и сравнивал результаты.
первый Пробег:
create EMF: 4385ms
build EMF: 3090ms
EJB3Configuration configure: 900ms
EJB3Configuration <clinit>: 380ms
.
второй Пробег:
create EMF: 1275ms
build EMF: 970ms
EJB3Configuration configure: 305ms
EJB3Configuration <clinit>: not visible, probably 0ms
.
В сравнении вызовов дерева вы можете увидеть, что некоторые методы значительно быстрее (DatabaseManager в качестве отправной точки.):
create EMF: -3120ms
Hibernate create EMF: -3110ms
EJB3Configuration configure: -595ms
EJB3Configuration <clinit>: -380ms
build EMF: -2120ms
buildSessionFactory: -1945ms
secondPassCompile: -425ms
buildSettings: -346ms
SessionFactoryImpl.<init>: -1040ms
Горячее сравнение пятно теперь имеет интересные результаты:
.
ClassLoader.loadClass: -1686ms
XMLSchemaFactory.newSchema: -184ms
ClassFile.<init>: -109ms
Я не уверен, что это загрузка классов Hibernate или моих классов Entity.
Первым улучшением было бы создание EMF, как только приложение начнет просто инициализировать все необходимые классы (у меня есть пустой файл db в качестве прототипа, уже поставляемого вместе с моим приложением)[email protected] благодарит вас за ответ, возможно, DeferredConnectionProvider уже будет решением этой проблемы.
Я попробую DeferredConnectionProvider дальше! Но мы могли бы ускорить его еще больше. У вас есть еще предложения?
Являются ли ваши сопоставления базы данных в XML или аннотациях? –
У меня есть 'hibernate.cfg.xml' с отображениями. Классы полномочий аннотируются. Тогда, когда я знаю URL-адрес databese, я также предоставляю строку свойств при создании EnitityManagerFactory.Он построен следующим образом: 'Map properties = new HashMap (); \t properties.put ("javax.persistence.jdbc.url", JDBC.PREFIX + dbFile.getAbsolutePath()); ' Я открыт, чтобы изменить это, если я ускоряю создание EntityManagerFactory. Какие-либо предложения? –
user643011
, в этом случае вы получите улучшение производительности, если вы удаляетесь от аннотаций и _only_ используйте xml для определения своих сопоставлений. Сканирование классов и поиск аннотаций происходит медленнее, чем просто чтение xml –