Есть ли способ ускорить загрузку контейнера Embedded EJB? - PullRequest
6 голосов
/ 10 января 2012

Я делаю свое первое веб-приложение на Java EE, используя Glassfish и NetBeans. Когда я создаю модульный тест, для которого требуется встроенный EJB-контейнер, загрузка может занять около 30 секунд. Я подумал, что это вполне понятно, поскольку он «подражает» серверу Glassfish. Но потом я наткнулся на эту статью от Адама Бина, где говорится:

Весь тест с загрузкой контейнера занимает на моей машине около 5 секунд.

http://www.adam -bien.com / ролик / abien / запись / embedding_ejb_3_1_container

Так что я должен предположить, что что-то не настроено правильно. Я использую Linux Mint 12, мой проект использует базу данных MySQL, и мой компьютер имеет двухъядерный процессор 2 ГГц, 4 ГБ ОЗУ. Большинство всего использует настройки по умолчанию из установки netbeans. (Я заказал новый процессор, который переместит CPU Benchmark с 1700 до 7800 согласно cpubenchmark.net)

Что можно сделать для повышения скорости загрузки встроенного EJB-контейнера?

глядя на вывод, основной виновник выглядит так:

org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA

Вот полный вывод:

Jan 9, 2012 5:01:57 PM com.sun.enterprise.v3.server.CommonClassLoaderServiceImpl findDerbyClient INFO: Cannot find javadb client jar file, derby jdbc driver will not be available by default.
Jan 9, 2012 5:01:59 PM org.glassfish.ha.store.spi.BackingStoreFactoryRegistry register INFO: Registered org.glassfish.ha.store.adapter.cache.ShoalBackingStoreProxy for persistence-type = replicated in BackingStoreFactoryRegistry
Jan 9, 2012 5:02:00 PM com.sun.enterprise.v3.server.AppServerStartup run INFO: GlassFish Server Open Source Edition 3.1.1 (12) startup time : Embedded (1,476ms), startup services(2,053ms), total(3,529ms)
Jan 9, 2012 5:02:00 PM org.glassfish.admin.mbeanserver.JMXStartupService$JMXConnectorsStarterThread run INFO: JMXStartupService: JMXConnector system is disabled, skipping.
Jan 9, 2012 5:02:02 PM org.glassfish.admin.mbeanserver.JMXStartupService shutdown INFO: JMXStartupService and JMXConnectors have been shut down.
Jan 9, 2012 5:02:02 PM com.sun.enterprise.v3.server.AppServerStartup stop INFO: Shutdown procedure finished
Jan 9, 2012 5:02:02 PM AppServerStartup run INFO: [Thread[GlassFish Kernel Main Thread,5,main]] exiting
Jan 9, 2012 5:02:02 PM org.glassfish.ha.store.spi.BackingStoreFactoryRegistry register INFO: Registered org.glassfish.ha.store.adapter.cache.ShoalBackingStoreProxy for persistence-type = replicated in BackingStoreFactoryRegistry
Jan 9, 2012 5:02:02 PM com.sun.enterprise.v3.server.AppServerStartup run INFO: GlassFish Server Open Source Edition 3.1.1 (12) startup time : Embedded (5,874ms), startup services(150ms), total(6,024ms)
Jan 9, 2012 5:02:02 PM org.glassfish.admin.mbeanserver.JMXStartupService$JMXConnectorsStarterThread run INFO: JMXStartupService: JMXConnector system is disabled, skipping.
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.EJBContainerProviderImpl skipJar INFO: ... skipping entry with a Manifest file with a special attribute: glassfish-embedded-static-shell.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding EJB module to ScatteredArchive classes
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive mysql-connector-java-5.1.13-bin.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive commons-codec-1.6.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive commons-codec-1.6-bin.zip
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive ant.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive primefaces-3.0.RC2.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive ant-junit.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive log4j-1.2.15.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive classes
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.DeploymentElement getOrCreateApplication INFO: [DeploymentElement] adding library to ScatteredArchive junit-4.8.2.jar
Jan 9, 2012 5:02:03 PM org.glassfish.ejb.embedded.EJBContainerImpl deploy INFO: [EJBContainerImpl] Deploying app: org.glassfish.embeddable.archive.ScatteredArchive@1ebafda6
Jan 9, 2012 5:02:08 PM org.hibernate.validator.util.Version <clinit> INFO: Hibernate Validator 4.1.0.Final
Jan 9, 2012 5:02:09 PM org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
Jan 9, 2012 5:02:15 PM com.sun.enterprise.security.SecurityLifecycle <init> INFO: SEC1002: Security Manager is OFF.
Jan 9, 2012 5:02:15 PM com.sun.enterprise.security.SecurityLifecycle onInitialization INFO: SEC1010: Entering Security Startup Service
Jan 9, 2012 5:02:15 PM com.sun.enterprise.security.PolicyLoader loadPolicy INFO: SEC1143: Loading policy provider com.sun.enterprise.security.provider.PolicyWrapper.
Jan 9, 2012 5:02:15 PM com.sun.enterprise.security.auth.realm.Realm doInstantiate INFO: SEC1115: Realm [admin-realm] of classtype [com.sun.enterprise.security.auth.realm.file.FileRealm] successfully created.
Jan 9, 2012 5:02:15 PM com.sun.enterprise.security.auth.realm.Realm doInstantiate INFO: SEC1115: Realm [file] of classtype [com.sun.enterprise.security.auth.realm.file.FileRealm] successfully created.
Jan 9, 2012 5:02:15 PM com.sun.enterprise.security.auth.realm.Realm doInstantiate INFO: SEC1115: Realm [certificate] of classtype [com.sun.enterprise.security.auth.realm.certificate.CertificateRealm] successfully created.
Jan 9, 2012 5:02:15 PM com.sun.enterprise.security.SecurityLifecycle onInitialization INFO: SEC1011: Security Service(s) Started Successfully
Jan 9, 2012 5:02:17 PM org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
Jan 9, 2012 5:02:26 PM org.hibernate.validator.engine.resolver.DefaultTraversableResolver detectJPA INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver.
Jan 9, 2012 5:02:26 PM org.eclipse.persistence.session.file:/tmp/gfembed2576733372934037196tmp/applications/classes/_REMPU INFO: EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504
Jan 9, 2012 5:02:29 PM org.eclipse.persistence.session.file:/tmp/gfembed2576733372934037196tmp/applications/classes/_REMPU INFO: file:/tmp/gfembed2576733372934037196tmp/applications/classes/_REMPU login successful
...

Спасибо

Ответы [ 2 ]

2 голосов
/ 11 января 2012

Вы можете попробовать другой EJBContainer impl.

Время тестирования OpenEJB Embedded EJBContainer находится в диапазоне 1 секунда. Он поддерживает дескрипторы GlassFish - мы используем их вместо своих собственных, когда запускаем TCK Java EE, поскольку нам лень писать несколько тысяч дескрипторов, которые нам понадобятся, и TCK уже поставляется с полными дескрипторами GlassFish.

В качестве альтернативы, возможно, стоит попробовать совсем другой подход.

Чтобы узнать больше о стиле модульного теста, проверьте это: https://stackoverflow.com/a/8716630/190816 То есть создайте приложение в тестовом примере и при необходимости добавьте немного насмешек.

1 голос
/ 11 января 2012

Вот что я сделал до сих пор, и мой цикл испытаний сократился до 13 с.

1) Модернизировал мои процессоры.Я перешел с одного двухъядерного 2Ghz на два четырехъядерных 2.5Ghz, который сбил около 5 с.

2) Вручную сконфигурировал файлы сборки, честно говоря, я не до конца понимаю, почему это так важно, ноон сбрил почти 10 с.http://netbeans.org/kb/docs/javaee/javaee-entapp-junit.html#Exercise_1d

Map<String, Object> properties = new HashMap<String, Object>();
// Use the MODULES property to specify the set of modules to be initialized,
// in this case a java.io.File 
properties.put(EJBContainer.MODULES, new File("build/jar"));

3) Изменен файл persistence.xml, чтобы НЕ создавать таблицы базы данных.Мне просто нужно включить его снова при внесении изменений в структуру объекта.

Но цифры немного ошибочны и простите, если я не собираюсь тратить время на надлежащий статистический анализ.Когда я включаю постоянную таблицу «create» и возвращаюсь к базовой автоматической настройке, она запускается в 16 секунд.Но до появления процессоров у меня было до 18 лет.Так что цифры не совсем складываются.

Мне также было чрезвычайно приятно получить предложение от Адама Бьена.Я спросил его, не желает ли он написать статью на эту тему.Он сказал, что она подробно описана в этой статье, а более подробную информацию можно найти в его книге и другой статье:

...